Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / include / linux / netfilter / nf_conntrack_sip.h
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
13 struct nf_ct_sip_master {
14         unsigned int    register_cseq;
15         unsigned int    invite_cseq;
16         __be16          forced_dport;
17 };
18
19 enum 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
28 struct 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
41 struct 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
62 struct 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
91 enum 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
103 enum 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
111 struct 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 };
168 extern const struct nf_nat_sip_hooks *nf_nat_sip_hooks;
169
170 int 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);
174 int 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);
178 int 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);
183 int 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);
188 int 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
193 int 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__ */