#ifndef __NF_CONNTRACK_SIP_H__ #define __NF_CONNTRACK_SIP_H__ #ifdef __KERNEL__ #define SIP_PORT 5060 #define SIP_TIMEOUT 3600 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 SIP_HDR(__name, __cname, __search, __match) \ __SIP_HDR(__name, __cname, __search, __match) #define SDP_HDR(__name, __search, __match) \ __SIP_HDR(__name, NULL, __search, __match) enum sip_header_types { SIP_HDR_FROM, SIP_HDR_TO, SIP_HDR_CONTACT, SIP_HDR_VIA, SIP_HDR_CONTENT_LENGTH, }; 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_parse_request(const struct nf_conn *ct, const char *dptr, unsigned int datalen, unsigned int *matchoff, unsigned int *matchlen); extern int ct_sip_get_header(const struct nf_conn *ct, const char *dptr, unsigned int dataoff, unsigned int datalen, enum sip_header_types type, unsigned int *matchoff, unsigned int *matchlen); 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__ */