File Index
Files and directories
Sign in
FILE

nf_conntrack_sip.h

File preview with syntax highlighting.

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