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 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 90 enum 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 102 enum 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 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 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); 177 int 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); 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 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__ */ 199