Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
nf_conntrack_sip.h
Go to the documentation of this file.
1 #ifndef __NF_CONNTRACK_SIP_H__
2 #define __NF_CONNTRACK_SIP_H__
3 #ifdef __KERNEL__
4 
6 
7 #define SIP_PORT 5060
8 #define SIP_TIMEOUT 3600
9 
10 struct nf_ct_sip_master {
11  unsigned int register_cseq;
12  unsigned int invite_cseq;
13 };
14 
15 enum 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 
24 struct 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 
37 struct 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 
58 struct 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 
87 enum 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 
99 enum 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 
107 extern 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);
112 extern void (*nf_nat_sip_seq_adjust_hook)(struct sk_buff *skb,
113  unsigned int protoff, s16 off);
114 extern 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);
122 extern 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);
131 extern 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);
139 extern 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);
146 extern 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 
157 extern 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);
161 extern 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);
165 extern 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);
170 extern 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);
175 extern 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 
181 extern 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__ */