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