linux/include/linux/netfilter/nf_conntrack_sip.h
<<
>>
Prefs
   1#ifndef __NF_CONNTRACK_SIP_H__
   2#define __NF_CONNTRACK_SIP_H__
   3#ifdef __KERNEL__
   4
   5#include <net/netfilter/nf_conntrack_expect.h>
   6
   7#define SIP_PORT        5060
   8#define SIP_TIMEOUT     3600
   9
  10struct nf_ct_sip_master {
  11        unsigned int    register_cseq;
  12        unsigned int    invite_cseq;
  13};
  14
  15enum sip_expectation_classes {
  16        SIP_EXPECT_SIGNALLING,
  17        SIP_EXPECT_AUDIO,
  18        SIP_EXPECT_VIDEO,
  19        SIP_EXPECT_IMAGE,
  20        __SIP_EXPECT_MAX
  21};
  22#define SIP_EXPECT_MAX  (__SIP_EXPECT_MAX - 1)
  23
  24struct sdp_media_type {
  25        const char                      *name;
  26        unsigned int                    len;
  27        enum sip_expectation_classes    class;
  28};
  29
  30#define SDP_MEDIA_TYPE(__name, __class)                                 \
  31{                                                                       \
  32        .name   = (__name),                                             \
  33        .len    = sizeof(__name) - 1,                                   \
  34        .class  = (__class),                                            \
  35}
  36
  37struct sip_handler {
  38        const char      *method;
  39        unsigned int    len;
  40        int             (*request)(struct sk_buff *skb, unsigned int protoff,
  41                                   unsigned int dataoff,
  42                                   const char **dptr, unsigned int *datalen,
  43                                   unsigned int cseq);
  44        int             (*response)(struct sk_buff *skb, unsigned int protoff,
  45                                    unsigned int dataoff,
  46                                    const char **dptr, unsigned int *datalen,
  47                                    unsigned int cseq, unsigned int code);
  48};
  49
  50#define SIP_HANDLER(__method, __request, __response)                    \
  51{                                                                       \
  52        .method         = (__method),                                   \
  53        .len            = sizeof(__method) - 1,                         \
  54        .request        = (__request),                                  \
  55        .response       = (__response),                                 \
  56}
  57
  58struct sip_header {
  59        const char      *name;
  60        const char      *cname;
  61        const char      *search;
  62        unsigned int    len;
  63        unsigned int    clen;
  64        unsigned int    slen;
  65        int             (*match_len)(const struct nf_conn *ct,
  66                                     const char *dptr, const char *limit,
  67                                     int *shift);
  68};
  69
  70#define __SIP_HDR(__name, __cname, __search, __match)                   \
  71{                                                                       \
  72        .name           = (__name),                                     \
  73        .len            = sizeof(__name) - 1,                           \
  74        .cname          = (__cname),                                    \
  75        .clen           = (__cname) ? sizeof(__cname) - 1 : 0,          \
  76        .search         = (__search),                                   \
  77        .slen           = (__search) ? sizeof(__search) - 1 : 0,        \
  78        .match_len      = (__match),                                    \
  79}
  80
  81#define SIP_HDR(__name, __cname, __search, __match) \
  82        __SIP_HDR(__name, __cname, __search, __match)
  83
  84#define SDP_HDR(__name, __search, __match) \
  85        __SIP_HDR(__name, NULL, __search, __match)
  86
  87enum sip_header_types {
  88        SIP_HDR_CSEQ,
  89        SIP_HDR_FROM,
  90        SIP_HDR_TO,
  91        SIP_HDR_CONTACT,
  92        SIP_HDR_VIA_UDP,
  93        SIP_HDR_VIA_TCP,
  94        SIP_HDR_EXPIRES,
  95        SIP_HDR_CONTENT_LENGTH,
  96        SIP_HDR_CALL_ID,
  97};
  98
  99enum sdp_header_types {
 100        SDP_HDR_UNSPEC,
 101        SDP_HDR_VERSION,
 102        SDP_HDR_OWNER,
 103        SDP_HDR_CONNECTION,
 104        SDP_HDR_MEDIA,
 105};
 106
 107extern unsigned int (*nf_nat_sip_hook)(struct sk_buff *skb,
 108                                       unsigned int protoff,
 109                                       unsigned int dataoff,
 110                                       const char **dptr,
 111                                       unsigned int *datalen);
 112extern void (*nf_nat_sip_seq_adjust_hook)(struct sk_buff *skb,
 113                                          unsigned int protoff, s16 off);
 114extern unsigned int (*nf_nat_sip_expect_hook)(struct sk_buff *skb,
 115                                              unsigned int protoff,
 116                                              unsigned int dataoff,
 117                                              const char **dptr,
 118                                              unsigned int *datalen,
 119                                              struct nf_conntrack_expect *exp,
 120                                              unsigned int matchoff,
 121                                              unsigned int matchlen);
 122extern unsigned int (*nf_nat_sdp_addr_hook)(struct sk_buff *skb,
 123                                            unsigned int protoff,
 124                                            unsigned int dataoff,
 125                                            const char **dptr,
 126                                            unsigned int *datalen,
 127                                            unsigned int sdpoff,
 128                                            enum sdp_header_types type,
 129                                            enum sdp_header_types term,
 130                                            const union nf_inet_addr *addr);
 131extern unsigned int (*nf_nat_sdp_port_hook)(struct sk_buff *skb,
 132                                            unsigned int protoff,
 133                                            unsigned int dataoff,
 134                                            const char **dptr,
 135                                            unsigned int *datalen,
 136                                            unsigned int matchoff,
 137                                            unsigned int matchlen,
 138                                            u_int16_t port);
 139extern unsigned int (*nf_nat_sdp_session_hook)(struct sk_buff *skb,
 140                                               unsigned int protoff,
 141                                               unsigned int dataoff,
 142                                               const char **dptr,
 143                                               unsigned int *datalen,
 144                                               unsigned int sdpoff,
 145                                               const union nf_inet_addr *addr);
 146extern unsigned int (*nf_nat_sdp_media_hook)(struct sk_buff *skb,
 147                                             unsigned int protoff,
 148                                             unsigned int dataoff,
 149                                             const char **dptr,
 150                                             unsigned int *datalen,
 151                                             struct nf_conntrack_expect *rtp_exp,
 152                                             struct nf_conntrack_expect *rtcp_exp,
 153                                             unsigned int mediaoff,
 154                                             unsigned int medialen,
 155                                             union nf_inet_addr *rtp_addr);
 156
 157extern int ct_sip_parse_request(const struct nf_conn *ct,
 158                                const char *dptr, unsigned int datalen,
 159                                unsigned int *matchoff, unsigned int *matchlen,
 160                                union nf_inet_addr *addr, __be16 *port);
 161extern int ct_sip_get_header(const struct nf_conn *ct, const char *dptr,
 162                             unsigned int dataoff, unsigned int datalen,
 163                             enum sip_header_types type,
 164                             unsigned int *matchoff, unsigned int *matchlen);
 165extern int ct_sip_parse_header_uri(const struct nf_conn *ct, const char *dptr,
 166                                   unsigned int *dataoff, unsigned int datalen,
 167                                   enum sip_header_types type, int *in_header,
 168                                   unsigned int *matchoff, unsigned int *matchlen,
 169                                   union nf_inet_addr *addr, __be16 *port);
 170extern int ct_sip_parse_address_param(const struct nf_conn *ct, const char *dptr,
 171                                      unsigned int dataoff, unsigned int datalen,
 172                                      const char *name,
 173                                      unsigned int *matchoff, unsigned int *matchlen,
 174                                      union nf_inet_addr *addr, bool delim);
 175extern int ct_sip_parse_numerical_param(const struct nf_conn *ct, const char *dptr,
 176                                        unsigned int off, unsigned int datalen,
 177                                        const char *name,
 178                                        unsigned int *matchoff, unsigned int *matchen,
 179                                        unsigned int *val);
 180
 181extern int ct_sip_get_sdp_header(const struct nf_conn *ct, const char *dptr,
 182                                 unsigned int dataoff, unsigned int datalen,
 183                                 enum sdp_header_types type,
 184                                 enum sdp_header_types term,
 185                                 unsigned int *matchoff, unsigned int *matchlen);
 186
 187#endif /* __KERNEL__ */
 188#endif /* __NF_CONNTRACK_SIP_H__ */
 189