#ifndef __NF_CONNTRACK_SIP_H__ #define __NF_CONNTRACK_SIP_H__ #ifdef __KERNEL__ #define SIP_PORT 5060 #define SIP_TIMEOUT 3600 enum sip_header_pos { POS_REG_REQ_URI, POS_REQ_URI, POS_FROM, POS_TO, POS_VIA, POS_CONTACT, POS_CONTENT, }; struct sip_header { const char *name; const char *cname; const char *search; unsigned int len; unsigned int clen; unsigned int slen; int (*match_len)(const struct nf_conn *ct, const char *dptr, const char *limit, int *shift); }; #define __SIP_HDR(__name, __cname, __search, __match) \ { \ .name = (__name), \ .len = sizeof(__name) - 1, \ .cname = (__cname), \ .clen = (__cname) ? sizeof(__cname) - 1 : 0, \ .search = (__search), \ .slen = (__search) ? sizeof(__search) - 1 : 0, \ .match_len = (__match), \ } #define SDP_HDR(__name, __search, __match) \ __SIP_HDR(__name, NULL, __search, __match) enum sdp_header_types { SDP_HDR_UNSPEC, SDP_HDR_VERSION, SDP_HDR_OWNER_IP4, SDP_HDR_CONNECTION_IP4, SDP_HDR_OWNER_IP6, SDP_HDR_CONNECTION_IP6, SDP_HDR_MEDIA, }; extern unsigned int (*nf_nat_sip_hook)(struct sk_buff *skb, const char **dptr, unsigned int *datalen); extern unsigned int (*nf_nat_sdp_hook)(struct sk_buff *skb, const char **dptr, unsigned int *datalen, struct nf_conntrack_expect *exp); extern int ct_sip_get_info(const struct nf_conn *ct, const char *dptr, size_t dlen, unsigned int *matchoff, unsigned int *matchlen, enum sip_header_pos pos); extern int ct_sip_lnlen(const char *line, const char *limit); extern const char *ct_sip_search(const char *needle, const char *haystack, size_t needle_len, size_t haystack_len, int case_sensitive); extern int ct_sip_get_sdp_header(const struct nf_conn *ct, const char *dptr, unsigned int dataoff, unsigned int datalen, enum sdp_header_types type, enum sdp_header_types term, unsigned int *matchoff, unsigned int *matchlen); #endif /* __KERNEL__ */ #endif /* __NF_CONNTRACK_SIP_H__ */