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