| 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 |  | 
|---|
| 12 | struct nf_ct_sip_master { | 
|---|
| 13 | unsigned int	register_cseq; | 
|---|
| 14 | unsigned int	invite_cseq; | 
|---|
| 15 | __be16		forced_dport; | 
|---|
| 16 | }; | 
|---|
| 17 |  | 
|---|
| 18 | enum 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 |  | 
|---|
| 27 | struct 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 |  | 
|---|
| 40 | struct 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 |  | 
|---|
| 61 | struct  { | 
|---|
| 62 | const char	*; | 
|---|
| 63 | const char	*; | 
|---|
| 64 | const char	*; | 
|---|
| 65 | unsigned int	; | 
|---|
| 66 | unsigned int	; | 
|---|
| 67 | unsigned int	; | 
|---|
| 68 | int		(*)(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 |  | 
|---|
| 90 | enum  { | 
|---|
| 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 |  | 
|---|
| 102 | enum  { | 
|---|
| 103 | SDP_HDR_UNSPEC, | 
|---|
| 104 | SDP_HDR_VERSION, | 
|---|
| 105 | SDP_HDR_OWNER, | 
|---|
| 106 | SDP_HDR_CONNECTION, | 
|---|
| 107 | SDP_HDR_MEDIA, | 
|---|
| 108 | }; | 
|---|
| 109 |  | 
|---|
| 110 | struct 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 | }; | 
|---|
| 167 | extern const struct nf_nat_sip_hooks __rcu *nf_nat_sip_hooks; | 
|---|
| 168 |  | 
|---|
| 169 | int 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); | 
|---|
| 173 | int (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); | 
|---|
| 177 | int (const struct nf_conn *ct, const char *dptr, | 
|---|
| 178 | unsigned int *dataoff, unsigned int datalen, | 
|---|
| 179 | enum sip_header_types type, int *, | 
|---|
| 180 | unsigned int *matchoff, unsigned int *matchlen, | 
|---|
| 181 | union nf_inet_addr *addr, __be16 *port); | 
|---|
| 182 | int 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); | 
|---|
| 187 | int 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 |  | 
|---|
| 192 | int (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__ */ | 
|---|
| 199 |  | 
|---|