linux/net/netfilter/nf_conntrack_sip.c
<<
6" 6" 6"p/spa 6"pspa class="lxr_search">6" ="+search" method="post" onsubmit="return do_search(this);">6" 6" 6" Search6" 6"p/spa ="ajax+*" method="post" onsubmit="return false;">6"pinput typ"v3hidden" nam"v3ajax_lookup" idv3ajax_lookup" lue="v3">6
pdiv idv3file_contents"
o o1p/a>pspa
 class="comment">/* SIP extensn vafor IP connecon>
 tracking.p/spa
  o o2p/a>pspa
 class="comment"> *p/spa
  o o3p/a>pspa
 class="comment"> * (C) 2005 by Christia
 Hentschel <chentschel@arnet.com.ar>p/spa
  o o4p/a>pspa
 class="comment"> * based on RR's ip_conntrack_ftp.c and other modules.p/spa
  o o5p/a>pspa
 class="comment"> * (C) 2007 United SecurityoProvidersp/spa
  o o6p/a>pspa
 class="comment"> * (C) 2007, 2008 Patrick McHardy <kaber@trash.net>p/spa
  o o7p/a>pspa
 class="comment"> *p/spa
  o o8p/a>pspa
 class="comment"> * This program is free software; you ca
 redistribute it and/or modifyp/spa
  o o9p/a>pspa
 class="comment"> * it under the terms of the GNU General Public License versn>
 2 asp/spa
  o pspa
 class="comment"> * published by the Free Software Foundaon>
.p/spa
  o 11p/a>pspa
 class="comment"> */p/spa
  o 12p/a> o 13p/a>#include <linux/module.hp/a>> o 14p/a>#include <linux/ctyp".hp/a>> o 15p/a>#include <linux/skbuff.hp/a>> o 16p/a>#include <linux/inet.hp/a>> o 17p/a>#include <linux/in.hp/a>> o 18p/a>#include <linux/udp.hp/a>> o 19p/a>#include <linux/tcp.hp/a>> o 20p/a>#include <linux/netfilter.hp/a>> o 21p/a> o 22p/a>#include <net/netfilter/nf_conntrack.hp/a>> o 23p/a>#include <net/netfilter/nf_conntrack_cor".hp/a>> o 24p/a>#include <net/netfilter/nf_conntrack_expeco.hp/a>> o 25p/a>#include <net/netfilter/nf_conntrack_helper.hp/a>> o 26p/a>#include <net/netfilter/nf_conntrack_zones.hp/a>> o 27p/a>#include <linux/netfilter/nf_conntrack_sip.hp/a>> o 28p/a> o 29p/a>pa href="+code=MODULE_LICENSE" class="sref">MODULE_LICENSEp/a>(pspa
 class="string">"GPL"p/spa
 ); o 30p/a>pa href="+code=MODULE_AUTHOR" class="sref">MODULE_AUTHORp/a>(pspa
 class="string">"Christia
 Hentschel <chentschel@arnet.com.ar>"p/spa
 ); o 31p/a>pa href="+code=MODULE_DESCRIPTION" class="sref">MODULE_DESCRIPTIONp/a>(pspa
 class="string">"SIP connecon>
 tracking helper"p/spa
 ); o 32p/a>pa href="+code=MODULE_ALIAS" class="sref">MODULE_ALIASp/a>(pspa
 class="string">"ip_conntrack_sip"p/spa
 ); o 33p/a>pa href="+code=MODULE_ALIAS_NFCT_HELPER" class="sref">MODULE_ALIAS_NFCT_HELPERp/a>(pspa
 class="string">"sip"p/spa
 ); o 34p/a> o 35p/a>#define pa href="+code=MAX_PORTS" class="sref">MAX_PORTSp/a>
	o 36p/a>static unsigned short pa href="+code=ports" class="sref">portsp/a>[pa href="+code=MAX_PORTS" class="sref">MAX_PORTSp/a>]; o 37p/a>static unsigned int pa href="+code=ports_c" class="sref">ports_cp/a>; o 38p/a>pa href="+code=module_param_array" class="sref">module_param_arrayp/a>(pa href="+code=ports" class="sref">portsp/a>, pa href="+code=ushort" class="sref">ushortp/a>, &pa href="+code=ports_c" class="sref">ports_cp/a>, 0400); o 39p/a>pa href="+code=MODULE_PARM_DESC" class="sref">MODULE_PARM_DESCp/a>(pa href="+code=ports" class="sref">portsp/a>, pspa
 class="string">"port numbers of SIP servers"p/spa
 ); o 40p/a> o 41p/a>static unsigned int pa href="+code=sip_timeout" class="sref">sip_timeoutp/a>
pa href="+code=__read_mostly" class="sref">__read_mostlyp/a>
=
pa href="+code=SIP_TIMEOUT" class="sref">SIP_TIMEOUTp/a>; o 42p/a>pa href="+code=module_param" class="sref">module_paramp/a>(pa href="+code=sip_timeout" class="sref">sip_timeoutp/a>, pa href="+code=uint" class="sref">uintp/a>, 0600); o 43p/a>pa href="+code=MODULE_PARM_DESC" class="sref">MODULE_PARM_DESCp/a>(pa href="+code=sip_timeout" class="sref">sip_timeoutp/a>, pspa
 class="string">"timeoutafor the master SIP sessn>
"p/spa
 ); o 44p/a> o 45p/a>static int pa href="+code=sip_direco_signalling" class="sref">sip_direco_signallingp/a>
pa href="+code=__read_mostly" class="sref">__read_mostlyp/a>
=
1; o 46p/a>pa href="+code=module_param" class="sref">module_paramp/a>(pa href="+code=sip_direco_signalling" class="sref">sip_direco_signallingp/a>, int, 0600); o 47p/a>pa href="+code=MODULE_PARM_DESC" class="sref">MODULE_PARM_DESCp/a>(pa href="+code=sip_direco_signalling" class="sref">sip_direco_signallingp/a>, pspa
 class="string">"expeco incoming calls from registrar "p/spa
  o 48p/a>
	"only (default 1)"p/spa
 ); o 49p/a> o 50p/a>static int pa href="+code=sip_direco_media" class="sref">sip_direco_mediap/a>
pa href="+code=__read_mostly" class="sref">__read_mostlyp/a>
=
1; o 51p/a>pa href="+code=module_param" class="sref">module_paramp/a>(pa href="+code=sip_direco_media" class="sref">sip_direco_mediap/a>, int, 0600); o 52p/a>pa href="+code=MODULE_PARM_DESC" class="sref">MODULE_PARM_DESCp/a>(pa href="+code=sip_direco_media" class="sref">sip_direco_mediap/a>, pspa
 class="string">"Expeco Media streams between signalling "p/spa
  o 53p/a>
	"endpoints only (default 1)"p/spa
 ); o 54p/a> o 55p/a>unsigned int (*pa href="+code=nf_nao_sip_hook" class="sref">nf_nao_sip_hookp/a>)(struct pa href="+code=sk_buff" class="sref">sk_buffp/a>
*pa href="+code=skb" class="sref">skbp/a>, unsigned int pa href="+code=protoff" class="sref">protoffp/a>, o 56p/a>
	dataoffp/a>, const char **pa href="+code=dptr" class="sref">dptrp/a>, o 57p/a>
	datalenp/a>)
pa href="+code=__read_mostly" class="sref">__read_mostlyp/a>; o 58p/a>pa href="+code=EXPORT_SYMBOL_GPL" class="sref">EXPORT_SYMBOL_GPLp/a>(pa href="+code=nf_nao_sip_hook" class="sref">nf_nao_sip_hookp/a>); o 59p/a> o 60p/a>void (*pa href="+code=nf_nao_sip_seq_adjust_hook" class="sref">nf_nao_sip_seq_adjust_hookp/a>)(struct pa href="+code=sk_buff" class="sref">sk_buffp/a>
*pa href="+code=skb" class="sref">skbp/a>, unsigned int pa href="+code=protoff" class="sref">protoffp/a>, o 61p/a>
	s16p/a> pa href="+code=off" class="sref">offp/a>)
pa href="+code=__read_mostly" class="sref">__read_mostlyp/a>; o 62p/a>pa href="+code=EXPORT_SYMBOL_GPL" class="sref">EXPORT_SYMBOL_GPLp/a>(pa href="+code=nf_nao_sip_seq_adjust_hook" class="sref">nf_nao_sip_seq_adjust_hookp/a>); o 63p/a> o 64p/a>unsigned int (*pa href="+code=nf_nao_sip_expeco_hook" class="sref">nf_nao_sip_expeco_hookp/a>)(struct pa href="+code=sk_buff" class="sref">sk_buffp/a>
*pa href="+code=skb" class="sref">skbp/a>, o 65p/a>
	protoffp/a>, o 66p/a>
	dataoffp/a>, o 67p/a>
	dptrp/a>, o 68p/a>
	datalenp/a>, o 69p/a>
	nf_conntrack_expecop/a>
*pa href="+code=exp" class="sref">expp/a>, o 70p/a>
	matchoffp/a>, o 71p/a>
	matchlenp/a>)
pa href="+code=__read_mostly" class="sref">__read_mostlyp/a>; o 72p/a>pa href="+code=EXPORT_SYMBOL_GPL" class="sref">EXPORT_SYMBOL_GPLp/a>(pa href="+code=nf_nao_sip_expeco_hook" class="sref">nf_nao_sip_expeco_hookp/a>); o 73p/a> o 74p/a>unsigned int (*pa href="+code=nf_nao_sdp_addr_hook" class="sref">nf_nao_sdp_addr_hookp/a>)(struct pa href="+code=sk_buff" class="sref">sk_buffp/a>
*pa href="+code=skb" class="sref">skbp/a>, unsigned int pa href="+code=protoff" class="sref">protoffp/a>, o 75p/a>
	dataoffp/a>, o 76p/a>
	dptrp/a>, o 77p/a>
	datalenp/a>, o 78p/a>
	sdpoffp/a>, o 79p/a>
	sdp_header_typ"sp/a> pa href="+code=typ"" class="sref">typ"p/a>, o 80p/a>
	sdp_header_typ"sp/a> pa href="+code=term" class="sref">termp/a>, o 81p/a>
	
 pa href="+code=nf_inet_addr" class="sref">nf_inet_addrp/a>
*pa href="+code=addr" class="sref">addrp/a>) o 82p/a>
	__read_mostlyp/a>; o 83p/a>pa href="+code=EXPORT_SYMBOL_GPL" class="sref">EXPORT_SYMBOL_GPLp/a>(pa href="+code=nf_nao_sdp_addr_hook" class="sref">nf_nao_sdp_addr_hookp/a>); o 84p/a> o 85p/a>unsigned int (*pa href="+code=nf_nao_sdp_port_hook" class="sref">nf_nao_sdp_port_hookp/a>)(struct pa href="+code=sk_buff" class="sref">sk_buffp/a>
*pa href="+code=skb" class="sref">skbp/a>, unsigned int pa href="+code=protoff" class="sref">protoffp/a>, o 86p/a>
	dataoffp/a>, o 87p/a>
	dptrp/a>, o 88p/a>
	datalenp/a>, o 89p/a>
	matchoffp/a>, o 90p/a>
	matchlenp/a>, o 91p/a>
	u_int16_tp/a> pa href="+code=port" class="sref">portp/a>)
pa href="+code=__read_mostly" class="sref">__read_mostlyp/a>; o 92p/a>pa href="+code=EXPORT_SYMBOL_GPL" class="sref">EXPORT_SYMBOL_GPLp/a>(pa href="+code=nf_nao_sdp_port_hook" class="sref">nf_nao_sdp_port_hookp/a>); o 93p/a> o 94p/a>unsigned int (*pa href="+code=nf_nao_sdp_sessn>
_hook" class="sref">nf_nao_sdp_sessn>
_hookp/a>)(struct pa href="+code=sk_buff" class="sref">sk_buffp/a>
*pa href="+code=skb" class="sref">skbp/a>, o 95p/a>
	protoffp/a>, o 96p/a>
	dataoffp/a>, o 97p/a>
	dptrp/a>, o 98p/a>
	datalenp/a>, o 99p/a>
	sdpoffp/a>, o100p/a>
	
 pa href="+code=nf_inet_addr" class="sref">nf_inet_addrp/a>
*pa href="+code=addr" class="sref">addrp/a>) o101p/a>
	__read_mostlyp/a>; o102p/a>pa href="+code=EXPORT_SYMBOL_GPL" class="sref">EXPORT_SYMBOL_GPLp/a>(pa href="+code=nf_nao_sdp_sessn>
_hook" class="sref">nf_nao_sdp_sessn>
_hookp/a>); o103p/a> o104p/a>unsigned int (*pa href="+code=nf_nao_sdp_media_hook" class="sref">nf_nao_sdp_media_hookp/a>)(struct pa href="+code=sk_buff" class="sref">sk_buffp/a>
*pa href="+code=skb" class="sref">skbp/a>, unsigned int pa href="+code=protoff" class="sref">protoffp/a>, o105p/a>
	dataoffp/a>, o106p/a>
	dptrp/a>, o107p/a>
	datalenp/a>, o108p/a>
	nf_conntrack_expecop/a>
*pa href="+code=rtp_exp" class="sref">rtp_expp/a>, o109p/a>
	nf_conntrack_expecop/a>
*pa href="+code=rtcp_exp" class="sref">rtcp_expp/a>, o110p/a>
	mediaoffp/a>, o111p/a>
	medialenp/a>, o112p/a>
	
 pa href="+code=nf_inet_addr" class="sref">nf_inet_addrp/a>
*pa href="+code=rtp_addr" class="sref">rtp_addrp/a>) o113p/a>
	__read_mostlyp/a>; o114p/a>pa href="+code=EXPORT_SYMBOL_GPL" class="sref">EXPORT_SYMBOL_GPLp/a>(pa href="+code=nf_nao_sdp_media_hook" class="sref">nf_nao_sdp_media_hookp/a>); o115p/a> o116p/a>static int pa href="+code=string_len" class="sref">string_lenp/a>(const struct pa href="+code=nf_conn" class="sref">nf_connp/a>
*pa href="+code=co" class="sref">ctp/a>, const char *pa href="+code=dptr" class="sref">dptrp/a>, o117p/a>
	limitp/a>, int *pa href="+code=shift" class="sref">shiftp/a>) o118p/a>{ o119p/a>
	lenp/a> = 0; o120p/a> o121p/a>
	dptrp/a> < pa href="+code=limit" class="sref">limitp/a> && pa href="+code=isalpha" class="sref">isalphap/a>(*pa href="+code=dptr" class="sref">dptrp/a>)) { o122p/a>
	dptrp/a>++; o123p/a>
	lenp/a>++; o124p/a>        } o125p/a>
	lenp/a>; o126p/a>} o127p/a> o128p/a>static int pa href="+code=digits_len" class="sref">digits_lenp/a>(const struct pa href="+code=nf_conn" class="sref">nf_connp/a>
*pa href="+code=co" class="sref">ctp/a>, const char *pa href="+code=dptr" class="sref">dptrp/a>, o129p/a>
	limitp/a>, int *pa href="+code=shift" class="sref">shiftp/a>) o130p/a>{ o131p/a>
	lenp/a> = 0; o132p/a>
	dptrp/a> < pa href="+code=limit" class="sref">limitp/a> && pa href="+code=isdigit" class="sref">isdigitp/a>(*pa href="+code=dptr" class="sref">dptrp/a>)) { o133p/a>
	dptrp/a>++; o134p/a>
	lenp/a>++; o135p/a>        } o136p/a>
	lenp/a>; o137p/a>} o138p/a> o139p/a>static int pa href="+code=iswordc" class="sref">iswordcp/a>(const char pa href="+code=c" class="sref">cp/a>) o140p/a>{ o141p/a>
	isalnump/a>(pa href="+code=c" class="sref">cp/a>) || pa href="+code=c" class="sref">cp/a> == pspa
 class="string">'!'p/spa
  || pa href="+code=c" class="sref">cp/a> == pspa
 class="string">'"'p/spa
  || pa href="+code=c" class="sref">cp/a> == pspa
 class="string">'%'p/spa
  || o142p/a>
	cp/a> >= pspa
 class="string">'('p/spa
  && pa href="+code=c" class="sref">cp/a> <= pspa
 class="string">'/'p/spa
 ) || pa href="+code=c" class="sref">cp/a> == pspa
 class="string">':'p/spa
  || pa href="+code=c" class="sref">cp/a> == pspa
 class="string">'<'p/spa
  || pa href="+code=c" class="sref">cp/a> == pspa
 class="string">'>'p/spa
  || o143p/a>
	cp/a> == pspa
 class="string">'?'p/spa
  || (pa href="+code=c" class="sref">cp/a> >= pspa
 class="string">'['p/spa
  && pa href="+code=c" class="sref">cp/a> <= pspa
 class="string">']'p/spa
 ) || pa href="+code=c" class="sref">cp/a> == pspa
 class="string">'_'p/spa
  || pa href="+code=c" class="sref">cp/a> == pspa
 class="string">'`'p/spa
  || o144p/a>
	cp/a> == pspa
 class="string">'{'p/spa
  || pa href="+code=c" class="sref">cp/a> == pspa
 class="string">'}'p/spa
  || pa href="+code=c" class="sref">cp/a> == pspa
 class="string">'~'p/spa
 ) o145p/a>
	o146p/a>
	o147p/a>} o148p/a> o149p/a>static int pa href="+code=word_len" class="sref">word_lenp/a>(const char *pa href="+code=dptr" class="sref">dptrp/a>, const char *pa href="+code=limit" class="sref">limitp/a>) o150p/a>{ o151p/a>
	lenp/a> = 0; o152p/a>
	dptrp/a> < pa href="+code=limit" class="sref">limitp/a> && pa href="+code=iswordc" class="sref">iswordcp/a>(*pa href="+code=dptr" class="sref">dptrp/a>)) { o153p/a>
	dptrp/a>++; o154p/a>
	lenp/a>++; o155p/a>        } o156p/a>
	lenp/a>; o157p/a>} o158p/a> o159p/a>static int pa href="+code=callid_len" class="sref">callid_lenp/a>(const struct pa href="+code=nf_conn" class="sref">nf_connp/a>
*pa href="+code=co" class="sref">ctp/a>, const char *pa href="+code=dptr" class="sref">dptrp/a>, o160p/a>
	limitp/a>, int *pa href="+code=shift" class="sref">shiftp/a>) o161p/a>{ o162p/a>
	lenp/a>, pa href="+code=domain_len" class="sref">domain_lenp/a>; o163p/a> o164p/a>
	lenp/a> = pa href="+code=word_len" class="sref">word_lenp/a>(pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=limit" class="sref">limitp/a>); o165p/a>
	dptrp/a> += pa href="+code=len" class="sref">lenp/a>; o166p/a>
	lenp/a> || pa href="+code=dptr" class="sref">dptrp/a> == pa href="+code=limit" class="sref">limitp/a> || *pa href="+code=dptr" class="sref">dptrp/a> != pspa
 class="string">'@'p/spa
 ) o167p/a>
	lenp/a>; o168p/a>
	dptrp/a>++; o169p/a>
	lenp/a>++; o170p/a> o171p/a>
	domain_lenp/a> = pa href="+code=word_len" class="sref">word_lenp/a>(pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=limit" class="sref">limitp/a>); o172p/a>
	domain_lenp/a>) o173p/a>
	o174p/a>
	lenp/a> + pa href="+code=domain_len" class="sref">domain_lenp/a>; o175p/a>} o176p/a> o177p/a>pspa
 class="comment">/* get media typ" + port length */p/spa
  o178p/a>static int pa href="+code=media_len" class="sref">media_lenp/a>(const struct pa href="+code=nf_conn" class="sref">nf_connp/a>
*pa href="+code=co" class="sref">ctp/a>, const char *pa href="+code=dptr" class="sref">dptrp/a>, o179p/a>
	limitp/a>, int *pa href="+code=shift" class="sref">shiftp/a>) o180p/a>{ o181p/a>
	lenp/a> = pa href="+code=string_len" class="sref">string_lenp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=limit" class="sref">limitp/a>, pa href="+code=shift" class="sref">shiftp/a>); o182p/a> o183p/a>
	dptrp/a> += pa href="+code=len" class="sref">lenp/a>; o184p/a>
	dptrp/a> >= pa href="+code=limit" class="sref">limitp/a> || *pa href="+code=dptr" class="sref">dptrp/a> != pspa
 class="string">' 'p/spa
 ) o185p/a>
	o186p/a>
	lenp/a>++; o187p/a>
	dptrp/a>++; o188p/a> o189p/a>
	lenp/a> + pa href="+code=digits_len" class="sref">digits_lenp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=limit" class="sref">limitp/a>, pa href="+code=shift" class="sref">shiftp/a>); o190p/a>} o191p/a> o192p/a>static int pa href="+code=sip_parse_addr" class="sref">sip_parse_addrp/a>(const struct pa href="+code=nf_conn" class="sref">nf_connp/a>
*pa href="+code=co" class="sref">ctp/a>, const char *pa href="+code=cp" class="sref">cpp/a>, o193p/a>
	endpp/a>, unn>
 pa href="+code=nf_inet_addr" class="sref">nf_inet_addrp/a>
*pa href="+code=addr" class="sref">addrp/a>, o194p/a>
	limitp/a>, pa href="+code=bool" class="sref">boolp/a>
pa href="+code=delim" class="sref">delimp/a>) o195p/a>{ o196p/a>
	endp/a>; o197p/a>
	retp/a>; o198p/a> o199p/a>
	ctp/a>) o200p/a>
	o201p/a> o202p/a>
	memsetp/a>(pa href="+code=addr" class="sref">addrp/a>, 0, sizeof(*pa href="+code=addr" class="sref">addrp/a>)); o203p/a>
	nf_ct_l3nump/a>(pa href="+code=co" class="sref">ctp/a>)) { o204p/a>
	AF_INETp/a>: o205p/a>
	retp/a> = pa href="+code=in4_pton" class="sref">in4_ptonp/a>(pa href="+code=cp" class="sref">cpp/a>, pa href="+code=limit" class="sref">limitp/a> - pa href="+code=cp" class="sref">cpp/a>, (pa href="+code=u8" class="sref">u8p/a>
*)&pa href="+code=addr" class="sref">addrp/a>->pa href="+code=ip" class="sref">ipp/a>, -1, &pa href="+code=end" class="sref">endp/a>); o206p/a>
	retp/a> == 0) o207p/a>
	o208p/a>
	o209p/a>
	AF_INET6p/a>: o210p/a>
	cpp/a> < pa href="+code=limit" class="sref">limitp/a> && *pa href="+code=cp" class="sref">cpp/a> == pspa
 class="string">'['p/spa
 ) o211p/a>
	cpp/a>++; o212p/a>
	delimp/a>) o213p/a>
	o214p/a> o215p/a>
	retp/a> = pa href="+code=in6_pton" class="sref">in6_ptonp/a>(pa href="+code=cp" class="sref">cpp/a>, pa href="+code=limit" class="sref">limitp/a> - pa href="+code=cp" class="sref">cpp/a>, (pa href="+code=u8" class="sref">u8p/a>
*)&pa href="+code=addr" class="sref">addrp/a>->pa href="+code=ip6" class="sref">ip6p/a>, -1, &pa href="+code=end" class="sref">endp/a>); o216p/a>
	retp/a> == 0) o217p/a>
	o218p/a> o219p/a>
	endp/a> < pa href="+code=limit" class="sref">limitp/a> && *pa href="+code=end" class="sref">endp/a> == pspa
 class="string">']'p/spa
 ) o220p/a>
	endp/a>++; o221p/a>
	delimp/a>) o222p/a>
	o223p/a>
	o224p/a>        default: o225p/a>
	BUGp/a>(); o226p/a>
	o227p/a> o228p/a>
	endpp/a>) o229p/a>
	endpp/a> = pa href="+code=end" class="sref">endp/a>; o230p/a>
	o231p/a>} o232p/a> o233p/a>pspa
 class="comment">/* skip ip address. returns its length. */p/spa
  o234p/a>static int pa href="+code=epaddr_len" class="sref">epaddr_lenp/a>(const struct pa href="+code=nf_conn" class="sref">nf_connp/a>
*pa href="+code=co" class="sref">ctp/a>, const char *pa href="+code=dptr" class="sref">dptrp/a>, o235p/a>
	limitp/a>, int *pa href="+code=shift" class="sref">shiftp/a>) o236p/a>{ o237p/a>
	
 pa href="+code=nf_inet_addr" class="sref">nf_inet_addrp/a>
pa href="+code=addr" class="sref">addrp/a>; o238p/a>
	auxp/a> = pa href="+code=dptr" class="sref">dptrp/a>; o239p/a> o240p/a>
	sip_parse_addrp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=dptr" class="sref">dptrp/a>, &pa href="+code=dptr" class="sref">dptrp/a>, &pa href="+code=addr" class="sref">addrp/a>, pa href="+code=limit" class="sref">limitp/a>, pa href="+code=true" class="sref">truep/a>)) { o241p/a>
	pr_debugp/a>(pspa
 class="string">"ip: %s parse failed.!\n"p/spa
 , pa href="+code=dptr" class="sref">dptrp/a>); o242p/a>
	o243p/a>
	o244p/a> o245p/a>
	/* Port number */p/spa
  o246p/a>
	dptrp/a> == pspa
 class="string">':'p/spa
 ) { o247p/a>
	dptrp/a>++; o248p/a>
	dptrp/a> += pa href="+code=digits_len" class="sref">digits_lenp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=limit" class="sref">limitp/a>, pa href="+code=shift" class="sref">shiftp/a>); o249p/a>
	o250p/a>
	dptrp/a> - pa href="+code=aux" class="sref">auxp/a>; o251p/a>} o252p/a> o253p/a>pspa
 class="comment">/* get address length, skiping user info. */p/spa
  o254p/a>static int pa href="+code=skp_epaddr_len" class="sref">skp_epaddr_lenp/a>(const struct pa href="+code=nf_conn" class="sref">nf_connp/a>
*pa href="+code=co" class="sref">ctp/a>, const char *pa href="+code=dptr" class="sref">dptrp/a>, o255p/a>
	limitp/a>, int *pa href="+code=shift" class="sref">shiftp/a>) o256p/a>{ o257p/a>
	startp/a> = pa href="+code=dptr" class="sref">dptrp/a>; o258p/a>
	sp/a> = *pa href="+code=shift" class="sref">shiftp/a>; o259p/a> o260p/a>
	/* Search for @, but stop at the end of the line.p/spa
  o261p/a>pspa
 class="comment">         * We are inside a sip: URI, so we don't need to worry aboutp/spa
  o262p/a>pspa
 class="comment">         * continuation lines. */p/spa
  o263p/a>
	dptrp/a> < pa href="+code=limit" class="sref">limitp/a> && o264p/a>
	dptrp/a> != pspa
 class="string">'@'p/spa
  && *pa href="+code=dptr" class="sref">dptrp/a> != pspa
 class="string">'\r'p/spa
  && *pa href="+code=dptr" class="sref">dptrp/a> != pspa
 class="string">'\n'p/spa
 ) { o265p/a>
	shiftp/a>)++; o266p/a>
	dptrp/a>++; o267p/a>
	o268p/a> o269p/a>
	dptrp/a> < pa href="+code=limit" class="sref">limitp/a> && *pa href="+code=dptr" class="sref">dptrp/a> == pspa
 class="string">'@'p/spa
 ) { o270p/a>
	dptrp/a>++; o271p/a>
	shiftp/a>)++; o272p/a>
	o273p/a>
	dptrp/a> = pa href="+code=start" class="sref">startp/a>; o274p/a>
	shiftp/a> = pa href="+code=s" class="sref">sp/a>; o275p/a>        } o276p/a> o277p/a>
	epaddr_lenp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=limit" class="sref">limitp/a>, pa href="+code=shift" class="sref">shiftp/a>); o278p/a>} o279p/a> o280p/a>pspa
 class="comment">/* Parse a SIP request line of the form:p/spa
  o281p/a>pspa
 class="comment"> *p/spa
  o282p/a>pspa
 class="comment"> * Request-Line = Method SP Request-URI SP SIP-Version CRLFp/spa
  o283p/a>pspa
 class="comment"> *p/spa
  o284p/a>pspa
 class="comment"> * and return the offset and length of the address contained in the Request-URI.p/spa
  o285p/a>pspa
 class="comment"> */p/spa
  o286p/a>int pa href="+code=ct_sip_parse_request" class="sref">ct_sip_parse_requestp/a>(const struct pa href="+code=nf_conn" class="sref">nf_connp/a>
*pa href="+code=co" class="sref">ctp/a>, o287p/a>
	dptrp/a>, unsigned int pa href="+code=datalen" class="sref">datalenp/a>, o288p/a>
	matchoffp/a>, unsigned int *pa href="+code=matchlen" class="sref">matchlenp/a>, o289p/a>
	
 pa href="+code=nf_inet_addr" class="sref">nf_inet_addrp/a>
*pa href="+code=addr" class="sref">addrp/a>, pa href="+code=__be16" class="sref">__be16p/a>
*pa href="+code=port" class="sref">portp/a>) o290p/a>{ o291p/a>
	startp/a> = pa href="+code=dptr" class="sref">dptrp/a>, *pa href="+code=limit" class="sref">limitp/a> = pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=datalen" class="sref">datalenp/a>, *pa href="+code=end" class="sref">endp/a>; o292p/a>
	mlenp/a>; o293p/a>
	pp/a>; o294p/a>
	shiftp/a> = 0; o295p/a> o296p/a>
	/* Skip method and following whitespace */p/spa
  o297p/a>
	mlenp/a> = pa href="+code=string_len" class="sref">string_lenp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=limit" class="sref">limitp/a>, pa href="+code=NULL" class="sref">NULLp/a>); o298p/a>
	mlenp/a>) o299p/a>
	o300p/a>
	dptrp/a> += pa href="+code=mlen" class="sref">mlenp/a>; o301p/a>
	dptrp/a> >= pa href="+code=limit" class="sref">limitp/a>) o302p/a>
	o303p/a> o304p/a>
	/* Find SIP URI */p/spa
  o305p/a>
	dptrp/a> < pa href="+code=limit" class="sref">limitp/a> - pa href="+code=strlen" class="sref">strlenp/a>(pspa
 class="string">"sip:"p/spa
 ); pa href="+code=dptr" class="sref">dptrp/a>++) { o306p/a>
	dptrp/a> == pspa
 class="string">'\r'p/spa
  || *pa href="+code=dptr" class="sref">dptrp/a> == pspa
 class="string">'\n'p/spa
 ) o307p/a>
	o308p/a>
	strnicmpp/a>(pa href="+code=dptr" class="sref">dptrp/a>, pspa
 class="string">"sip:"p/spa
 , pa href="+code=strlen" class="sref">strlenp/a>(pspa
 class="string">"sip:"p/spa
 )) == 0) { o309p/a>
	dptrp/a> += pa href="+code=strlen" class="sref">strlenp/a>(pspa
 class="string">"sip:"p/spa
 ); o310p/a>
	o311p/a>
	o312p/a>
	o313p/a>
	skp_epaddr_lenp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=limit" class="sref">limitp/a>, &pa href="+code=shift" class="sref">shiftp/a>)) o314p/a>
	o315p/a>
	dptrp/a> += pa href="+code=shift" class="sref">shiftp/a>; o316p/a> o317p/a>
	sip_parse_addrp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=dptr" class="sref">dptrp/a>, &pa href="+code=end" class="sref">endp/a>, pa href="+code=addr" class="sref">addrp/a>, pa href="+code=limit" class="sref">limitp/a>, pa href="+code=true" class="sref">truep/a>)) o318p/a>
	o319p/a>
	endp/a> < pa href="+code=limit" class="sref">limitp/a> && *pa href="+code=end" class="sref">endp/a> == pspa
 class="string">':'p/spa
 ) { o320p/a>
	endp/a>++; o321p/a>
	pp/a> = pa href="+code=simple_strtoul" class="sref">simple_strtoulp/a>(pa href="+code=end" class="sref">endp/a>, (char **)&pa href="+code=end" class="sref">endp/a>, 10); o322p/a>
	pp/a> < 1024 || pa href="+code=p" class="sref">pp/a> > 65535) o323p/a>
	o324p/a>
	portp/a> = pa href="+code=htons" class="sref">htonsp/a>(pa href="+code=p" class="sref">pp/a>); o325p/a>
	o326p/a>
	portp/a> = pa href="+code=htons" class="sref">htonsp/a>(pa href="+code=SIP_PORT" class="sref">SIP_PORTp/a>); o327p/a> o328p/a>
	endp/a> == pa href="+code=dptr" class="sref">dptrp/a>) o329p/a>
	o330p/a>
	matchoffp/a> = pa href="+code=dptr" class="sref">dptrp/a> - pa href="+code=start" class="sref">startp/a>; o331p/a>
	matchlenp/a> = pa href="+code=end" class="sref">endp/a> - pa href="+code=dptr" class="sref">dptrp/a>; o332p/a>
	o333p/a>} o334p/a>pa href="+code=EXPORT_SYMBOL_GPL" class="sref">EXPORT_SYMBOL_GPLp/a>(pa href="+code=co_sip_parse_request" class="sref">ct_sip_parse_requestp/a>); o335p/a> o336p/a>pspa
 class="comment">/* SIP header parsing: SIP headers are located at the beginning of a line, butp/spa
  o337p/a>pspa
 class="comment"> * may spa
 several lines, in which case the continuation lines begin with ap/spa
  o338p/a>pspa
 class="comment"> * whitespace character. RFCo2543 allows lines to be terminated with CR, LF orp/spa
  o339p/a>pspa
 class="comment"> * CRLF, RFCo3261 allows only CRLF, we support both.p/spa
  o340p/a>pspa
 class="comment"> *p/spa
  o341p/a>pspa
 class="comment"> * Headers are followed by (optionally) whitespace, a colon, again (optionally)p/spa
  o342p/a>pspa
 class="comment"> * whitespace and the values. Whitespace in this context means any amount ofp/spa
  o343p/a>pspa
 class="comment"> * tabs, spaces and continuation lines, which are treated as a single whitespacep/spa
  o344p/a>pspa
 class="comment"> * character.p/spa
  o345p/a>pspa
 class="comment"> *p/spa
  o346p/a>pspa
 class="comment"> * Some headers may appear multiple times. A comma separated list of values isp/spa
  o347p/a>pspa
 class="comment"> * equivalent to multiple headers.p/spa
  o348p/a>pspa
 class="comment"> */p/spa
  o349p/a>static const struct pa href="+code=sip_header" class="sref">sip_headerp/a>
pa href="+code=co_sip_hdrs" class="sref">co_sip_hdrsp/a>[] = { o350p/a>
	SIP_HDR_CSEQp/a>]                  = pa href="+code=SIP_HDR" class="sref">SIP_HDRp/a>(pspa
 class="string">"CSeq"p/spa
 , pa href="+code=NULL" class="sref">NULLp/a>, pa href="+code=NULL" class="sref">NULLp/a>, pa href="+code=digits_len" class="sref">digits_lenp/a>), o351p/a>
	SIP_HDR_FROMp/a>]                  = pa href="+code=SIP_HDR" class="sref">SIP_HDRp/a>(pspa
 class="string">"From"p/spa
 , pspa
 class="string">"f"p/spa
 , pspa
 class="string">"sip:"p/spa
 , pa href="+code=skp_epaddr_len" class="sref">skp_epaddr_lenp/a>), o352p/a>
	SIP_HDR_TOp/a>]                    = pa href="+code=SIP_HDR" class="sref">SIP_HDRp/a>(pspa
 class="string">"To"p/spa
 , pspa
 class="string">"t"p/spa
 , pspa
 class="string">"sip:"p/spa
 , pa href="+code=skp_epaddr_len" class="sref">skp_epaddr_lenp/a>), o353p/a>
	SIP_HDR_CONTACTp/a>]               = pa href="+code=SIP_HDR" class="sref">SIP_HDRp/a>(pspa
 class="string">"Contact"p/spa
 , pspa
 class="string">"m"p/spa
 , pspa
 class="string">"sip:"p/spa
 , pa href="+code=skp_epaddr_len" class="sref">skp_epaddr_lenp/a>), o354p/a>
	SIP_HDR_VIA_UDPp/a>]               = pa href="+code=SIP_HDR" class="sref">SIP_HDRp/a>(pspa
 class="string">"Via"p/spa
 , pspa
 class="string">"v"p/spa
 , pspa
 class="string">"UDP "p/spa
 , pa href="+code=epaddr_len" class="sref">epaddr_lenp/a>), o355p/a>
	SIP_HDR_VIA_TCPp/a>]               = pa href="+code=SIP_HDR" class="sref">SIP_HDRp/a>(pspa
 class="string">"Via"p/spa
 , pspa
 class="string">"v"p/spa
 , pspa
 class="string">"TCP "p/spa
 , pa href="+code=epaddr_len" class="sref">epaddr_lenp/a>), o356p/a>
	SIP_HDR_EXPIRESp/a>]               = pa href="+code=SIP_HDR" class="sref">SIP_HDRp/a>(pspa
 class="string">"Expires"p/spa
 , pa href="+code=NULL" class="sref">NULLp/a>, pa href="+code=NULL" class="sref">NULLp/a>, pa href="+code=digits_len" class="sref">digits_lenp/a>), o357p/a>
	SIP_HDR_CONTENT_LENGTHp/a>]        = pa href="+code=SIP_HDR" class="sref">SIP_HDRp/a>(pspa
 class="string">"Content-Length"p/spa
 , pspa
 class="string">"l"p/spa
 , pa href="+code=NULL" class="sref">NULLp/a>, pa href="+code=digits_len" class="sref">digits_lenp/a>), o358p/a>
	SIP_HDR_CALL_IDp/a>]               = pa href="+code=SIP_HDR" class="sref">SIP_HDRp/a>(pspa
 class="string">"Call-Id"p/spa
 , pspa
 class="string">"i"p/spa
 , pa href="+code=NULL" class="sref">NULLp/a>, pa href="+code=callid_len" class="sref">callid_lenp/a>), o359p/a>}; o360p/a> o361p/a>static const char *pa href="+code=sip_follow_continuation" class="sref">sip_follow_continuationp/a>(const char *pa href="+code=dptr" class="sref">dptrp/a>, const char *pa href="+code=limit" class="sref">limitp/a>) o362p/a>{ o363p/a>
	/* Walk past newline */p/spa
  o364p/a>
	dptrp/a> >= pa href="+code=limit" class="sref">limitp/a>) o365p/a>
	NULLp/a>; o366p/a> o367p/a>
	/* Skip '\n' in CR LF */p/spa
  o368p/a>
	dptrp/a> - 1) == pspa
 class="string">'\r'p/spa
  && *pa href="+code=dptr" class="sref">dptrp/a> == pspa
 class="string">'\n'p/spa
 ) { o369p/a>
	dptrp/a> >= pa href="+code=limit" class="sref">limitp/a>) o370p/a>
	NULLp/a>; o371p/a>
	o372p/a> o373p/a>
	/* Continuation line? */p/spa
  o374p/a>
	dptrp/a> != pspa
 class="string">' 'p/spa
  && *pa href="+code=dptr" class="sref">dptrp/a> != pspa
 class="string">'\t'p/spa
 ) o375p/a>
	NULLp/a>; o376p/a> o377p/a>
	/* skip leading whitespace */p/spa
  o378p/a>
	dptrp/a> < pa href="+code=limit" class="sref">limitp/a>; pa href="+code=dptr" class="sref">dptrp/a>++) { o379p/a>
	dptrp/a> != pspa
 class="string">' 'p/spa
  && *pa href="+code=dptr" class="sref">dptrp/a> != pspa
 class="string">'\t'p/spa
 ) o380p/a>
	o381p/a>
	o382p/a>
	dptrp/a>; o383p/a>} o384p/a> o385p/a>static const char *pa href="+code=sip_skip_whitespace" class="sref">sip_skip_whitespacep/a>(const char *pa href="+code=dptr" class="sref">dptrp/a>, const char *pa href="+code=limit" class="sref">limitp/a>) o386p/a>{ o387p/a>
	dptrp/a> < pa href="+code=limit" class="sref">limitp/a>; pa href="+code=dptr" class="sref">dptrp/a>++) { o388p/a>
	dptrp/a> == pspa
 class="string">' 'p/spa
 ) o389p/a>
	o390p/a>
	dptrp/a> != pspa
 class="string">'\r'p/spa
  && *pa href="+code=dptr" class="sref">dptrp/a> != pspa
 class="string">'\n'p/spa
 ) o391p/a>
	o392p/a>
	dptrp/a> = pa href="+code=sip_follow_continuation" class="sref">sip_follow_continuationp/a>(pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=limit" class="sref">limitp/a>); o393p/a>
	dptrp/a> == pa href="+code=NULL" class="sref">NULLp/a>) o394p/a>
	NULLp/a>; o395p/a>        } o396p/a>
	dptrp/a>; o397p/a>} o398p/a> o399p/a>pspa
 class="comment">/* Search within a SIP header value, dealing with continuation lines */p/spa
  o400p/a>static const char *pa href="+code=co_sip_header_search" class="sref">co_sip_header_searchp/a>(const char *pa href="+code=dptr" class="sref">dptrp/a>, const char *pa href="+code=limit" class="sref">limitp/a>, o401p/a>
	needlep/a>, unsigned int pa href="+code=len" class="sref">lenp/a>) o402p/a>{ o403p/a>
	limitp/a> -= pa href="+code=len" class="sref">lenp/a>; pa href="+code=dptr" class="sref">dptrp/a> < pa href="+code=limit" class="sref">limitp/a>; pa href="+code=dptr" class="sref">dptrp/a>++) { o404p/a>
	dptrp/a> == pspa
 class="string">'\r'p/spa
  || *pa href="+code=dptr" class="sref">dptrp/a> == pspa
 class="string">'\n'p/spa
 ) { o405p/a>
	dptrp/a> = pa href="+code=sip_follow_continuation" class="sref">sip_follow_continuationp/a>(pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=limit" class="sref">limitp/a>); o406p/a>
	dptrp/a> == pa href="+code=NULL" class="sref">NULLp/a>) o407p/a>
	o408p/a>
	o409p/a>
	o410p/a> o411p/a>
	strnicmpp/a>(pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=needle" class="sref">needlep/a>, pa href="+code=len" class="sref">lenp/a>) == 0) o412p/a>
	dptrp/a>; o413p/a>
	o414p/a>
	NULLp/a>; o415p/a>} o416p/a> o417p/a>int pa href="+code=ct_sip_get_header" class="sref">ct_sip_get_headerp/a>(const struct pa href="+code=nf_conn" class="sref">nf_connp/a>
*pa href="+code=co" class="sref">ctp/a>, const char *pa href="+code=dptr" class="sref">dptrp/a>, o418p/a>
	dataoffp/a>, unsigned int pa href="+code=datalen" class="sref">datalenp/a>, o419p/a>
	sip_header_typesp/a>
pa href="+code=type" class="sref">typep/a>, o420p/a>
	matchoffp/a>, unsigned int *pa href="+code=matchlen" class="sref">matchlenp/a>) o421p/a>{ o422p/a>
	sip_headerp/a>
*pa href="+code=hdr" class="sref">hdrp/a> = &pa href="+code=co_sip_hdrs" class="sref">co_sip_hdrsp/a>[pa href="+code=type" class="sref">typep/a>]; o423p/a>
	startp/a> = pa href="+code=dptr" class="sref">dptrp/a>, *pa href="+code=limit" class="sref">limitp/a> = pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=datalen" class="sref">datalenp/a>; o424p/a>
	shiftp/a> = 0; o425p/a> o426p/a>
	dptrp/a> += pa href="+code=dataoff" class="sref">dataoffp/a>; pa href="+code=dptr" class="sref">dptrp/a> < pa href="+code=limit" class="sref">limitp/a>; pa href="+code=dptr" class="sref">dptrp/a>++) { o427p/a>
	/* Find beginning of line */p/spa
  o428p/a>
	dptrp/a> != pspa
 class="string">'\r'p/spa
  && *pa href="+code=dptr" class="sref">dptrp/a> != pspa
 class="string">'\n'p/spa
 ) o429p/a>
	o430p/a>
	dptrp/a> >= pa href="+code=limit" class="sref">limitp/a>) o431p/a>
	o432p/a>
	dptrp/a> - 1) == pspa
 class="string">'\r'p/spa
  && *pa href="+code=dptr" class="sref">dptrp/a> == pspa
 class="string">'\n'p/spa
 ) { o433p/a>
	dptrp/a> >= pa href="+code=limit" class="sref">limitp/a>) o434p/a>
	o435p/a>
	o436p/a> o437p/a>
	/* Skip continuation lines */p/spa
  o438p/a>
	dptrp/a> == pspa
 class="string">' 'p/spa
  || *pa href="+code=dptr" class="sref">dptrp/a> == pspa
 class="string">'\t'p/spa
 ) o439p/a>
	o440p/a> o441p/a>
	/* Find header. Compact headers must be followed by ap/spa
  o442p/a>pspa
 class="comment">                 * non-alphabetic character to avoid mismatches. */p/spa
  o443p/a>
	limitp/a> - pa href="+code=dptr" class="sref">dptrp/a> >= pa href="+code=hdr" class="sref">hdrp/a>->pa href="+code=len" class="sref">lenp/a> && o444p/a>
	strnicmpp/a>(pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=hdr" class="sref">hdrp/a>->pa href="+code=nam"" class="sref">nam"p/a>, pa href="+code=hdr" class="sref">hdrp/a>->pa href="+code=len" class="sref">lenp/a>) == 0) o445p/a>
	dptrp/a> += pa href="+code=hdr" class="sref">hdrp/a>->pa href="+code=len" class="sref">lenp/a>; o446p/a>
	hdrp/a>->pa href="+code=cnam"" class="sref">cnam"p/a> && pa href="+code=limit" class="sref">limitp/a> - pa href="+code=dptr" class="sref">dptrp/a> >= pa href="+code=hdr" class="sref">hdrp/a>->pa href="+code=clen" class="sref">clenp/a> + 1 && o447p/a>
	strnicmpp/a>(pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=hdr" class="sref">hdrp/a>->pa href="+code=cnam"" class="sref">cnam"p/a>, pa href="+code=hdr" class="sref">hdrp/a>->pa href="+code=clen" class="sref">clenp/a>) == 0 && o448p/a>
	isalphap/a>(*(pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=hdr" class="sref">hdrp/a>->pa href="+code=clen" class="sref">clenp/a>))) o449p/a>
	dptrp/a> += pa href="+code=hdr" class="sref">hdrp/a>->pa href="+code=clen" class="sref">clenp/a>; o450p/a>
	o451p/a>
	o452p/a> o453p/a>
	/* Find and skip colon */p/spa
  o454p/a>
	dptrp/a> = pa href="+code=sip_skip_whitespace" class="sref">sip_skip_whitespacep/a>(pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=limit" class="sref">limitp/a>); o455p/a>
	dptrp/a> == pa href="+code=NULL" class="sref">NULLp/a>) o456p/a>
	o457p/a>
	dptrp/a> != pspa
 class="string">':'p/spa
  || ++pa href="+code=dptr" class="sref">dptrp/a> >= pa href="+code=limit" class="sref">limitp/a>) o458p/a>
	o459p/a> o460p/a>
	/* Skip whitespace after colon */p/spa
  o461p/a>
	dptrp/a> = pa href="+code=sip_skip_whitespace" class="sref">sip_skip_whitespacep/a>(pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=limit" class="sref">limitp/a>); o462p/a>
	dptrp/a> == pa href="+code=NULL" class="sref">NULLp/a>) o463p/a>
	o464p/a> o465p/a>
	matchoffp/a> = pa href="+code=dptr" class="sref">dptrp/a> - pa href="+code=start" class="sref">startp/a>; o466p/a>
	hdrp/a>->pa href="+code=search" class="sref">searchp/a>) { o467p/a>
	dptrp/a> = pa href="+code=co_sip_header_search" class="sref">co_sip_header_searchp/a>(pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=limit" class="sref">limitp/a>, pa href="+code=hdr" class="sref">hdrp/a>->pa href="+code=search" class="sref">searchp/a>, o468p/a>
	hdrp/a>->pa href="+code=slen" class="sref">slenp/a>); o469p/a>
	dptrp/a>) o470p/a>
	o471p/a>
	dptrp/a> += pa href="+code=hdr" class="sref">hdrp/a>->pa href="+code=slen" class="sref">slenp/a>; o472p/a>
	o473p/a> o474p/a>
	matchlenp/a> = pa href="+code=hdr" class="sref">hdrp/a>->pa href="+code=match_len" class="sref">match_lenp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=limit" class="sref">limitp/a>, &pa href="+code=shift" class="sref">shiftp/a>); o475p/a>
	matchlenp/a>) o476p/a>
	o477p/a>
	matchoffp/a> = pa href="+code=dptr" class="sref">dptrp/a> - pa href="+code=start" class="sref">startp/a> + pa href="+code=shift" class="sref">shiftp/a>; o478p/a>
	o479p/a>
	o480p/a>
	o481p/a>} o482p/a>pa href="+code=EXPORT_SYMBOL_GPL" class="sref">EXPORT_SYMBOL_GPLp/a>(pa href="+code=co_sip_get_header" class="sref">ct_sip_get_headerp/a>); o483p/a> o484p/a>pspa
 class="comment">/* Get next header field in a list of comma separated values */p/spa
  o485p/a>static int pa href="+code=ct_sip_next_header" class="sref">ct_sip_next_headerp/a>(const struct pa href="+code=nf_conn" class="sref">nf_connp/a>
*pa href="+code=co" class="sref">ctp/a>, const char *pa href="+code=dptr" class="sref">dptrp/a>, o486p/a>
	dataoffp/a>, unsigned int pa href="+code=datalen" class="sref">datalenp/a>, o487p/a>
	sip_header_typesp/a>
pa href="+code=type" class="sref">typep/a>, o488p/a>
	matchoffp/a>, unsigned int *pa href="+code=matchlen" class="sref">matchlenp/a>) o489p/a>{ o490p/a>
	sip_headerp/a>
*pa href="+code=hdr" class="sref">hdrp/a> = &pa href="+code=co_sip_hdrs" class="sref">co_sip_hdrsp/a>[pa href="+code=type" class="sref">typep/a>]; o491p/a>
	startp/a> = pa href="+code=dptr" class="sref">dptrp/a>, *pa href="+code=limit" class="sref">limitp/a> = pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=datalen" class="sref">datalenp/a>; o492p/a>
	shiftp/a> = 0; o493p/a> o494p/a>
	dptrp/a> += pa href="+code=dataoff" class="sref">dataoffp/a>; o495p/a> o496p/a>
	dptrp/a> = pa href="+code=co_sip_header_search" class="sref">co_sip_header_searchp/a>(pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=limit" class="sref">limitp/a>, pspa
 class="string">","p/spa
 , pa href="+code=strlen" class="sref">strlenp/a>(pspa
 class="string">","p/spa
 )); o497p/a>
	dptrp/a>) o498p/a>
	o499p/a> o500p/a>
	dptrp/a> = pa href="+code=co_sip_header_search" class="sref">co_sip_header_searchp/a>(pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=limit" class="sref">limitp/a>, pa href="+code=hdr" class="sref">hdrp/a>->pa href="+code=search" class="sref">searchp/a>, pa href="+code=hdr" class="sref">hdrp/a>->pa href="+code=slen" class="sref">slenp/a>); o501p/a>
	dptrp/a>) o502p/a>
	o503p/a>
	dptrp/a> += pa href="+code=hdr" class="sref">hdrp/a>->pa href="+code=slen" class="sref">slenp/a>; o504p/a> o505p/a>
	matchoffp/a> = pa href="+code=dptr" class="sref">dptrp/a> - pa href="+code=start" class="sref">startp/a>; o506p/a>
	matchlenp/a> = pa href="+code=hdr" class="sref">hdrp/a>->pa href="+code=match_len" class="sref">match_lenp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=limit" class="sref">limitp/a>, &pa href="+code=shift" class="sref">shiftp/a>); o507p/a>
	matchlenp/a>) o508p/a>
	o509p/a>
	matchoffp/a> += pa href="+code=shift" class="sref">shiftp/a>; o510p/a>
	o511p/a>} o512p/a> o513p/a>pspa
 class="comment">/* Walk through headers until a parsable one is found or no header of thep/spa
  o514p/a>pspa
 class="comment"> * given type is left. */p/spa
  o515p/a>static int pa href="+code=ct_sip_walk_headers" class="sref">co_sip_walk_headersp/a>(const struct pa href="+code=nf_conn" class="sref">nf_connp/a>
*pa href="+code=co" class="sref">ctp/a>, const char *pa href="+code=dptr" class="sref">dptrp/a>, o516p/a>
	dataoffp/a>, unsigned int pa href="+code=datalen" class="sref">datalenp/a>, o517p/a>
	sip_header_typesp/a>
pa href="+code=type" class="sref">typep/a>, int *pa href="+code=in_header" class="sref">in_headerp/a>, o518p/a>
	matchoffp/a>, unsigned int *pa href="+code=matchlen" class="sref">matchlenp/a>) o519p/a>{ o520p/a>
	retp/a>; o521p/a> o522p/a>
	in_headerp/a> && *pa href="+code=in_header" class="sref">in_headerp/a>) { o523p/a>
	o524p/a>
	retp/a> = pa href="+code=co_sip_next_header" class="sref">ct_sip_next_headerp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=dataoff" class="sref">dataoffp/a>, pa href="+code=datalen" class="sref">datalenp/a>, o525p/a>
	typep/a>, pa href="+code=matchoff" class="sref">matchoffp/a>, pa href="+code=matchlen" class="sref">matchlenp/a>); o526p/a>
	retp/a> > 0) o527p/a>
	retp/a>; o528p/a>
	retp/a> == 0) o529p/a>
	o530p/a>
	dataoffp/a> += *pa href="+code=matchoff" class="sref">matchoffp/a>; o531p/a>
	o532p/a>
	in_headerp/a> = 0; o533p/a>
	o534p/a> o535p/a>
	o536p/a>
	retp/a> = pa href="+code=co_sip_get_header" class="sref">ct_sip_get_headerp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=dataoff" class="sref">dataoffp/a>, pa href="+code=datalen" class="sref">datalenp/a>, o537p/a>
	typep/a>, pa href="+code=matchoff" class="sref">matchoffp/a>, pa href="+code=matchlen" class="sref">matchlenp/a>); o538p/a>
	retp/a> > 0) o539p/a>
	o540p/a>
	retp/a> == 0) o541p/a>
	retp/a>; o542p/a>
	dataoffp/a> += *pa href="+code=matchoff" class="sref">matchoffp/a>; o543p/a>
	o544p/a> o545p/a>
	in_headerp/a>) o546p/a>
	in_headerp/a> = 1; o547p/a>
	o548p/a>} o549p/a> o550p/a>pspa
 class="comment">/* Locate a SIP header, parse the URI and return the offset and length ofp/spa
  o551p/a>pspa
 class="comment"> * the address as well as the address and port themselves. A stream ofp/spa
  o552p/a>pspa
 class="comment"> * headers ca
 be parsed by handing in a non-NULL datalen and in_headerp/spa
  o553p/a>pspa
 class="comment"> * pointer.p/spa
  o554p/a>pspa
 class="comment"> */p/spa
  o555p/a>int pa href="+code=ct_sip_parse_header_uri" class="sref">ct_sip_parse_header_urip/a>(const struct pa href="+code=nf_conn" class="sref">nf_connp/a>
*pa href="+code=co" class="sref">ctp/a>, const char *pa href="+code=dptr" class="sref">dptrp/a>, o556p/a>
	dataoffp/a>, unsigned int pa href="+code=datalen" class="sref">datalenp/a>, o557p/a>
	sip_header_typesp/a>
pa href="+code=type" class="sref">typep/a>, int *pa href="+code=in_header" class="sref">in_headerp/a>, o558p/a>
	matchoffp/a>, unsigned int *pa href="+code=matchlen" class="sref">matchlenp/a>, o559p/a>
	nf_inet_addrp/a>
*pa href="+code=addr" class="sref">addrp/a>, pa href="+code=__be16" class="sref">__be16p/a>
*pa href="+code=port" class="sref">portp/a>) o560p/a>{ o561p/a>
	cp/a>, *pa href="+code=limit" class="sref">limitp/a> = pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=datalen" class="sref">datalenp/a>; o562p/a>
	pp/a>; o563p/a>
	retp/a>; o564p/a> o565p/a>
	retp/a> = pa href="+code=co_sip_walk_headers" class="sref">co_sip_walk_headersp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=dataoff" class="sref">dataoffp/a> ? *pa href="+code=dataoff" class="sref">dataoffp/a> : 0, pa href="+code=datalen" class="sref">datalenp/a>, o566p/a>
	typep/a>, pa href="+code=in_header" class="sref">in_headerp/a>, pa href="+code=matchoff" class="sref">matchoffp/a>, pa href="+code=matchlen" class="sref">matchlenp/a>); o567p/a>
	WARN_ONp/a>(pa href="+code=ret" class="sref">retp/a> < 0); o568p/a>
	retp/a> == 0) o569p/a>
	retp/a>; o570p/a> o571p/a>
	sip_parse_addrp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=dptr" class="sref">dptrp/a> + *pa href="+code=matchoff" class="sref">matchoffp/a>, &pa href="+code=c" class="sref">cp/a>, pa href="+code=addr" class="sref">addrp/a>, pa href="+code=limit" class="sref">limitp/a>, pa href="+code=true" class="sref">truep/a>)) o572p/a>
	o573p/a>
	cp/a> == pspa
 class="string">':'p/spa
 ) { o574p/a>
	cp/a>++; o575p/a>
	pp/a> = pa href="+code=simple_strtoul" class="sref">simple_strtoulp/a>(pa href="+code=c" class="sref">cp/a>, (char **)&pa href="+code=c" class="sref">cp/a>, 10); o576p/a>
	pp/a> < 1024 || pa href="+code=p" class="sref">pp/a> > 65535) o577p/a>
	o578p/a>
	portp/a> = pa href="+code=htons" class="sref">htonsp/a>(pa href="+code=p" class="sref">pp/a>); o579p/a>
	o580p/a>
	portp/a> = pa href="+code=htons" class="sref">htonsp/a>(pa href="+code=SIP_PORT" class="sref">SIP_PORTp/a>); o581p/a> o582p/a>
	dataoffp/a>) o583p/a>
	dataoffp/a> = pa href="+code=c" class="sref">cp/a> - pa href="+code=dptr" class="sref">dptrp/a>; o584p/a>
	o585p/a>} o586p/a>pa href="+code=EXPORT_SYMBOL_GPL" class="sref">EXPORT_SYMBOL_GPLp/a>(pa href="+code=co_sip_parse_header_uri" class="sref">ct_sip_parse_header_urip/a>); o587p/a> o588p/a>static int pa href="+code=ct_sip_parse_param" class="sref">ct_sip_parse_paramp/a>(const struct pa href="+code=nf_conn" class="sref">nf_connp/a>
*pa href="+code=co" class="sref">ctp/a>, const char *pa href="+code=dptr" class="sref">dptrp/a>, o589p/a>
	dataoffp/a>, unsigned int pa href="+code=datalen" class="sref">datalenp/a>, o590p/a>
	namep/a>, o591p/a>
	matchoffp/a>, unsigned int *pa href="+code=matchlen" class="sref">matchlenp/a>) o592p/a>{ o593p/a>
	limitp/a> = pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=datalen" class="sref">datalenp/a>; o594p/a>
	startp/a>; o595p/a>
	endp/a>; o596p/a> o597p/a>
	limitp/a> = pa href="+code=co_sip_header_search" class="sref">co_sip_header_searchp/a>(pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=dataoff" class="sref">dataoffp/a>, pa href="+code=limit" class="sref">limitp/a>, pspa
 class="string">","p/spa
 , pa href="+code=strlen" class="sref">strlenp/a>(pspa
 class="string">","p/spa
 )); o598p/a>
	limitp/a>) o599p/a>
	limitp/a> = pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=datalen" class="sref">datalenp/a>; o600p/a> o601p/a>
	startp/a> = pa href="+code=co_sip_header_search" class="sref">co_sip_header_searchp/a>(pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=dataoff" class="sref">dataoffp/a>, pa href="+code=limit" class="sref">limitp/a>, pa href="+code=nam"" class="sref">namep/a>, pa href="+code=strlen" class="sref">strlenp/a>(pa href="+code=nam"" class="sref">namep/a>)); o602p/a>
	startp/a>) o603p/a>
	o604p/a>
	startp/a> += pa href="+code=strlen" class="sref">strlenp/a>(pa href="+code=nam"" class="sref">namep/a>); o605p/a> o606p/a>
	endp/a> = pa href="+code=co_sip_header_search" class="sref">co_sip_header_searchp/a>(pa href="+code=start" class="sref">startp/a>, pa href="+code=limit" class="sref">limitp/a>, pspa
 class="string">";"p/spa
 , pa href="+code=strlen" class="sref">strlenp/a>(pspa
 class="string">";"p/spa
 )); o607p/a>
	endp/a>) o608p/a>
	endp/a> = pa href="+code=limit" class="sref">limitp/a>; o609p/a> o610p/a>
	matchoffp/a> = pa href="+code=start" class="sref">startp/a> - pa href="+code=dptr" class="sref">dptrp/a>; o611p/a>
	matchlenp/a> = pa href="+code=end" class="sref">endp/a> - pa href="+code=start" class="sref">startp/a>; o612p/a>
	o613p/a>} o614p/a> o615p/a>pspa
 class="comment">/* Parse address from header parameter and return address, offset and length */p/spa
  o616p/a>int pa href="+code=ct_sip_parse_address_param" class="sref">ct_sip_parse_address_paramp/a>(const struct pa href="+code=nf_conn" class="sref">nf_connp/a>
*pa href="+code=co" class="sref">ctp/a>, const char *pa href="+code=dptr" class="sref">dptrp/a>, o617p/a>
	dataoffp/a>, unsigned int pa href="+code=datalen" class="sref">datalenp/a>, o618p/a>
	namep/a>, o619p/a>
	matchoffp/a>, unsigned int *pa href="+code=matchlen" class="sref">matchlenp/a>, o620p/a>
	nf_inet_addrp/a>
*pa href="+code=addr" class="sref">addrp/a>, pa href="+code=bool" class="sref">boolp/a>
pa href="+code=delim" class="sref">delimp/a>) o621p/a>{ o622p/a>
	limitp/a> = pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=datalen" class="sref">datalenp/a>; o623p/a>
	startp/a>, *pa href="+code=end" class="sref">endp/a>; o624p/a> o625p/a>
	limitp/a> = pa href="+code=co_sip_header_search" class="sref">co_sip_header_searchp/a>(pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=dataoff" class="sref">dataoffp/a>, pa href="+code=limit" class="sref">limitp/a>, pspa
 class="string">","p/spa
 , pa href="+code=strlen" class="sref">strlenp/a>(pspa
 class="string">","p/spa
 )); o626p/a>
	limitp/a>) o627p/a>
	limitp/a> = pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=datalen" class="sref">datalenp/a>; o628p/a> o629p/a>
	startp/a> = pa href="+code=co_sip_header_search" class="sref">co_sip_header_searchp/a>(pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=dataoff" class="sref">dataoffp/a>, pa href="+code=limit" class="sref">limitp/a>, pa href="+code=nam"" class="sref">namep/a>, pa href="+code=strlen" class="sref">strlenp/a>(pa href="+code=nam"" class="sref">namep/a>)); o630p/a>
	startp/a>) o631p/a>
	o632p/a> o633p/a>
	startp/a> += pa href="+code=strlen" class="sref">strlenp/a>(pa href="+code=nam"" class="sref">namep/a>); o634p/a>
	sip_parse_addrp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=start" class="sref">startp/a>, &pa href="+code=end" class="sref">endp/a>, pa href="+code=addr" class="sref">addrp/a>, pa href="+code=limit" class="sref">limitp/a>, pa href="+code=delim" class="sref">delimp/a>)) o635p/a>
	o636p/a>
	matchoffp/a> = pa href="+code=start" class="sref">startp/a> - pa href="+code=dptr" class="sref">dptrp/a>; o637p/a>
	matchlenp/a> = pa href="+code=end" class="sref">endp/a> - pa href="+code=start" class="sref">startp/a>; o638p/a>
	o639p/a>} o640p/a>pa href="+code=EXPORT_SYMBOL_GPL" class="sref">EXPORT_SYMBOL_GPLp/a>(pa href="+code=co_sip_parse_address_param" class="sref">ct_sip_parse_address_paramp/a>); o641p/a> o642p/a>pspa
 class="comment">/* Parse numerical header parameter and return value, offset and length */p/spa
  o643p/a>int pa href="+code=ct_sip_parse_numerical_param" class="sref">ct_sip_parse_numerical_paramp/a>(const struct pa href="+code=nf_conn" class="sref">nf_connp/a>
*pa href="+code=co" class="sref">ctp/a>, const char *pa href="+code=dptr" class="sref">dptrp/a>, o644p/a>
	dataoffp/a>, unsigned int pa href="+code=datalen" class="sref">datalenp/a>, o645p/a>
	namep/a>, o646p/a>
	matchoffp/a>, unsigned int *pa href="+code=matchlen" class="sref">matchlenp/a>, o647p/a>
	valp/a>) o648p/a>{ o649p/a>
	limitp/a> = pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=datalen" class="sref">datalenp/a>; o650p/a>
	startp/a>; o651p/a>
	endp/a>; o652p/a> o653p/a>
	limitp/a> = pa href="+code=co_sip_header_search" class="sref">co_sip_header_searchp/a>(pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=dataoff" class="sref">dataoffp/a>, pa href="+code=limit" class="sref">limitp/a>, pspa
 class="string">","p/spa
 , pa href="+code=strlen" class="sref">strlenp/a>(pspa
 class="string">","p/spa
 )); o654p/a>
	limitp/a>) o655p/a>
	limitp/a> = pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=datalen" class="sref">datalenp/a>; o656p/a> o657p/a>
	startp/a> = pa href="+code=co_sip_header_search" class="sref">co_sip_header_searchp/a>(pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=dataoff" class="sref">dataoffp/a>, pa href="+code=limit" class="sref">limitp/a>, pa href="+code=nam"" class="sref">namep/a>, pa href="+code=strlen" class="sref">strlenp/a>(pa href="+code=nam"" class="sref">namep/a>)); o658p/a>
	startp/a>) o659p/a>
	o660p/a> o661p/a>
	startp/a> += pa href="+code=strlen" class="sref">strlenp/a>(pa href="+code=nam"" class="sref">namep/a>); o662p/a>
	valp/a> = pa href="+code=simple_strtoul" class="sref">simple_strtoulp/a>(pa href="+code=start" class="sref">startp/a>, &pa href="+code=end" class="sref">endp/a>, 0); o663p/a>
	startp/a> == pa href="+code=end" class="sref">endp/a>) o664p/a>
	o665p/a>
	matchoffp/a> && pa href="+code=matchlen" class="sref">matchlenp/a>) { o666p/a>
	matchoffp/a> = pa href="+code=start" class="sref">startp/a> - pa href="+code=dptr" class="sref">dptrp/a>; o667p/a>
	matchlenp/a> = pa href="+code=end" class="sref">endp/a> - pa href="+code=start" class="sref">startp/a>; o668p/a>
	o669p/a>
	o670p/a>} o671p/a>pa href="+code=EXPORT_SYMBOL_GPL" class="sref">EXPORT_SYMBOL_GPLp/a>(pa href="+code=co_sip_parse_numerical_param" class="sref">ct_sip_parse_numerical_paramp/a>); o672p/a> o673p/a>static int pa href="+code=ct_sip_parse_transport" class="sref">ct_sip_parse_transportp/a>(struct pa href="+code=nf_conn" class="sref">nf_connp/a>
*pa href="+code=co" class="sref">ctp/a>, const char *pa href="+code=dptr" class="sref">dptrp/a>, o674p/a>
	dataoffp/a>, unsigned int pa href="+code=datalen" class="sref">datalenp/a>, o675p/a>
	u8p/a>
*pa href="+code=proto" class="sref">protop/a>) o676p/a>{ o677p/a>
	matchoffp/a>, pa href="+code=matchlen" class="sref">matchlenp/a>; o678p/a> o679p/a>
	ct_sip_parse_paramp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=dataoff" class="sref">dataoffp/a>, pa href="+code=datalen" class="sref">datalenp/a>, pspa
 class="string">"transport="p/spa
 , o680p/a>
	matchoffp/a>, &pa href="+code=matchlen" class="sref">matchlenp/a>)) { o681p/a>
	strnicmpp/a>(pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=matchoff" class="sref">matchoffp/a>, pspa
 class="string">"TCP"p/spa
 , pa href="+code=strlen" class="sref">strlenp/a>(pspa
 class="string">"TCP"p/spa
 ))) o682p/a>
	protop/a> = pa href="+code=IPPROTO_TCP" class="sref">IPPROTO_TCPp/a>; o683p/a>
	strnicmpp/a>(pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=matchoff" class="sref">matchoffp/a>, pspa
 class="string">"UDP"p/spa
 , pa href="+code=strlen" class="sref">strlenp/a>(pspa
 class="string">"UDP"p/spa
 ))) o684p/a>
	protop/a> = pa href="+code=IPPROTO_UDP" class="sref">IPPROTO_UDPp/a>; o685p/a>
	o686p/a>
	o687p/a> o688p/a>
	protop/a> != pa href="+code=nf_ct_protonum" class="sref">nf_ct_protonump/a>(pa href="+code=co" class="sref">ctp/a>)) o689p/a>
	o690p/a>
	o691p/a>
	protop/a> = pa href="+code=nf_ct_protonum" class="sref">nf_ct_protonump/a>(pa href="+code=co" class="sref">ctp/a>); o692p/a> o693p/a>
	o694p/a>} o695p/a> o696p/a>static int pa href="+code=sdp_parse_addr" class="sref">sdp_parse_addrp/a>(const struct pa href="+code=nf_conn" class="sref">nf_connp/a>
*pa href="+code=co" class="sref">ctp/a>, const char *pa href="+code=cp" class="sref">cpp/a>, o697p/a>
	endpp/a>, union pa href="+code=nf_inet_addr" class="sref">nf_inet_addrp/a>
*pa href="+code=addr" class="sref">addrp/a>, o698p/a>
	limitp/a>) o699p/a>{ o700p/a>
	endp/a>; o701p/a>
	retp/a>; o702p/a> o703p/a>
	memsetp/a>(pa href="+code=addr" class="sref">addrp/a>, 0, sizeof(*pa href="+code=addr" class="sref">addrp/a>)); o704p/a>
	nf_ct_l3nump/a>(pa href="+code=co" class="sref">ctp/a>)) { o705p/a>
	AF_INETp/a>: o706p/a>
	retp/a> = pa href="+code=in4_pton" class="sref">in4_ptonp/a>(pa href="+code=cp" class="sref">cpp/a>, pa href="+code=limit" class="sref">limitp/a> - pa href="+code=cp" class="sref">cpp/a>, (pa href="+code=u8" class="sref">u8p/a>
*)&pa href="+code=addr" class="sref">addrp/a>->pa href="+code=ip" class="sref">ipp/a>, -1, &pa href="+code=end" class="sref">endp/a>); o707p/a>
	o708p/a>
	AF_INET6p/a>: o709p/a>
	retp/a> = pa href="+code=in6_pton" class="sref">in6_ptonp/a>(pa href="+code=cp" class="sref">cpp/a>, pa href="+code=limit" class="sref">limitp/a> - pa href="+code=cp" class="sref">cpp/a>, (pa href="+code=u8" class="sref">u8p/a>
*)&pa href="+code=addr" class="sref">addrp/a>->pa href="+code=ip6" class="sref">ip6p/a>, -1, &pa href="+code=end" class="sref">endp/a>); o710p/a>
	o711p/a>
	o712p/a>
	BUGp/a>(); o713p/a>
	o714p/a> o715p/a>
	retp/a> == 0) o716p/a>
	o717p/a>
	endpp/a>) o718p/a>
	endpp/a> = pa href="+code=end" class="sref">endp/a>; o719p/a>
	o720p/a>} o721p/a> o722p/a>pspa
 class="comment">/* skip ip address. returns its length. */p/spa
  o723p/a>static int pa href="+code=sdp_addr_len" class="sref">sdp_addr_lenp/a>(const struct pa href="+code=nf_conn" class="sref">nf_connp/a>
*pa href="+code=co" class="sref">ctp/a>, const char *pa href="+code=dptr" class="sref">dptrp/a>, o724p/a>
	limitp/a>, int *pa href="+code=shift" class="sref">shiftp/a>) o725p/a>{ o726p/a>
	nf_inet_addrp/a>
pa href="+code=addr" class="sref">addrp/a>; o727p/a>
	auxp/a> = pa href="+code=dptr" class="sref">dptrp/a>; o728p/a> o729p/a>
	sdp_parse_addrp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=dptr" class="sref">dptrp/a>, &pa href="+code=dptr" class="sref">dptrp/a>, &pa href="+code=addr" class="sref">addrp/a>, pa href="+code=limit" class="sref">limitp/a>)) { o730p/a>
	pr_debugp/a>(pspa
 class="string">"ip: %s parse failed.!\n"p/spa
 , pa href="+code=dptr" class="sref">dptrp/a>); o731p/a>
	o732p/a>
	o733p/a> o734p/a>
	dptrp/a> - pa href="+code=aux" class="sref">auxp/a>; o735p/a>} o736p/a> o737p/a>pspa
 class="comment">/* SDP header parsing: a SDP session description contains a
 ordered set ofp/spa
  o738p/a>pspa
 class="comment"> * headers, starting with a section containing general session parameters,p/spa
  o739p/a>pspa
 class="comment"> * optionally followed by multiple media descriptions.p/spa
  o740p/a>pspa
 class="comment"> *p/spa
  o741p/a>pspa
 class="comment"> * SDP headers always start at the beginning of a line. According to RFC 2327:p/spa
  o742p/a>pspa
 class="comment"> * "The sequence CRLF (0x0d0a) is used to end a record, although parsers shouldp/spa
  o743p/a>pspa
 class="comment"> * be tolerant and also accept records terminated with a single newlinep/spa
  o744p/a>pspa
 class="comment"> * character". We handle both cases.p/spa
  o745p/a>pspa
 class="comment"> */p/spa
  o746p/a>static const struct pa href="+code=sip_header" class="sref">sip_headerp/a>
pa href="+code=ct_sdp_hdrs_v4" class="sref">ct_sdp_hdrs_v4p/a>[] = { o747p/a>
	SDP_HDR_VERSIONp/a>]	SDP_HDRp/a>(pspa
 class="string">"v="p/spa
 , pa href="+code=NULL" class="sref">NULLp/a>, pa href="+code=digits_len" class="sref">digits_lenp/a>), o748p/a>
	SDP_HDR_OWNERp/a>]	SDP_HDRp/a>(pspa
 class="string">"o="p/spa
 , pspa
 class="string">"IN IP4 "p/spa
 , pa href="+code=sdp_addr_len" class="sref">sdp_addr_lenp/a>), o749p/a>
	SDP_HDR_CONNECTIONp/a>]	SDP_HDRp/a>(pspa
 class="string">"c="p/spa
 , pspa
 class="string">"IN IP4 "p/spa
 , pa href="+code=sdp_addr_len" class="sref">sdp_addr_lenp/a>), o750p/a>
	SDP_HDR_MEDIAp/a>]	SDP_HDRp/a>(pspa
 class="string">"m="p/spa
 , pa href="+code=NULL" class="sref">NULLp/a>, pa href="+code=media_len" class="sref">media_lenp/a>), o751p/a>}; o752p/a> o753p/a>static const struct pa href="+code=sip_header" class="sref">sip_headerp/a>
pa href="+code=ct_sdp_hdrs_v6" class="sref">ct_sdp_hdrs_v6p/a>[] = { o754p/a>
	SDP_HDR_VERSIONp/a>]	SDP_HDRp/a>(pspa
 class="string">"v="p/spa
 , pa href="+code=NULL" class="sref">NULLp/a>, pa href="+code=digits_len" class="sref">digits_lenp/a>), o755p/a>
	SDP_HDR_OWNERp/a>]	SDP_HDRp/a>(pspa
 class="string">"o="p/spa
 , pspa
 class="string">"IN IP6 "p/spa
 , pa href="+code=sdp_addr_len" class="sref">sdp_addr_lenp/a>), o756p/a>
	SDP_HDR_CONNECTIONp/a>]	SDP_HDRp/a>(pspa
 class="string">"c="p/spa
 , pspa
 class="string">"IN IP6 "p/spa
 , pa href="+code=sdp_addr_len" class="sref">sdp_addr_lenp/a>), o757p/a>
	SDP_HDR_MEDIAp/a>]	SDP_HDRp/a>(pspa
 class="string">"m="p/spa
 , pa href="+code=NULL" class="sref">NULLp/a>, pa href="+code=media_len" class="sref">media_lenp/a>), o758p/a>}; o759p/a> o760p/a>pspa
 class="comment">/* Linear string search within SDP header values */p/spa
  o761p/a>static const char *pa href="+code=ct_sdp_header_search" class="sref">co_sdp_header_searchp/a>(const char *pa href="+code=dptr" class="sref">dptrp/a>, const char *pa href="+code=limit" class="sref">limitp/a>, o762p/a>
	needl"p/a>, unsigned int pa href="+code=len" class="sref">lenp/a>) o763p/a>{ o764p/a>
	limitp/a> -= pa href="+code=len" class="sref">lenp/a>; pa href="+code=dptr" class="sref">dptrp/a> < pa href="+code=limit" class="sref">limitp/a>; pa href="+code=dptr" class="sref">dptrp/a>++) { o765p/a>
	dptrp/a> == pspa
 class="string">'\r'p/spa
  || *pa href="+code=dptr" class="sref">dptrp/a> == pspa
 class="string">'\n'p/spa
 ) o766p/a>
	o767p/a>
	strncmpp/a>(pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=needl"" class="sref">needl"p/a>, pa href="+code=len" class="sref">lenp/a>) == 0) o768p/a>
	dptrp/a>; o769p/a>
	o770p/a>
	NULLp/a>; o771p/a>} o772p/a> o773p/a>pspa
 class="comment">/* Locate a SDP header (optionally a substring within the header value),p/spa
  o774p/a>pspa
 class="comment"> * optionally stopping at the first occurrence of the term header, parsep/spa
  o775p/a>pspa
 class="comment"> * it and return the offset and length of the data we're interested in.p/spa
  o776p/a>pspa
 class="comment"> */p/spa
  o777p/a>int pa href="+code=ct_sip_geo_sdp_header" class="sref">co_sip_geo_sdp_headerp/a>(const struct pa href="+code=nf_conn" class="sref">nf_connp/a>
*pa href="+code=co" class="sref">ctp/a>, const char *pa href="+code=dptr" class="sref">dptrp/a>, o778p/a>
	dataoffp/a>, unsigned int pa href="+code=datalen" class="sref">datalenp/a>, o779p/a>
	sdp_header_typesp/a>
pa href="+code=type" class="sref">typep/a>, o780p/a>
	sdp_header_typesp/a>
pa href="+code=term" class="sref">termp/a>, o781p/a>
	matchoffp/a>, unsigned int *pa href="+code=matchlen" class="sref">matchlenp/a>) o782p/a>{ o783p/a>
	sip_headerp/a>
*pa href="+code=hdrs" class="sref">hdrsp/a>, *pa href="+code=hdr" class="sref">hdrp/a>, *pa href="+code=thdr" class="sref">thdrp/a>; o784p/a>
	startp/a> = pa href="+code=dptr" class="sref">dptrp/a>, *pa href="+code=limit" class="sref">limitp/a> = pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=datalen" class="sref">datalenp/a>; o785p/a>
	shiftp/a> = 0; o786p/a> o787p/a>
	hdrsp/a> = pa href="+code=nf_ct_l3num" class="sref">nf_ct_l3nump/a>(pa href="+code=co" class="sref">ctp/a>) == pa href="+code=NFPROTO_IPV4" class="sref">NFPROTO_IPV4p/a> ?
pa href="+code=ct_sdp_hdrs_v4" class="sref">ct_sdp_hdrs_v4p/a> :
pa href="+code=ct_sdp_hdrs_v6" class="sref">ct_sdp_hdrs_v6p/a>; o788p/a>
	hdrp/a> = &pa href="+code=hdrs" class="sref">hdrsp/a>[pa href="+code=type" class="sref">typep/a>]; o789p/a>
	thdrp/a> = &pa href="+code=hdrs" class="sref">hdrsp/a>[pa href="+code=term" class="sref">termp/a>]; o790p/a> o791p/a>
	dptrp/a> += pa href="+code=dataoff" class="sref">dataoffp/a>; pa href="+code=dptr" class="sref">dptrp/a> < pa href="+code=limit" class="sref">limitp/a>; pa href="+code=dptr" class="sref">dptrp/a>++) { o792p/a>
	/* Find beginning of line */p/spa
  o793p/a>
	dptrp/a> != pspa
 class="string">'\r'p/spa
  && *pa href="+code=dptr" class="sref">dptrp/a> != pspa
 class="string">'\n'p/spa
 ) o794p/a>
	o795p/a>
	dptrp/a> >= pa href="+code=limit" class="sref">limitp/a>) o796p/a>
	o797p/a>
	dptrp/a> - 1) == pspa
 class="string">'\r'p/spa
  && *pa href="+code=dptr" class="sref">dptrp/a> == pspa
 class="string">'\n'p/spa
 ) { o798p/a>
	dptrp/a> >= pa href="+code=limit" class="sref">limitp/a>) o799p/a>
	o800p/a>
	o801p/a> o802p/a>
	termp/a> != pa href="+code=SDP_HDR_UNSPEC" class="sref">SDP_HDR_UNSPECp/a> && o803p/a>
	limitp/a> - pa href="+code=dptr" class="sref">dptrp/a> >= pa href="+code=thdr" class="sref">thdrp/a>->pa href="+code=len" class="sref">lenp/a> && o804p/a>
	strnicmpp/a>(pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=thdr" class="sref">thdrp/a>->pa href="+code=nam"" class="sref">namep/a>, pa href="+code=thdr" class="sref">thdrp/a>->pa href="+code=len" class="sref">lenp/a>) == 0) o805p/a>
	o806p/a>
	limitp/a> - pa href="+code=dptr" class="sref">dptrp/a> >= pa href="+code=hdr" class="sref">hdrp/a>->pa href="+code=len" class="sref">lenp/a> && o807p/a>
	strnicmpp/a>(pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=hdr" class="sref">hdrp/a>->pa href="+code=nam"" class="sref">namep/a>, pa href="+code=hdr" class="sref">hdrp/a>->pa href="+code=len" class="sref">lenp/a>) == 0) o808p/a>
	dptrp/a> += pa href="+code=hdr" class="sref">hdrp/a>->pa href="+code=len" class="sref">lenp/a>; o809p/a>
	o810p/a>
	o811p/a> o812p/a>
	matchoffp/a> = pa href="+code=dptr" class="sref">dptrp/a> - pa href="+code=start" class="sref">startp/a>; o813p/a>
	hdrp/a>->pa href="+code=search" class="sref">searchp/a>) { o814p/a>
	dptrp/a> =
pa href="+code=ct_sdp_header_search" class="sref">co_sdp_header_searchp/a>(pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=limit" class="sref">limitp/a>, pa href="+code=hdr" class="sref">hdrp/a>->pa href="+code=search" class="sref">searchp/a>, o815p/a>
	hdrp/a>->pa href="+code=slen" class="sref">slenp/a>); o816p/a>
	dptrp/a>) o817p/a>
	o818p/a>
	dptrp/a> += pa href="+code=hdr" class="sref">hdrp/a>->pa href="+code=slen" class="sref">slenp/a>; o819p/a>
	o820p/a> o821p/a>
	matchlenp/a> = pa href="+code=hdr" class="sref">hdrp/a>->pa href="+code=match_len" class="sref">match_lenp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=limit" class="sref">limitp/a>, &pa href="+code=shift" class="sref">shiftp/a>); o822p/a>
	matchlenp/a>) o823p/a>
	o824p/a>
	matchoffp/a> = pa href="+code=dptr" class="sref">dptrp/a> - pa href="+code=start" class="sref">startp/a> + pa href="+code=shift" class="sref">shiftp/a>; o825p/a>
	o826p/a>
	o827p/a>
	o828p/a>} o829p/a>pa href="+code=EXPORT_SYMBOL_GPL" class="sref">EXPORT_SYMBOL_GPLp/a>(pa href="+code=co_sip_geo_sdp_header" class="sref">co_sip_geo_sdp_headerp/a>); o830p/a> o831p/a>static int pa href="+code=ct_sip_parse_sdp_addr" class="sref">co_sip_parse_sdp_addrp/a>(const struct pa href="+code=nf_conn" class="sref">nf_connp/a>
*pa href="+code=co" class="sref">ctp/a>, const char *pa href="+code=dptr" class="sref">dptrp/a>, o832p/a>
	dataoffp/a>, unsigned int pa href="+code=datalen" class="sref">datalenp/a>, o833p/a>
	sdp_header_typesp/a>
pa href="+code=type" class="sref">typep/a>, o834p/a>
	sdp_header_typesp/a>
pa href="+code=term" class="sref">termp/a>, o835p/a>
	matchoffp/a>, unsigned int *pa href="+code=matchlen" class="sref">matchlenp/a>, o836p/a>
	nf_inet_addrp/a>
*pa href="+code=addr" class="sref">addrp/a>) o837p/a>{ o838p/a>
	retp/a>; o839p/a> o840p/a>
	retp/a> =
pa href="+code=ct_sip_geo_sdp_header" class="sref">co_sip_geo_sdp_headerp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=dataoff" class="sref">dataoffp/a>, pa href="+code=datalen" class="sref">datalenp/a>, pa href="+code=type" class="sref">typep/a>,
pa href="+code=term" class="sref">termp/a>, o841p/a>
	matchoffp/a>, pa href="+code=matchlen" class="sref">matchlenp/a>); o842p/a>
	retp/a> <= 0) o843p/a>
	retp/a>; o844p/a> o845p/a>
	sdp_parse_addrp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=dptr" class="sref">dptrp/a> + *pa href="+code=matchoff" class="sref">matchoffp/a>, pa href="+code=NULL" class="sref">NULLp/a>, pa href="+code=addr" class="sref">addrp/a>, o846p/a>
	dptrp/a> + *pa href="+code=matchoff" class="sref">matchoffp/a> + *pa href="+code=matchlen" class="sref">matchlenp/a>)) o847p/a>
	o848p/a>
	o849p/a>} o850p/a> o851p/a>static int pa href="+code=refresh_signalling_expectation" class="sref">refresh_signalling_expectationp/a>(struct pa href="+code=nf_conn" class="sref">nf_connp/a>
*pa href="+code=co" class="sref">ctp/a>, o852p/a>
	nf_inet_addrp/a>
*pa href="+code=addr" class="sref">addrp/a>, o853p/a>
	u8p/a>
pa href="+code=proto" class="sref">protop/a>, pa href="+code=__be16" class="sref">__be16p/a>
pa href="+code=port" class="sref">portp/a>, o854p/a>
	expiresp/a>) o855p/a>{ o856p/a>
	nf_conn_helpp/a>
*pa href="+code=help" class="sref">helpp/a>
= pa href="+code=nfco_help" class="sref">nfco_helpp/a>(pa href="+code=co" class="sref">ctp/a>); o857p/a>
	nf_conntrack_expectp/a>
*pa href="+code=exp" class="sref">expp/a>; o858p/a>
	hlist_nodep/a>
*pa href="+code=n" class="sref">np/a>, *pa href="+code=next" class="sref">nextp/a>; o859p/a>
	foundp/a>
= 0; o860p/a> o861p/a>
	spin_lock_bhp/a>(&pa href="+code=nf_conntrack_lock" class="sref">nf_conntrack_lockp/a>); o862p/a>
	hlist_for_each_entry_safep/a>(pa href="+code=exp" class="sref">expp/a>, pa href="+code=n" class="sref">np/a>, pa href="+code=next" class="sref">nextp/a>, &pa href="+code=help" class="sref">helpp/a>->pa href="+code=expectations" class="sref">expectationsp/a>, pa href="+code=lnode" class="sref">lnodep/a>) { o863p/a>
	expp/a>->pa href="+code=class" class="sref">classp/a>
!= pa href="+code=SIP_EXPECT_SIGNALLING" class="sref">SIP_EXPECT_SIGNALLINGp/a>
|| o864p/a>
	nf_inet_addr_cmpp/a>(&pa href="+code=exp" class="sref">expp/a>->pa href="+code=tupl"" class="sref">tupl"p/a>.pa href="+code=dst" class="sref">dstp/a>.pa href="+code=u3" class="sref">u3p/a>, pa href="+code=addr" class="sref">addrp/a>)
|| o865p/a>
	expp/a>->pa href="+code=tupl"" class="sref">tupl"p/a>.pa href="+code=dst" class="sref">dstp/a>.pa href="+code=protonum" class="sref">protonump/a>
!= pa href="+code=proto" class="sref">protop/a>
|| o866p/a>
	expp/a>->pa href="+code=tupl"" class="sref">tupl"p/a>.pa href="+code=dst" class="sref">dstp/a>.pa href="+code=u" class="sref">up/a>.pa href="+code=udp" class="sref">udpp/a>.pa href="+code=port" class="sref">portp/a>
!= pa href="+code=port" class="sref">portp/a>) o867p/a>
	o868p/a>
	del_timerp/a>(&pa href="+code=exp" class="sref">expp/a>->pa href="+code=timeout" class="sref">timeoutp/a>)) o869p/a>
	o870p/a>
	expp/a>->pa href="+code=flags" class="sref">flagsp/a> &= ~pa href="+code=NF_CT_EXPECT_INACTIVE" class="sref">NF_CT_EXPECT_INACTIVEp/a>; o871p/a>
	expp/a>->pa href="+code=timeout" class="sref">timeoutp/a>.pa href="+code=expires" class="sref">expiresp/a>
= pa href="+code=jiffies" class="sref">jiffiesp/a> + pa href="+code=expires" class="sref">expiresp/a>
* pa href="+code=HZ" class="sref">HZp/a>; o872p/a>
	add_timerp/a>(&pa href="+code=exp" class="sref">expp/a>->pa href="+code=timeout" class="sref">timeoutp/a>); o873p/a>
	foundp/a>
= 1; o874p/a>
	o875p/a>
	o876p/a>
	spin_unlock_bhp/a>(&pa href="+code=nf_conntrack_lock" class="sref">nf_conntrack_lockp/a>); o877p/a>
	foundp/a>; o878p/a>} o879p/a> o880p/a>static void pa href="+code=flush_expectations" class="sref">flush_expectationsp/a>(struct pa href="+code=nf_conn" class="sref">nf_connp/a>
*pa href="+code=co" class="sref">ctp/a>, pa href="+code=bool" class="sref">boolp/a>
pa href="+code=media" class="sref">mediap/a>) o881p/a>{ o882p/a>
	nf_conn_helpp/a>
*pa href="+code=help" class="sref">helpp/a>
= pa href="+code=nfco_help" class="sref">nfco_helpp/a>(pa href="+code=co" class="sref">ctp/a>); o883p/a>
	nf_conntrack_expectp/a>
*pa href="+code=exp" class="sref">expp/a>; o884p/a>
	hlist_nodep/a>
*pa href="+code=n" class="sref">np/a>, *pa href="+code=next" class="sref">nextp/a>; o885p/a> o886p/a>
	spin_lock_bhp/a>(&pa href="+code=nf_conntrack_lock" class="sref">nf_conntrack_lockp/a>); o887p/a>
	hlist_for_each_entry_safep/a>(pa href="+code=exp" class="sref">expp/a>, pa href="+code=n" class="sref">np/a>, pa href="+code=next" class="sref">nextp/a>, &pa href="+code=help" class="sref">helpp/a>->pa href="+code=expectations" class="sref">expectationsp/a>, pa href="+code=lnode" class="sref">lnodep/a>) { o888p/a>
	expp/a>->pa href="+code=class" class="sref">classp/a>
!= pa href="+code=SIP_EXPECT_SIGNALLING" class="sref">SIP_EXPECT_SIGNALLINGp/a>) ^
pa href="+code=media" class="sref">mediap/a>) o889p/a>
	o890p/a>
	del_timerp/a>(&pa href="+code=exp" class="sref">expp/a>->pa href="+code=timeout" class="sref">timeoutp/a>)) o891p/a>
	o892p/a>
	nf_ct_unlink_expectp/a>(pa href="+code=exp" class="sref">expp/a>); o893p/a>
	nf_ct_expect_putp/a>(pa href="+code=exp" class="sref">expp/a>); o894p/a>
	mediap/a>) o895p/a>
	o896p/a>
	o897p/a>
	spin_unlock_bhp/a>(&pa href="+code=nf_conntrack_lock" class="sref">nf_conntrack_lockp/a>); o898p/a>} o899p/a> o900p/a>static int pa href="+code=set_expected_rtp_rtcp" class="sref">set_expected_rtp_rtcpp/a>(struct pa href="+code=sk_buff" class="sref">sk_buffp/a>
*pa href="+code=skb" class="sref">skbp/a>, unsigned int pa href="+code=protoff" class="sref">protoffp/a>, o901p/a>
	dataoffp/a>, o902p/a>
	dptrp/a>, unsigned int *pa href="+code=datalen" class="sref">datalenp/a>, o903p/a>
	nf_inet_addrp/a>
*pa href="+code=daddr" class="sref">daddrp/a>, pa href="+code=__be16" class="sref">__be16p/a>
pa href="+code=port" class="sref">portp/a>, o904p/a>
	sip_expectation_classesp/a>
pa href="+code=class" class="sref">classp/a>, o905p/a>
	mediaoffp/a>, unsigned int pa href="+code=medialen" class="sref">medialenp/a>) o906p/a>{ o907p/a>
	nf_conntrack_expectp/a>
*pa href="+code=exp" class="sref">expp/a>, *pa href="+code=rtp_exp" class="sref">rtp_expp/a>, *pa href="+code=rtcp_exp" class="sref">rtcp_expp/a>; o908p/a>
	ip_conntrack_infop/a>
pa href="+code=ctinfo" class="sref">ctinfop/a>; o909p/a>
	nf_connp/a>
*pa href="+code=co" class="sref">ctp/a> = pa href="+code=nf_ct_get" class="sref">nf_ct_getp/a>(pa href="+code=skb" class="sref">skbp/a>, &pa href="+code=ctinfo" class="sref">ctinfop/a>); o910p/a>
	netp/a>
*pa href="+code=net" class="sref">netp/a>
= pa href="+code=nf_ct_net" class="sref">nf_ct_netp/a>(pa href="+code=co" class="sref">ctp/a>); o911p/a>
	ip_conntrack_dirp/a>
pa href="+code=dir" class="sref">dirp/a>
= pa href="+code=CTINFO2DIR" class="sref">CTINFO2DIRp/a>(pa href="+code=coinfo" class="sref">ctinfop/a>); o912p/a>
	nf_inet_addrp/a>
*pa href="+code=saddr" class="sref">saddrp/a>; o913p/a>
	nf_conntrack_tupl"p/a>
pa href="+code=tupl"" class="sref">tupl"p/a>; o914p/a>
	direct_rtpp/a>
= 0, pa href="+code=skip_expect" class="sref">skip_expectp/a>
= 0, pa href="+code=ret" class="sref">retp/a> =
pa href="+code=NF_DROP" class="sref">NF_DROPp/a>; o915p/a>
	u_int16_tp/a>
pa href="+code=base_port" class="sref">base_portp/a>; o916p/a>
	__be16p/a>
pa href="+code=rtp_port" class="sref">rtp_portp/a>, pa href="+code=rtcp_port" class="sref">rtcp_portp/a>; o917p/a>
	typeofp/a>(pa href="+code=nf_nao_sdp_port_hook" class="sref">nf_nao_sdp_port_hookp/a>) pa href="+code=nf_nao_sdp_port" class="sref">nf_nao_sdp_portp/a>; o918p/a>
	typeofp/a>(pa href="+code=nf_nao_sdp_media_hook" class="sref">nf_nao_sdp_media_hookp/a>) pa href="+code=nf_nao_sdp_media" class="sref">nf_nao_sdp_mediap/a>; o919p/a> o920p/a>
	saddrp/a> =
pa href="+code=NULL" class="sref">NULLp/a>; o921p/a>
	sip_direct_mediap/a>) { o922p/a>
	nf_inet_addr_cmpp/a>(pa href="+code=daddr" class="sref">daddrp/a>, &pa href="+code=ct" class="sref">ctp/a>->pa href="+code=tupl"hash" class="sref">tupl"hashp/a>[pa href="+code=dir" class="sref">dirp/a>].pa href="+code=tupl"" class="sref">tupl"p/a>.pa href="+code=src" class="sref">srcp/a>.pa href="+code=u3" class="sref">u3p/a>)) o923p/a>
	NF_ACCEPTp/a>; o924p/a>
	saddrp/a> =
&pa href="+code=ct" class="sref">ctp/a>->pa href="+code=tupl"hash" class="sref">tupl"hashp/a>[!pa href="+code=dir" class="sref">dirp/a>].pa href="+code=tupl"" class="sref">tupl"p/a>.pa href="+code=src" class="sref">srcp/a>.pa href="+code=u3" class="sref">u3p/a>; o925p/a>
	o926p/a> o927p/a>
	/* We need to check whether the registration exists before attemptingp/spa
  o928p/a>pspa
 class="comment">         * to register it since we ca
 see the sam" media description multipl"p/spa
  o929p/a>pspa
 class="comment">         * times on different connections in case multipl" endpoints receiv"p/spa
  o930p/a>pspa
 class="comment">         * the sam" call.p/spa
  o931p/a>pspa
 class="comment">         *p/spa
  o932p/a>pspa
 class="comment">         * RTP optimization: if we find a matching media channel expectationp/spa
  o933p/a>pspa
 class="comment">         * and both the expectation and this connection are SNATed, we assum"p/spa
  o934p/a>pspa
 class="comment">         * both sides ca
 reach each other directly and use the finalp/spa
  o935p/a>pspa
 class="comment">         * destination address from the expectation. We still need to keepp/spa
  o936p/a>pspa
 class="comment">         * the NATed expectations for media that might arriv" from thep/spa
  o937p/a>pspa
 class="comment">         * outside, and additionally need to expect the direct RTP streamp/spa
  o938p/a>pspa
 class="comment">         * in case it passes through us even without NAT.p/spa
  o939p/a>pspa
 class="comment">         */p/spa
  o940p/a>
	memsetp/a>(&pa href="+code=tupl"" class="sref">tupl"p/a>, 0, sizeof(pa href="+code=tupl"" class="sref">tupl"p/a>)); o941p/a>
	saddrp/a>) o942p/a>
	tupl"p/a>.pa href="+code=src" class="sref">srcp/a>.pa href="+code=u3" class="sref">u3p/a> =
*pa href="+code=saddr" class="sref">saddrp/a>; o943p/a>
	tupl"p/a>.pa href="+code=src" class="sref">srcp/a>.pa href="+code=l3num" class="sref">l3nump/a>
	nf_ct_l3nump/a>(pa href="+code=co" class="sref">ctp/a>); o944p/a>
	tupl"p/a>.pa href="+code=dst" class="sref">dstp/a>.pa href="+code=protonum" class="sref">protonump/a>
 o   = pa href="+code=IPPROTO_UDP" class="sref">IPPROTO_UDPp/a>; o945p/a>
	tupl"p/a>.pa href="+code=dst" class="sref">dstp/a>.pa href="+code=u3" class="sref">u3p/a> o          =
*pa href="+code=daddr" class="sref">daddrp/a>; o946p/a>
	tupl"p/a>.pa href="+code=dst" class="sref">dstp/a>.pa href="+code=u" class="sref">up/a>.pa href="+code=udp" class="sref">udpp/a>.pa href="+code=port" class="sref">portp/a>
   = pa href="+code=port" class="sref">portp/a>; o947p/a> o948p/a>
	rcu_read_lockp/a>(); o949p/a>
	o950p/a>
	expp/a> = pa href="+code=__nf_ct_expect_find" class="sref">__nf_ct_expect_findp/a>(pa href="+code=net" class="sref">netp/a>, pa href="+code=nf_ct_zon"" class="sref">nf_ct_zon"p/a>(pa href="+code=co" class="sref">ctp/a>), &pa href="+code=tupl"" class="sref">tupl"p/a>); o951p/a> o952p/a>
	expp/a> || pa href="+code=exp" class="sref">expp/a>->pa href="+code=master" class="sref">masterp/a> ==
pa href="+code=ct" class="sref">ctp/a>
|| o953p/a>
	nfco_helpp/a>(pa href="+code=exp" class="sref">expp/a>->pa href="+code=master" class="sref">masterp/a>)->pa href="+code=helper" class="sref">helperp/a>
!= pa href="+code=nfco_help" class="sref">nfco_helpp/a>(pa href="+code=co" class="sref">ctp/a>)->pa href="+code=helper" class="sref">helperp/a>
|| o954p/a>
	expp/a>->pa href="+code=class" class="sref">classp/a>
!= pa href="+code=class" class="sref">classp/a>) o955p/a>
	o956p/a>#ifdef pa href="+code=CONFIG_NF_NAT_NEEDED" class="sref">CONFIG_NF_NAT_NEEDEDp/a> o957p/a>
	direct_rtpp/a>
&& o958p/a>
	nf_inet_addr_cmpp/a>(&pa href="+code=exp" class="sref">expp/a>->pa href="+code=saved_addr" class="sref">saved_addrp/a>, &pa href="+code=exp" class="sref">expp/a>->pa href="+code=tupl"" class="sref">tupl"p/a>.pa href="+code=dst" class="sref">dstp/a>.pa href="+code=u3" class="sref">u3p/a>)
|| o959p/a>
	expp/a>->pa href="+code=saved_proto" class="sref">saved_protop/a>.pa href="+code=udp" class="sref">udpp/a>.pa href="+code=port" class="sref">portp/a>
!= pa href="+code=exp" class="sref">expp/a>->pa href="+code=tupl"" class="sref">tupl"p/a>.pa href="+code=dst" class="sref">dstp/a>.pa href="+code=u" class="sref">up/a>.pa href="+code=udp" class="sref">udpp/a>.pa href="+code=port" class="sref">portp/a>)
&& o960p/a>
	ctp/a>->pa href="+code=status" class="sref">statusp/a>
& pa href="+code=IPS_NAT_MASK" class="sref">IPS_NAT_MASKp/a>) { o961p/a>
	daddrp/a>                  = pa href="+code=exp" class="sref">expp/a>->pa href="+code=saved_addr" class="sref">saved_addrp/a>; o962p/a>
	tupl"p/a>.pa href="+code=dst" class="sref">dstp/a>.pa href="+code=u3" class="sref">u3p/a> o          =
pa href="+code=exp" class="sref">expp/a>->pa href="+code=saved_addr" class="sref">saved_addrp/a>; o963p/a>
	tupl"p/a>.pa href="+code=dst" class="sref">dstp/a>.pa href="+code=u" class="sref">up/a>.pa href="+code=udp" class="sref">udpp/a>.pa href="+code=port" class="sref">portp/a>
   = pa href="+code=exp" class="sref">expp/a>->pa href="+code=saved_proto" class="sref">saved_protop/a>.pa href="+code=udp" class="sref">udpp/a>.pa href="+code=port" class="sref">portp/a>; o964p/a>
	direct_rtpp/a>
= 1; o965p/a>
	o966p/a>#endif o967p/a>
	skip_expectp/a>
= 1; o968p/a>
	skip_expectp/a>); o969p/a>
	rcu_read_unlockp/a>(); o970p/a> o971p/a>
	base_portp/a> = pa href="+code=ntohs" class="sref">ntohsp/a>(pa href="+code=tupl"" class="sref">tupl"p/a>.pa href="+code=dst" class="sref">dstp/a>.pa href="+code=u" class="sref">up/a>.pa href="+code=udp" class="sref">udpp/a>.pa href="+code=port" class="sref">portp/a>)
& ~1; o972p/a>
	rtp_portp/a> = pa href="+code=htons" class="sref">htonsp/a>(pa href="+code=base_port" class="sref">base_portp/a>); o973p/a>
	rtcp_portp/a> = pa href="+code=htons" class="sref">htonsp/a>(pa href="+code=base_port" class="sref">base_portp/a> + 1); o974p/a> o975p/a>
	direct_rtpp/a>) { o976p/a>
	nf_nao_sdp_portp/a> = pa href="+code=rcu_dereferenc"" class="sref">rcu_dereferenc"p/a>(pa href="+code=nf_nao_sdp_port_hook" class="sref">nf_nao_sdp_port_hookp/a>); o977p/a>
	nf_nao_sdp_portp/a> && o978p/a>
	nf_nao_sdp_portp/a>(pa href="+code=skb" class="sref">skbp/a>, pa href="+code=protoff" class="sref">protoffp/a>, pa href="+code=dataoff" class="sref">dataoffp/a>, pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=datalen" class="sref">datalenp/a>, o979p/a>
	mediaoffp/a>, pa href="+code=medialen" class="sref">medialenp/a>, pa href="+code=ntohs" class="sref">ntohsp/a>(pa href="+code=rtp_port" class="sref">rtp_portp/a>))) o980p/a>
	err1p/a>; o981p/a>
	o982p/a> o983p/a>
	skip_expectp/a>) o984p/a>
	NF_ACCEPTp/a>; o985p/a> o986p/a>
	rtp_expp/a> = pa href="+code=nf_ct_expect_alloc" class="sref">nf_ct_expect_allocp/a>(pa href="+code=co" class="sref">ctp/a>); o987p/a>
	rtp_expp/a> ==
pa href="+code=NULL" class="sref">NULLp/a>) o988p/a>
	err1p/a>; o989p/a>
	nf_ct_expect_initp/a>(pa href="+code=rtp_exp" class="sref">rtp_expp/a>, pa href="+code=class" class="sref">classp/a>, pa href="+code=nf_ct_l3num" class="sref">nf_ct_l3nump/a>(pa href="+code=co" class="sref">ctp/a>), pa href="+code=saddr" class="sref">saddrp/a>, pa href="+code=daddr" class="sref">daddrp/a>, o990p/a>
	IPPROTO_UDPp/a>, pa href="+code=NULL" class="sref">NULLp/a>, &pa href="+code=rtp_port" class="sref">rtp_portp/a>); o991p/a> o992p/a>
	rtcp_expp/a> = pa href="+code=nf_ct_expect_alloc" class="sref">nf_ct_expect_allocp/a>(pa href="+code=co" class="sref">ctp/a>); o993p/a>
	rtcp_expp/a> ==
pa href="+code=NULL" class="sref">NULLp/a>) o994p/a>
	err2p/a>; o995p/a>
	nf_ct_expect_initp/a>(pa href="+code=rtcp_exp" class="sref">rtcp_expp/a>, pa href="+code=class" class="sref">classp/a>, pa href="+code=nf_ct_l3num" class="sref">nf_ct_l3nump/a>(pa href="+code=co" class="sref">ctp/a>), pa href="+code=saddr" class="sref">saddrp/a>, pa href="+code=daddr" class="sref">daddrp/a>, o996p/a>
	IPPROTO_UDPp/a>, pa href="+code=NULL" class="sref">NULLp/a>, &pa href="+code=rtcp_port" class="sref">rtcp_portp/a>); o997p/a> o998p/a>
	nf_nao_sdp_mediap/a> = pa href="+code=rcu_dereferenc"" class="sref">rcu_dereferenc"p/a>(pa href="+code=nf_nao_sdp_media_hook" class="sref">nf_nao_sdp_media_hookp/a>); o999p/a>
	nf_nao_sdp_mediap/a> && pa href="+code=ct" class="sref">ctp/a>->pa href="+code=status" class="sref">statusp/a>
& pa href="+code=IPS_NAT_MASK" class="sref">IPS_NAT_MASKp/a> && !pa href="+code=direct_rtp" class="sref">direct_rtpp/a>) 1000p/a>
	retp/a> =
pa href="+code=nf_nao_sdp_media" class="sref">nf_nao_sdp_mediap/a>(pa href="+code=skb" class="sref">skbp/a>, pa href="+code=protoff" class="sref">protoffp/a>, pa href="+code=dataoff" class="sref">dataoffp/a>, pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=datalen" class="sref">datalenp/a>, 
1001p/a>
	rtp_expp/a>, pa href="+code=rtcp_exp" class="sref">rtcp_expp/a>, 1002p/a>
	mediaoffp/a>, pa href="+code=medialen" class="sref">medialenp/a>, pa href="+code=daddr" class="sref">daddrp/a>); 1003p/a>
	1004p/a>
	nf_ct_expect_relatedp/a>(pa href="+code=rtp_exp" class="sref">rtp_expp/a>) ==
0) { 1005p/a>
	nf_ct_expect_relatedp/a>(pa href="+code=rtcp_exp" class="sref">rtcp_expp/a>)
!= 0) 1006p/a>
	nf_ct_unexpect_relatedp/a>(pa href="+code=rtp_exp" class="sref">rtp_expp/a>); 1007p/a>
	1008p/a>
	retp/a> =
pa href="+code=NF_ACCEPT" class="sref">NF_ACCEPTp/a>; 1009p/a>
	1010p/a>
	1011p/a>
	nf_ct_expect_putp/a>(pa href="+code=rtcp_exp" class="sref">rtcp_expp/a>); 1012p/a>pa href="+code=err2" class="sref">err2p/a>: 1013p/a>
	nf_ct_expect_putp/a>(pa href="+code=rtp_exp" class="sref">rtp_expp/a>); 1014p/a>pa href="+code=err1" class="sref">err1p/a>: 1015p/a>
	retp/a>; 1016p/a>} 1017p/a> 1018p/a>static const struct pa href="+code=sdp_media_type" class="sref">sdp_media_typep/a>
pa href="+code=sdp_media_types" class="sref">sdp_media_typesp/a>[] =
{ 1019p/a>
	SDP_MEDIA_TYPEp/a>(pspa
 class="string">"audio "p/spa
 , pa href="+code=SIP_EXPECT_AUDIO" class="sref">SIP_EXPECT_AUDIOp/a>), 1020p/a>
	SDP_MEDIA_TYPEp/a>(pspa
 class="string">"video "p/spa
 , pa href="+code=SIP_EXPECT_VIDEO" class="sref">SIP_EXPECT_VIDEOp/a>), 1021p/a>
	SDP_MEDIA_TYPEp/a>(pspa
 class="string">"image "p/spa
 , pa href="+code=SIP_EXPECT_IMAGE" class="sref">SIP_EXPECT_IMAGEp/a>), 1022p/a>}; 1023p/a> 1024p/a>static const struct pa href="+code=sdp_media_type" class="sref">sdp_media_typep/a>
*pa href="+code=sdp_media_type" class="sref">sdp_media_typep/a>(const char *pa href="+code=dptr" class="sref">dptrp/a>, 1025p/a>
	matchoffp/a>, 1026p/a>
	matchlenp/a>) 1027p/a>{ 1028p/a>
	sdp_media_typep/a>
*pa href="+code=t" class="sref">tp/a>; 1029p/a>
	ip/a>; 1030p/a> 1031p/a>
	ip/a>
= 0; pa href="+code=i" class="sref">ip/a>
< pa href="+code=ARRAY_SIZE" class="sref">ARRAY_SIZEp/a>(pa href="+code=sdp_media_types" class="sref">sdp_media_typesp/a>); pa href="+code=i" class="sref">ip/a>++) { 1032p/a>
	tp/a> =
&pa href="+code=sdp_media_types" class="sref">sdp_media_typesp/a>[pa href="+code=i" class="sref">ip/a>]; 1033p/a>
	matchlenp/a>
< pa href="+code=t" class="sref">tp/a>->pa href="+code=len" class="sref">lenp/a>
|| 1034p/a>
	strncmpp/a>(pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=matchoff" class="sref">matchoffp/a>, pa href="+code=t" class="sref">tp/a>->pa href="+code=nam"" class="sref">namep/a>, pa href="+code=t" class="sref">tp/a>->pa href="+code=len" class="sref">lenp/a>)) 1035p/a>
	1036p/a>
	tp/a>; 1037p/a>
	1038p/a>
	NULLp/a>; 1039p/a>} 1040p/a> 1041p/a>static int pa href="+code=process_sdp" class="sref">process_sdpp/a>(struct pa href="+code=sk_buff" class="sref">sk_buffp/a>
*pa href="+code=skb" class="sref">skbp/a>, unsigned int pa href="+code=protoff" class="sref">protoffp/a>, 1042p/a>
	dataoffp/a>, 1043p/a>
	dptrp/a>, unsigned int *pa href="+code=datalen" class="sref">datalenp/a>, 1044p/a>
	cseqp/a>) 1045p/a>{ 1046p/a>
	ip_conntrack_infop/a>
pa href="+code=ctinfo" class="sref">ctinfop/a>; 1047p/a>
	nf_connp/a>
*pa href="+code=co" class="sref">ctp/a> = pa href="+code=nf_ct_get" class="sref">nf_ct_getp/a>(pa href="+code=skb" class="sref">skbp/a>, &pa href="+code=ctinfo" class="sref">ctinfop/a>); 1048p/a>
	matchoffp/a>, pa href="+code=matchlen" class="sref">matchlenp/a>; 1049p/a>
	mediaoffp/a>, pa href="+code=medialen" class="sref">medialenp/a>; 1050p/a>
	sdpoffp/a>; 1051p/a>
	caddr_lenp/a>, pa href="+code=maddr_len" class="sref">maddr_lenp/a>; 1052p/a>
	ip/a>; 1053p/a>
	nf_inet_addrp/a>
pa href="+code=caddr" class="sref">caddrp/a>, pa href="+code=maddr" class="sref">maddrp/a>, pa href="+code=rtp_addr" class="sref">rtp_addrp/a>; 1054p/a>
	portp/a>; 1055p/a>
	sdp_media_typep/a>
*pa href="+code=t" class="sref">tp/a>; 1056p/a>
	retp/a> =
pa href="+code=NF_ACCEPT" class="sref">NF_ACCEPTp/a>; 1057p/a>
	typeofp/a>(pa href="+code=nf_nao_sdp_addr_hook" class="sref">nf_nao_sdp_addr_hookp/a>)
pa href="+code=nf_nao_sdp_addr" class="sref">nf_nao_sdp_addrp/a>; 1058p/a>
	typeofp/a>(pa href="+code=nf_nao_sdp_session_hook" class="sref">nf_nao_sdp_session_hookp/a>)
pa href="+code=nf_nao_sdp_session" class="sref">nf_nao_sdp_sessionp/a>; 1059p/a> 1060p/a>
	nf_nao_sdp_addrp/a> = pa href="+code=rcu_dereferenc"" class="sref">rcu_dereferenc"p/a>(pa href="+code=nf_nao_sdp_addr_hook" class="sref">nf_nao_sdp_addr_hookp/a>); 1061p/a> 1062p/a>
	/* Find beginning of session description */p/spa
  1063p/a>
	ct_sip_get_sdp_headerp/a>(pa href="+code=co" class="sref">ctp/a>, *pa href="+code=dptr" class="sref">dptrp/a>, 0, *pa href="+code=datalen" class="sref">datalenp/a>, 1064p/a>
	SDP_HDR_VERSIONp/a>, pa href="+code=SDP_HDR_UNSPEC" class="sref">SDP_HDR_UNSPECp/a>, 1065p/a>
	matchoffp/a>, &pa href="+code=matchlen" class="sref">matchlenp/a>)
<= 0) 1066p/a>
	NF_ACCEPTp/a>; 1067p/a>
	sdpoffp/a> = pa href="+code=matchoff" class="sref">matchoffp/a>; 1068p/a> 1069p/a>
	/* The connection information is contained in the session descriptionp/spa
  1070p/a>pspa
 class="comment">         * and/or once per media description. The first media description marksp/spa
  1071p/a>pspa
 class="comment">         * the end of the session description. */p/spa
  1072p/a>
	caddr_lenp/a>
= 0; 1073p/a>
	ct_sip_parse_sdp_addrp/a>(pa href="+code=co" class="sref">ctp/a>, *pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=sdpoff" class="sref">sdpoffp/a>, *pa href="+code=datalen" class="sref">datalenp/a>, 1074p/a>
	SDP_HDR_CONNECTIONp/a>, pa href="+code=SDP_HDR_MEDIA" class="sref">SDP_HDR_MEDIAp/a>, 1075p/a>
	matchoffp/a>, &pa href="+code=matchlen" class="sref">matchlenp/a>, &pa href="+code=caddr" class="sref">caddrp/a>)
> 0) 1076p/a>
	caddr_lenp/a>
= pa href="+code=matchlen" class="sref">matchlenp/a>; 1077p/a> 1078p/a>
	mediaoffp/a>
= pa href="+code=sdpoff" class="sref">sdpoffp/a>; 1079p/a>
	ip/a>
= 0; pa href="+code=i" class="sref">ip/a>
< pa href="+code=ARRAY_SIZE" class="sref">ARRAY_SIZEp/a>(pa href="+code=sdp_media_types" class="sref">sdp_media_typesp/a>); ) { 1080p/a>
	ct_sip_get_sdp_headerp/a>(pa href="+code=co" class="sref">ctp/a>, *pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=mediaoff" class="sref">mediaoffp/a>, *pa href="+code=datalen" class="sref">datalenp/a>, 1081p/a>
	SDP_HDR_MEDIAp/a>, pa href="+code=SDP_HDR_UNSPEC" class="sref">SDP_HDR_UNSPECp/a>, 1082p/a>
	mediaoffp/a>, &pa href="+code=medialen" class="sref">medialenp/a>)
<= 0) 1083p/a>
	1084p/a> 1085p/a>
	/* Get media type and port number. A media port value of zerop/spa
  1086p/a>pspa
 class="comment">                 * indicates an inactive stream. */p/spa
  1087p/a>
	tp/a>
= pa href="+code=sdp_media_type" class="sref">sdp_media_typep/a>(*pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=mediaoff" class="sref">mediaoffp/a>, pa href="+code=medialen" class="sref">medialenp/a>); 1088p/a>
	tp/a>) { 1089p/a>
	mediaoffp/a>
+= pa href="+code=medialen" class="sref">medialenp/a>; 1090p/a>
	1091p/a>
	1092p/a>
	mediaoffp/a>
+= pa href="+code=t" class="sref">tp/a>->pa href="+code=len" class="sref">lenp/a>; 1093p/a>
	medialenp/a> -= pa href="+code=t" class="sref">tp/a>->pa href="+code=len" class="sref">lenp/a>; 1094p/a> 1095p/a>
	portp/a>
= pa href="+code=simple_strtoul" class="sref">simple_strtoulp/a>(*pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=mediaoff" class="sref">mediaoffp/a>, pa href="+code=NULL" class="sref">NULLp/a>, 10); 1096p/a>
	portp/a>
== 0) 1097p/a>
	1098p/a>
	portp/a>
< 1024 || pa href="+code=port" class="sref">portp/a>
> 65535) 1099p/a>
	NF_DROPp/a>; 1100p/a> 1101p/a>
	/* The media description overrides the session description. */p/spa
  1102p/a>
	maddr_lenp/a>
= 0; 1103p/a>
	ct_sip_parse_sdp_addrp/a>(pa href="+code=co" class="sref">ctp/a>, *pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=mediaoff" class="sref">mediaoffp/a>, *pa href="+code=datalen" class="sref">datalenp/a>, 1104p/a>
	SDP_HDR_CONNECTIONp/a>, pa href="+code=SDP_HDR_MEDIA" class="sref">SDP_HDR_MEDIAp/a>, 1105p/a>
	matchoffp/a>, &pa href="+code=matchlen" class="sref">matchlenp/a>, &pa href="+code=maddr" class="sref">maddrp/a>)
> 0) { 1106p/a>
	maddr_lenp/a>
= pa href="+code=matchlen" class="sref">matchlenp/a>; 1107p/a>
	memcpyp/a>(&pa href="+code=rtp_addr" class="sref">rtp_addrp/a>, &pa href="+code=maddr" class="sref">maddrp/a>, sizeof(pa href="+code=rtp_addr" class="sref">rtp_addrp/a>)); 1108p/a>
	caddr_lenp/a>) 1109p/a>
	memcpyp/a>(&pa href="+code=rtp_addr" class="sref">rtp_addrp/a>, &pa href="+code=caddr" class="sref">caddrp/a>, sizeof(pa href="+code=rtp_addr" class="sref">rtp_addrp/a>)); 1110p/a>
	1111p/a>
	NF_DROPp/a>; 1112p/a> 1113p/a>
	retp/a> =
pa href="+code=set_expected_rtp_rtcp" class="sref">set_expected_rtp_rtcpp/a>(pa href="+code=skb" class="sref">skbp/a>, pa href="+code=protoff" class="sref">protoffp/a>, pa href="+code=dataoff" class="sref">dataoffp/a>, 1114p/a>
	dptrp/a>, pa href="+code=datalen" class="sref">datalenp/a>, 1115p/a>
	rtp_addrp/a>, pa href="+code=htons" class="sref">htonsp/a>(pa href="+code=port" class="sref">portp/a>), pa href="+code=t" class="sref">tp/a>->pa href="+code=class" class="sref">classp/a>, 1116p/a>
	mediaoffp/a>, pa href="+code=medialen" class="sref">medialenp/a>); 1117p/a>
	retp/a> !=
pa href="+code=NF_ACCEPT" class="sref">NF_ACCEPTp/a>) 1118p/a>
	retp/a>; 1119p/a> 1120p/a>
	/* Update media connection address if present */p/spa
  1121p/a>
	maddr_lenp/a>
&& pa href="+code=nf_nao_sdp_addr" class="sref">nf_nao_sdp_addrp/a> && pa href="+code=ct" class="sref">ctp/a>->pa href="+code=status" class="sref">statusp/a>
& pa href="+code=IPS_NAT_MASK" class="sref">IPS_NAT_MASKp/a>) { 1122p/a>
	retp/a> =
pa href="+code=nf_nao_sdp_addr" class="sref">nf_nao_sdp_addrp/a>(pa href="+code=skb" class="sref">skbp/a>, pa href="+code=protoff" class="sref">protoffp/a>, pa href="+code=dataoff" class="sref">dataoffp/a>, 1123p/a>
	dptrp/a>, pa href="+code=datalen" class="sref">datalenp/a>, pa href="+code=mediaoff" class="sref">mediaoffp/a>, 1124p/a>
	SDP_HDR_CONNECTIONp/a>, pa href="+code=SDP_HDR_MEDIA" class="sref">SDP_HDR_MEDIAp/a>, 1125p/a>
	rtp_addrp/a>); 1126p/a>
	retp/a> !=
pa href="+code=NF_ACCEPT" class="sref">NF_ACCEPTp/a>) 1127p/a>
	retp/a>; 1128p/a>
	1129p/a>
	ip/a>++; 1130p/a>
	1131p/a> 1132p/a>
	/* Update session connection and owner addresses */p/spa
  1133p/a>
	nf_nao_sdp_sessionp/a> = pa href="+code=rcu_dereferenc"" class="sref">rcu_dereferenc"p/a>(pa href="+code=nf_nao_sdp_session_hook" class="sref">nf_nao_sdp_session_hookp/a>); 1134p/a>
	nf_nao_sdp_sessionp/a> && pa href="+code=ct" class="sref">ctp/a>->pa href="+code=status" class="sref">statusp/a>
& pa href="+code=IPS_NAT_MASK" class="sref">IPS_NAT_MASKp/a>) 1135p/a>
	retp/a> =
pa href="+code=nf_nao_sdp_session" class="sref">nf_nao_sdp_sessionp/a>(pa href="+code=skb" class="sref">skbp/a>, pa href="+code=protoff" class="sref">protoffp/a>, pa href="+code=dataoff" class="sref">dataoffp/a>, 1136p/a>
	dptrp/a>, pa href="+code=datalen" class="sref">datalenp/a>, pa href="+code=sdpoff" class="sref">sdpoffp/a>, &pa href="+code=rtp_addr" class="sref">rtp_addrp/a>); 1137p/a> 1138p/a>
	retp/a>; 1139p/a>} 1140p/a>static int pa href="+code=process_invite_respons"" class="sref">process_invite_respons"p/a>(struct pa href="+code=sk_buff" class="sref">sk_buffp/a>
*pa href="+code=skb" class="sref">skbp/a>, unsigned int pa href="+code=protoff" class="sref">protoffp/a>, 1141p/a>
	dataoffp/a>, 1142p/a>
	dptrp/a>, unsigned int *pa href="+code=datalen" class="sref">datalenp/a>, 1143p/a>
	cseqp/a>, unsigned int pa href="+code=code" class="sref">codep/a>) 1144p/a>{ 1145p/a>
	ip_conntrack_infop/a>
pa href="+code=ctinfo" class="sref">ctinfop/a>; 1146p/a>
	nf_connp/a>
*pa href="+code=co" class="sref">ctp/a> = pa href="+code=nf_ct_get" class="sref">nf_ct_getp/a>(pa href="+code=skb" class="sref">skbp/a>, &pa href="+code=ctinfo" class="sref">ctinfop/a>); 1147p/a>
	nf_ct_sip_masterp/a>
*pa href="+code=co_sip_info" class="sref">ct_sip_infop/a> = pa href="+code=nfct_help_data" class="sref">nfct_help_datap/a>(pa href="+code=co" class="sref">ctp/a>); 1148p/a> 1149p/a>
	codep/a>
>= 100 && pa href="+code=code" class="sref">codep/a>
<= 199)
|| 1150p/a>
	codep/a>
>= 200 && pa href="+code=code" class="sref">codep/a>
<= 299)) 1151p/a>
	process_sdpp/a>(pa href="+code=skb" class="sref">skbp/a>, pa href="+code=protoff" class="sref">protoffp/a>, pa href="+code=dataoff" class="sref">dataoffp/a>, pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=datalen" class="sref">datalenp/a>, pa href="+code=cseq" class="sref">cseqp/a>); 1152p/a>
	ct_sip_infop/a>->pa href="+code=invite_cseq" class="sref">invite_cseqp/a> == pa href="+code=cseq" class="sref">cseqp/a>) 1153p/a>
	flush_expectationsp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=true" class="sref">truep/a>); 1154p/a>
	NF_ACCEPTp/a>; 1155p/a>} 1156p/a> 1157p/a>static int pa href="+code=process_update_respons"" class="sref">process_update_respons"p/a>(struct pa href="+code=sk_buff" class="sref">sk_buffp/a>
*pa href="+code=skb" class="sref">skbp/a>, unsigned int pa href="+code=protoff" class="sref">protoffp/a>, 1158p/a>
	dataoffp/a>, 1159p/a>
	dptrp/a>, unsigned int *pa href="+code=datalen" class="sref">datalenp/a>, 1160p/a>
	cseqp/a>, unsigned int pa href="+code=code" class="sref">codep/a>) 1161p/a>{ 1162p/a>
	ip_conntrack_infop/a>
pa href="+code=ctinfo" class="sref">ctinfop/a>; 1163p/a>
	nf_connp/a>
*pa href="+code=co" class="sref">ctp/a> = pa href="+code=nf_ct_get" class="sref">nf_ct_getp/a>(pa href="+code=skb" class="sref">skbp/a>, &pa href="+code=ctinfo" class="sref">ctinfop/a>); 1164p/a>
	nf_ct_sip_masterp/a>
*pa href="+code=co_sip_info" class="sref">ct_sip_infop/a> = pa href="+code=nfct_help_data" class="sref">nfct_help_datap/a>(pa href="+code=co" class="sref">ctp/a>); 1165p/a> 1166p/a>
	codep/a>
>= 100 && pa href="+code=code" class="sref">codep/a>
<= 199)
|| 1167p/a>
	codep/a>
>= 200 && pa href="+code=code" class="sref">codep/a>
<= 299)) 1168p/a>
	process_sdpp/a>(pa href="+code=skb" class="sref">skbp/a>, pa href="+code=protoff" class="sref">protoffp/a>, pa href="+code=dataoff" class="sref">dataoffp/a>, pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=datalen" class="sref">datalenp/a>, pa href="+code=cseq" class="sref">cseqp/a>); 1169p/a>
	ct_sip_infop/a>->pa href="+code=invite_cseq" class="sref">invite_cseqp/a> == pa href="+code=cseq" class="sref">cseqp/a>) 1170p/a>
	flush_expectationsp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=true" class="sref">truep/a>); 1171p/a>
	NF_ACCEPTp/a>; 1172p/a>} 1173p/a> 1174p/a>static int pa href="+code=process_prack_respons"" class="sref">process_prack_respons"p/a>(struct pa href="+code=sk_buff" class="sref">sk_buffp/a>
*pa href="+code=skb" class="sref">skbp/a>, unsigned int pa href="+code=protoff" class="sref">protoffp/a>, 1175p/a>
	dataoffp/a>, 1176p/a>
	dptrp/a>, unsigned int *pa href="+code=datalen" class="sref">datalenp/a>, 1177p/a>
	cseqp/a>, unsigned int pa href="+code=code" class="sref">codep/a>) 1178p/a>{ 1179p/a>
	ip_conntrack_infop/a>
pa href="+code=ctinfo" class="sref">ctinfop/a>; 1180p/a>
	nf_connp/a>
*pa href="+code=co" class="sref">ctp/a> = pa href="+code=nf_ct_get" class="sref">nf_ct_getp/a>(pa href="+code=skb" class="sref">skbp/a>, &pa href="+code=ctinfo" class="sref">ctinfop/a>); 1181p/a>
	nf_ct_sip_masterp/a>
*pa href="+code=co_sip_info" class="sref">ct_sip_infop/a> = pa href="+code=nfct_help_data" class="sref">nfct_help_datap/a>(pa href="+code=co" class="sref">ctp/a>); 1182p/a> 1183p/a>
	codep/a>
>= 100 && pa href="+code=code" class="sref">codep/a>
<= 199)
|| 1184p/a>
	codep/a>
>= 200 && pa href="+code=code" class="sref">codep/a>
<= 299)) 1185p/a>
	process_sdpp/a>(pa href="+code=skb" class="sref">skbp/a>, pa href="+code=protoff" class="sref">protoffp/a>, pa href="+code=dataoff" class="sref">dataoffp/a>, pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=datalen" class="sref">datalenp/a>, pa href="+code=cseq" class="sref">cseqp/a>); 1186p/a>
	ct_sip_infop/a>->pa href="+code=invite_cseq" class="sref">invite_cseqp/a> == pa href="+code=cseq" class="sref">cseqp/a>) 1187p/a>
	flush_expectationsp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=true" class="sref">truep/a>); 1188p/a>
	NF_ACCEPTp/a>; 1189p/a>} 1190p/a> 1191p/a>static int pa href="+code=process_invite_request" class="sref">process_invite_requestp/a>(struct pa href="+code=sk_buff" class="sref">sk_buffp/a>
*pa href="+code=skb" class="sref">skbp/a>, unsigned int pa href="+code=protoff" class="sref">protoffp/a>, 1192p/a>
	dataoffp/a>, 1193p/a>
	dptrp/a>, unsigned int *pa href="+code=datalen" class="sref">datalenp/a>, 1194p/a>
	cseqp/a>) 1195p/a>{ 1196p/a>
	ip_conntrack_infop/a>
pa href="+code=ctinfo" class="sref">ctinfop/a>; 1197p/a>
	nf_connp/a>
*pa href="+code=co" class="sref">ctp/a> = pa href="+code=nf_ct_get" class="sref">nf_ct_getp/a>(pa href="+code=skb" class="sref">skbp/a>, &pa href="+code=ctinfo" class="sref">ctinfop/a>); 1198p/a>
	nf_ct_sip_masterp/a>
*pa href="+code=co_sip_info" class="sref">ct_sip_infop/a> = pa href="+code=nfct_help_data" class="sref">nfct_help_datap/a>(pa href="+code=co" class="sref">ctp/a>); 1199p/a>
	retp/a>; 1200p/a> 1201p/a>
	flush_expectationsp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=true" class="sref">truep/a>); 1202p/a>
	retp/a> = pa href="+code=process_sdp" class="sref">process_sdpp/a>(pa href="+code=skb" class="sref">skbp/a>, pa href="+code=protoff" class="sref">protoffp/a>, pa href="+code=dataoff" class="sref">dataoffp/a>, pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=datalen" class="sref">datalenp/a>, pa href="+code=cseq" class="sref">cseqp/a>); 1203p/a>
	retp/a> ==
pa href="+code=NF_ACCEPT" class="sref">NF_ACCEPTp/a>) 1204p/a>
	ct_sip_infop/a>->pa href="+code=invite_cseq" class="sref">invite_cseqp/a> = pa href="+code=cseq" class="sref">cseqp/a>; 1205p/a>
	retp/a>; 1206p/a>} 1207p/a> 1208p/a>static int pa href="+code=process_bye_request" class="sref">process_bye_requestp/a>(struct pa href="+code=sk_buff" class="sref">sk_buffp/a>
*pa href="+code=skb" class="sref">skbp/a>, unsigned int pa href="+code=protoff" class="sref">protoffp/a>, 1209p/a>
	dataoffp/a>, 1210p/a>
	dptrp/a>, unsigned int *pa href="+code=datalen" class="sref">datalenp/a>, 1211p/a>
	cseqp/a>) 1212p/a>{ 1213p/a>
	ip_conntrack_infop/a>
pa href="+code=ctinfo" class="sref">ctinfop/a>; 1214p/a>
	nf_connp/a>
*pa href="+code=co" class="sref">ctp/a> = pa href="+code=nf_ct_get" class="sref">nf_ct_getp/a>(pa href="+code=skb" class="sref">skbp/a>, &pa href="+code=ctinfo" class="sref">ctinfop/a>); 1215p/a> 1216p/a>
	flush_expectationsp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=true" class="sref">truep/a>); 1217p/a>
	NF_ACCEPTp/a>; 1218p/a>} 1219p/a> 1220p/a>pspa
 class="comment">/* Parse a REGISTER request and create a permanent expectation for incomingp/spa
  1221p/a>pspa
 class="comment"> * signalling connections. The expectation is marked inactive and is activatedp/spa
  1222p/a>pspa
 class="comment"> * when receiving a respons" indicating success from the registrar.p/spa
  1223p/a>pspa
 class="comment"> */p/spa
  1224p/a>static int pa href="+code=process_register_request" class="sref">process_register_requestp/a>(struct pa href="+code=sk_buff" class="sref">sk_buffp/a>
*pa href="+code=skb" class="sref">skbp/a>, unsigned int pa href="+code=protoff" class="sref">protoffp/a>, 1225p/a>
	dataoffp/a>, 1226p/a>
	dptrp/a>, unsigned int *pa href="+code=datalen" class="sref">datalenp/a>, 1227p/a>
	cseqp/a>) 1228p/a>{ 1229p/a>
	ip_conntrack_infop/a>
pa href="+code=ctinfo" class="sref">ctinfop/a>; 1230p/a>
	nf_connp/a>
*pa href="+code=co" class="sref">ctp/a> = pa href="+code=nf_ct_get" class="sref">nf_ct_getp/a>(pa href="+code=skb" class="sref">skbp/a>, &pa href="+code=ctinfo" class="sref">ctinfop/a>); 1231p/a>
	nf_ct_sip_masterp/a>
*pa href="+code=co_sip_info" class="sref">ct_sip_infop/a> = pa href="+code=nfct_help_data" class="sref">nfct_help_datap/a>(pa href="+code=co" class="sref">ctp/a>); 1232p/a>
	ip_conntrack_dirp/a>
pa href="+code=dir" class="sref">dirp/a>
= pa href="+code=CTINFO2DIR" class="sref">CTINFO2DIRp/a>(pa href="+code=coinfo" class="sref">ctinfop/a>); 1233p/a>
	matchoffp/a>, pa href="+code=matchlen" class="sref">matchlenp/a>; 1234p/a>
	nf_conntrack_expectp/a>
*pa href="+code=exp" class="sref">expp/a>; 1235p/a>
	nf_inet_addrp/a>
*pa href="+code=saddr" class="sref">saddrp/a>, pa href="+code=daddr" class="sref">daddrp/a>; 1236p/a>
	__be16p/a>
pa href="+code=port" class="sref">portp/a>; 1237p/a>
	u8p/a>
pa href="+code=proto" class="sref">protop/a>; 1238p/a>
	expiresp/a>
= 0; 1239p/a>
	retp/a>; 1240p/a>
	typeofp/a>(pa href="+code=nf_nao_sip_expect_hook" class="sref">nf_nao_sip_expect_hookp/a>) pa href="+code=nf_nao_sip_expect" class="sref">nf_nao_sip_expectp/a>; 1241p/a> 1242p/a>
	/* Expected connections ca
 not register again. */p/spa
  1243p/a>
	ctp/a>->pa href="+code=status" class="sref">statusp/a>
& pa href="+code=IPS_EXPECTED" class="sref">IPS_EXPECTEDp/a>) 1244p/a>
	NF_ACCEPTp/a>; 1245p/a> 1246p/a>
	/* We must check the expiration time: a value of zero signals thep/spa
  1247p/a>pspa
 class="comment">         * registrar to release the binding. We'll remove our expectationp/spa
  1248p/a>pspa
 class="comment">         * when receiving the new bindings in the respons", but we don'tp/spa
  1249p/a>pspa
 class="comment">         * want to create new ones.p/spa
  1250p/a>pspa
 class="comment">         *p/spa
  1251p/a>pspa
 class="comment">         * The expiration time may be contained in Expires: header, thep/spa
  1252p/a>pspa
 class="comment">         * Contact: header param"ters or the URI param"ters.p/spa
  1253p/a>pspa
 class="comment">         */p/spa
  1254p/a>
	ct_sip_get_headerp/a>(pa href="+code=co" class="sref">ctp/a>, *pa href="+code=dptr" class="sref">dptrp/a>, 0, *pa href="+code=datalen" class="sref">datalenp/a>, pa href="+code=SIP_HDR_EXPIRES" class="sref">SIP_HDR_EXPIRESp/a>, 1255p/a>
	matchoffp/a>, &pa href="+code=matchlen" class="sref">matchlenp/a>)
> 0) 1256p/a>
	expiresp/a>
= pa href="+code=simple_strtoul" class="sref">simple_strtoulp/a>(*pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=matchoff" class="sref">matchoffp/a>, pa href="+code=NULL" class="sref">NULLp/a>, 10); 1257p/a> 1258p/a>
	retp/a> = pa href="+code=ct_sip_parse_header_uri" class="sref">ct_sip_parse_header_urip/a>(pa href="+code=co" class="sref">ctp/a>, *pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=NULL" class="sref">NULLp/a>, *pa href="+code=datalen" class="sref">datalenp/a>, 1259p/a>
	SIP_HDR_CONTACTp/a>, pa href="+code=NULL" class="sref">NULLp/a>, 1260p/a>
	matchoffp/a>, &pa href="+code=matchlen" class="sref">matchlenp/a>, &pa href="+code=daddr" class="sref">daddrp/a>, &pa href="+code=port" class="sref">portp/a>); 1261p/a>
	retp/a> < 0) 1262p/a>
	NF_DROPp/a>; 1263p/a>
	retp/a> ==
0) 1264p/a>
	NF_ACCEPTp/a>; 1265p/a> 1266p/a>
	/* We don't support third-party registrations */p/spa
  1267p/a>
	nf_inet_addr_cmpp/a>(&pa href="+code=ct" class="sref">ctp/a>->pa href="+code=tuplehash" class="sref">tuplehashp/a>[pa href="+code=dir" class="sref">dirp/a>].pa href="+code=tuple" class="sref">tuplep/a>.pa href="+code=src" class="sref">srcp/a>.pa href="+code=u3" class="sref">u3p/a>, &pa href="+code=daddr" class="sref">daddrp/a>)) 1268p/a>
	NF_ACCEPTp/a>; 1269p/a> 1270p/a>
	co_sip_parse_transportp/a>(pa href="+code=co" class="sref">ctp/a>, *pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=matchoff" class="sref">matchoffp/a> + pa href="+code=matchlen" class="sref">matchlenp/a>, *pa href="+code=datalen" class="sref">datalenp/a>, 1271p/a>
	protop/a>) ==
0) 1272p/a>
	NF_ACCEPTp/a>; 1273p/a> 1274p/a>
	co_sip_parse_numerical_paramp/a>(pa href="+code=co" class="sref">ctp/a>, *pa href="+code=dptr" class="sref">dptrp/a>, 1275p/a>
	matchoffp/a> + pa href="+code=matchlen" class="sref">matchlenp/a>, *pa href="+code=datalen" class="sref">datalenp/a>, 1276p/a>
	"expires="p/spa
 , pa href="+code=NULL" class="sref">NULLp/a>, pa href="+code=NULL" class="sref">NULLp/a>, &pa href="+code=expires" class="sref">expiresp/a>) < 0) 1277p/a>
	NF_DROPp/a>; 1278p/a> 1279p/a>
	expiresp/a>
==
0) { 1280p/a>
	retp/a> = pa href="+code=NF_ACCEPT" class="sref">NF_ACCEPTp/a>; 1281p/a>
	store_cseqp/a>; 1282p/a>
	1283p/a> 1284p/a>
	expp/a> = pa href="+code=nf_ct_expect_alloc" class="sref">nf_ct_expect_allocp/a>(pa href="+code=co" class="sref">ctp/a>); 1285p/a>
	expp/a>) 1286p/a>
	NF_DROPp/a>; 1287p/a> 1288p/a>
	saddrp/a> = pa href="+code=NULL" class="sref">NULLp/a>; 1289p/a>
	sip_direco_signallingp/a>) 1290p/a>
	saddrp/a> = &pa href="+code=ct" class="sref">ctp/a>->pa href="+code=tuplehash" class="sref">tuplehashp/a>[!pa href="+code=dir" class="sref">dirp/a>].pa href="+code=tuple" class="sref">tuplep/a>.pa href="+code=src" class="sref">srcp/a>.pa href="+code=u3" class="sref">u3p/a>; 1291p/a> 1292p/a>
	nf_ct_expect_initp/a>(pa href="+code=exp" class="sref">expp/a>, pa href="+code=SIP_EXPECT_SIGNALLING" class="sref">SIP_EXPECT_SIGNALLINGp/a>, pa href="+code=nf_ct_l3num" class="sref">nf_ct_l3nump/a>(pa href="+code=co" class="sref">ctp/a>), 1293p/a>
	saddrp/a>, &pa href="+code=daddr" class="sref">daddrp/a>, pa href="+code=proto" class="sref">protop/a>, pa href="+code=NULL" class="sref">NULLp/a>, &pa href="+code=port" class="sref">portp/a>); 1294p/a>
	expp/a>->pa href="+code=timeout" class="sref">timeoutp/a>.pa href="+code=expires" class="sref">expiresp/a>
= pa href="+code=sip_timeout" class="sref">sip_timeoutp/a>
* pa href="+code=HZ" class="sref">HZp/a>; 1295p/a>
	expp/a>->pa href="+code=helper" class="sref">helperp/a> = pa href="+code=nfct_help" class="sref">nfct_helpp/a>(pa href="+code=co" class="sref">ctp/a>)->pa href="+code=helper" class="sref">helperp/a>; 1296p/a>
	expp/a>->pa href="+code=flags" class="sref">flagsp/a> = pa href="+code=NF_CT_EXPECT_PERMANENT" class="sref">NF_CT_EXPECT_PERMANENTp/a> | pa href="+code=NF_CT_EXPECT_INACTIVE" class="sref">NF_CT_EXPECT_INACTIVEp/a>; 1297p/a> 1298p/a>
	nf_nao_sip_expectp/a> = pa href="+code=rcu_dereference" class="sref">rcu_dereferencep/a>(pa href="+code=nf_nao_sip_expect_hook" class="sref">nf_nao_sip_expect_hookp/a>); 1299p/a>
	nf_nao_sip_expectp/a> && pa href="+code=ct" class="sref">ctp/a>->pa href="+code=status" class="sref">statusp/a>
& pa href="+code=IPS_NAT_MASK" class="sref">IPS_NAT_MASKp/a>) 1300p/a>
	retp/a> = pa href="+code=nf_nao_sip_expect" class="sref">nf_nao_sip_expectp/a>(pa href="+code=skb" class="sref">skbp/a>, pa href="+code=protoff" class="sref">protoffp/a>, pa href="+code=dataoff" class="sref">dataoffp/a>, pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=datalen" class="sref">datalenp/a>, 1301p/a>
	expp/a>, pa href="+code=matchoff" class="sref">matchoffp/a>, pa href="+code=matchlen" class="sref">matchlenp/a>); 1302p/a>
	1303p/a>
	nf_ct_expect_relatedp/a>(pa href="+code=exp" class="sref">expp/a>) !=
0) 1304p/a>
	retp/a> = pa href="+code=NF_DROP" class="sref">NF_DROPp/a>; 1305p/a>
	1306p/a>
	retp/a> = pa href="+code=NF_ACCEPT" class="sref">NF_ACCEPTp/a>; 1307p/a>
	1308p/a>
	nf_ct_expect_putp/a>(pa href="+code=exp" class="sref">expp/a>); 1309p/a> 1310p/a>pa href="+code=store_cseq" class="sref">store_cseqp/a>: 1311p/a>
	retp/a> ==
pa href="+code=NF_ACCEPT" class="sref">NF_ACCEPTp/a>) 1312p/a>
	ct_sip_infop/a>->pa href="+code=register_cseq" class="sref">register_cseqp/a> = pa href="+code=cseq" class="sref">cseqp/a>; 1313p/a>
	retp/a>; 1314p/a>} 1315p/a> 1316p/a>static int pa href="+code=process_register_respons"" class="sref">process_register_respons"p/a>(struct pa href="+code=sk_buff" class="sref">sk_buffp/a>
*pa href="+code=skb" class="sref">skbp/a>, unsigned int pa href="+code=protoff" class="sref">protoffp/a>, 1317p/a>
	dataoffp/a>, 1318p/a>
	dptrp/a>, unsigned int *pa href="+code=datalen" class="sref">datalenp/a>, 1319p/a>
	cseqp/a>, unsigned int pa href="+code=code" class="sref">codep/a>) 1320p/a>{ 1321p/a>
	ip_conntrack_infop/a>
pa href="+code=ctinfo" class="sref">ctinfop/a>; 1322p/a>
	nf_connp/a>
*pa href="+code=co" class="sref">ctp/a> = pa href="+code=nf_ct_get" class="sref">nf_ct_getp/a>(pa href="+code=skb" class="sref">skbp/a>, &pa href="+code=ctinfo" class="sref">ctinfop/a>); 1323p/a>
	nf_ct_sip_masterp/a>
*pa href="+code=co_sip_info" class="sref">ct_sip_infop/a> = pa href="+code=nfct_help_data" class="sref">nfct_help_datap/a>(pa href="+code=co" class="sref">ctp/a>); 1324p/a>
	ip_conntrack_dirp/a>
pa href="+code=dir" class="sref">dirp/a>
= pa href="+code=CTINFO2DIR" class="sref">CTINFO2DIRp/a>(pa href="+code=coinfo" class="sref">ctinfop/a>); 1325p/a>
	nf_inet_addrp/a>
pa href="+code=addr" class="sref">addrp/a>; 1326p/a>
	__be16p/a>
pa href="+code=port" class="sref">portp/a>; 1327p/a>
	u8p/a>
pa href="+code=proto" class="sref">protop/a>; 1328p/a>
	matchoffp/a>, pa href="+code=matchlen" class="sref">matchlenp/a>, pa href="+code=coff" class="sref">coffp/a> = 0; 1329p/a>
	expiresp/a>
= 0; 1330p/a>
	in_contactp/a>
= 0, pa href="+code=ret" class="sref">retp/a>; 1331p/a> 1332p/a>
	/* According to RFC 3261, "UAs MUST NOT send a new registration untilp/spa
  1333p/a>pspa
 class="comment">         * they have received a final respons" from the registrar for thep/spa
  1334p/a>pspa
 class="comment">         * previous one or the previous REGISTER request has timed out".p/spa
  1335p/a>pspa
 class="comment">         *p/spa
  1336p/a>pspa
 class="comment">         * However, some servers fail to detect retransmissions and send latep/spa
  1337p/a>pspa
 class="comment">         * respons"s, so we store the sequence number of the last validp/spa
  1338p/a>pspa
 class="comment">         * request and compare it here.p/spa
  1339p/a>pspa
 class="comment">         */p/spa
  1340p/a>
	ct_sip_infop/a>->pa href="+code=register_cseq" class="sref">register_cseqp/a> != pa href="+code=cseq" class="sref">cseqp/a>) 1341p/a>
	NF_ACCEPTp/a>; 1342p/a> 1343p/a>
	codep/a>
>= 100 && pa href="+code=code" class="sref">codep/a>
<= 199) 1344p/a>
	NF_ACCEPTp/a>; 1345p/a>
	codep/a>
< 200 || pa href="+code=code" class="sref">codep/a>
> 299) 1346p/a>
	flushp/a>; 1347p/a> 1348p/a>
	ct_sip_get_headerp/a>(pa href="+code=co" class="sref">ctp/a>, *pa href="+code=dptr" class="sref">dptrp/a>, 0, *pa href="+code=datalen" class="sref">datalenp/a>, pa href="+code=SIP_HDR_EXPIRES" class="sref">SIP_HDR_EXPIRESp/a>, 1349p/a>
	matchoffp/a>, &pa href="+code=matchlen" class="sref">matchlenp/a>)
> 0) 1350p/a>
	expiresp/a>
= pa href="+code=simple_strtoul" class="sref">simple_strtoulp/a>(*pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=matchoff" class="sref">matchoffp/a>, pa href="+code=NULL" class="sref">NULLp/a>, 10); 1351p/a> 1352p/a>
	1353p/a>
	c_expiresp/a>
= pa href="+code=expires" class="sref">expiresp/a>; 1354p/a> 1355p/a>
	retp/a> = pa href="+code=ct_sip_parse_header_uri" class="sref">ct_sip_parse_header_urip/a>(pa href="+code=co" class="sref">ctp/a>, *pa href="+code=dptr" class="sref">dptrp/a>, &pa href="+code=coff" class="sref">coffp/a>, *pa href="+code=datalen" class="sref">datalenp/a>, 1356p/a>
	SIP_HDR_CONTACTp/a>, &pa href="+code=in_contact" class="sref">in_contactp/a>, 1357p/a>
	matchoffp/a>, &pa href="+code=matchlen" class="sref">matchlenp/a>, 1358p/a>
	addrp/a>, &pa href="+code=port" class="sref">portp/a>); 1359p/a>
	retp/a> < 0) 1360p/a>
	NF_DROPp/a>; 1361p/a>
	retp/a> ==
0) 1362p/a>
	1363p/a> 1364p/a>
	/* We don't support third-party registrations */p/spa
  1365p/a>
	nf_inet_addr_cmpp/a>(&pa href="+code=ct" class="sref">ctp/a>->pa href="+code=tuplehash" class="sref">tuplehashp/a>[pa href="+code=dir" class="sref">dirp/a>].pa href="+code=tuple" class="sref">tuplep/a>.pa href="+code=dst" class="sref">dstp/a>.pa href="+code=u3" class="sref">u3p/a>, &pa href="+code=addr" class="sref">addrp/a>)) 1366p/a>
	1367p/a> 1368p/a>
	co_sip_parse_transportp/a>(pa href="+code=co" class="sref">ctp/a>, *pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=matchoff" class="sref">matchoffp/a> + pa href="+code=matchlen" class="sref">matchlenp/a>, 1369p/a>
	datalenp/a>, &pa href="+code=proto" class="sref">protop/a>) ==
0) 1370p/a>
	1371p/a> 1372p/a>
	retp/a> = pa href="+code=ct_sip_parse_numerical_param" class="sref">co_sip_parse_numerical_paramp/a>(pa href="+code=co" class="sref">ctp/a>, *pa href="+code=dptr" class="sref">dptrp/a>, 1373p/a>
	matchoffp/a> + pa href="+code=matchlen" class="sref">matchlenp/a>, 1374p/a>
	datalenp/a>, pspa
 class="string">"expires="p/spa
 , 1375p/a>
	NULLp/a>, pa href="+code=NULL" class="sref">NULLp/a>, &pa href="+code=c_expires" class="sref">c_expiresp/a>); 1376p/a>
	retp/a> < 0) 1377p/a>
	NF_DROPp/a>; 1378p/a>
	c_expiresp/a>
==
0) 1379p/a>
	1380p/a>
	refresh_signalling_expectationp/a>(pa href="+code=co" class="sref">ctp/a>, &pa href="+code=addr" class="sref">addrp/a>, pa href="+code=proto" class="sref">protop/a>, pa href="+code=port" class="sref">portp/a>, 1381p/a>
	c_expiresp/a>)) 1382p/a>
	NF_ACCEPTp/a>; 1383p/a>
	1384p/a> 1385p/a>pa href="+code=flush" class="sref">flushp/a>: 1386p/a>
	flush_expectationsp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=fals"" class="sref">fals"p/a>); 1387p/a>
	NF_ACCEPTp/a>; 1388p/a>} 1389p/a> 1390p/a>static const struct pa href="+code=sip_handler" class="sref">sip_handlerp/a>
pa href="+code=sip_handlers" class="sref">sip_handlersp/a>[] = { 1391p/a>
	SIP_HANDLERp/a>(pspa
 class="string">"INVITE"p/spa
 , pa href="+code=process_invite_request" class="sref">process_invite_requestp/a>, pa href="+code=process_invite_respons"" class="sref">process_invite_respons"p/a>), 1392p/a>
	SIP_HANDLERp/a>(pspa
 class="string">"UPDATE"p/spa
 , pa href="+code=process_sdp" class="sref">process_sdpp/a>, pa href="+code=process_update_respons"" class="sref">process_update_respons"p/a>), 1393p/a>
	SIP_HANDLERp/a>(pspa
 class="string">"ACK"p/spa
 , pa href="+code=process_sdp" class="sref">process_sdpp/a>, pa href="+code=NULL" class="sref">NULLp/a>), 1394p/a>
	SIP_HANDLERp/a>(pspa
 class="string">"PRACK"p/spa
 , pa href="+code=process_sdp" class="sref">process_sdpp/a>, pa href="+code=process_prack_respons"" class="sref">process_prack_respons"p/a>), 1395p/a>
	SIP_HANDLERp/a>(pspa
 class="string">"BYE"p/spa
 , pa href="+code=process_bye_request" class="sref">process_bye_requestp/a>, pa href="+code=NULL" class="sref">NULLp/a>), 1396p/a>
	SIP_HANDLERp/a>(pspa
 class="string">"REGISTER"p/spa
 , pa href="+code=process_register_request" class="sref">process_register_requestp/a>, pa href="+code=process_register_respons"" class="sref">process_register_respons"p/a>), 1397p/a>}; 1398p/a> 1399p/a>static int pa href="+code=process_sip_respons"" class="sref">process_sip_respons"p/a>(struct pa href="+code=sk_buff" class="sref">sk_buffp/a>
*pa href="+code=skb" class="sref">skbp/a>, unsigned int pa href="+code=protoff" class="sref">protoffp/a>, 1400p/a>
	dataoffp/a>, 1401p/a>
	dptrp/a>, unsigned int *pa href="+code=datalen" class="sref">datalenp/a>) 1402p/a>{ 1403p/a>
	ip_conntrack_infop/a>
pa href="+code=ctinfo" class="sref">ctinfop/a>; 1404p/a>
	nf_connp/a>
*pa href="+code=co" class="sref">ctp/a> = pa href="+code=nf_ct_get" class="sref">nf_ct_getp/a>(pa href="+code=skb" class="sref">skbp/a>, &pa href="+code=ctinfo" class="sref">ctinfop/a>); 1405p/a>
	matchoffp/a>, pa href="+code=matchlen" class="sref">matchlenp/a>, pa href="+code=matchend" class="sref">matchendp/a>; 1406p/a>
	codep/a>, pa href="+code=cseq" class="sref">cseqp/a>, pa href="+code=i" class="sref">ip/a>; 1407p/a> 1408p/a>
	datalenp/a> < pa href="+code=strlen" class="sref">strlenp/a>(pspa
 class="string">"SIP/2.0 200"p/spa
 )) 1409p/a>
	NF_ACCEPTp/a>; 1410p/a>
	codep/a>
= pa href="+code=simple_strtoul" class="sref">simple_strtoulp/a>(*pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=strlen" class="sref">strlenp/a>(pspa
 class="string">"SIP/2.0 "p/spa
 ), pa href="+code=NULL" class="sref">NULLp/a>, 10); 1411p/a>
	codep/a>) 1412p/a>
	NF_DROPp/a>; 1413p/a> 1414p/a>
	ct_sip_get_headerp/a>(pa href="+code=co" class="sref">ctp/a>, *pa href="+code=dptr" class="sref">dptrp/a>, 0, *pa href="+code=datalen" class="sref">datalenp/a>, pa href="+code=SIP_HDR_CSEQ" class="sref">SIP_HDR_CSEQp/a>, 1415p/a>
	matchoffp/a>, &pa href="+code=matchlen" class="sref">matchlenp/a>)
<= 0) 1416p/a>
	NF_DROPp/a>; 1417p/a>
	cseqp/a>
= pa href="+code=simple_strtoul" class="sref">simple_strtoulp/a>(*pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=matchoff" class="sref">matchoffp/a>, pa href="+code=NULL" class="sref">NULLp/a>, 10); 1418p/a>
	cseqp/a>) 1419p/a>
	NF_DROPp/a>; 1420p/a>
	matchendp/a>
= pa href="+code=matchoff" class="sref">matchoffp/a> + pa href="+code=matchlen" class="sref">matchlenp/a> + 1; 1421p/a> 1422p/a>
	ip/a>
= 0; pa href="+code=i" class="sref">ip/a> < pa href="+code=ARRAY_SIZE" class="sref">ARRAY_SIZEp/a>(pa href="+code=sip_handlers" class="sref">sip_handlersp/a>); pa href="+code=i" class="sref">ip/a>++) { 1423p/a>
	sip_handlerp/a>
*pa href="+code=handler" class="sref">handlerp/a>; 1424p/a> 1425p/a>
	handlerp/a> = &pa href="+code=sip_handlers" class="sref">sip_handlersp/a>[pa href="+code=i" class="sref">ip/a>]; 1426p/a>
	handlerp/a>->pa href="+code=respons"" class="sref">respons"p/a> ==
pa href="+code=NULL" class="sref">NULLp/a>) 1427p/a>
	1428p/a>
	datalenp/a> < pa href="+code=matchend" class="sref">matchendp/a>
+ pa href="+code=handler" class="sref">handlerp/a>->pa href="+code=len" class="sref">lenp/a> || 1429p/a>
	strnicmpp/a>(*pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=matchend" class="sref">matchendp/a>, pa href="+code=handler" class="sref">handlerp/a>->pa href="+code=method" class="sref">methodp/a>, pa href="+code=handler" class="sref">handlerp/a>->pa href="+code=len" class="sref">lenp/a>)) 1430p/a>
	1431p/a>
	handlerp/a>->pa href="+code=respons"" class="sref">respons"p/a>(pa href="+code=skb" class="sref">skbp/a>, pa href="+code=protoff" class="sref">protoffp/a>, pa href="+code=dataoff" class="sref">dataoffp/a>, pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=datalen" class="sref">datalenp/a>, 1432p/a>
	cseqp/a>, pa href="+code=code" class="sref">codep/a>); 1433p/a>
	1434p/a>
	NF_ACCEPTp/a>; 1435p/a>} 1436p/a> 1437p/a>static int pa href="+code=process_sip_request" class="sref">process_sip_requestp/a>(struct pa href="+code=sk_buff" class="sref">sk_buffp/a>
*pa href="+code=skb" class="sref">skbp/a>, unsigned int pa href="+code=protoff" class="sref">protoffp/a>, 1438p/a>
	dataoffp/a>, 1439p/a>
	dptrp/a>, unsigned int *pa href="+code=datalen" class="sref">datalenp/a>) 1440p/a>{ 1441p/a>
	ip_conntrack_infop/a>
pa href="+code=ctinfo" class="sref">ctinfop/a>; 1442p/a>
	nf_connp/a>
*pa href="+code=co" class="sref">ctp/a> = pa href="+code=nf_ct_get" class="sref">nf_ct_getp/a>(pa href="+code=skb" class="sref">skbp/a>, &pa href="+code=ctinfo" class="sref">ctinfop/a>); 1443p/a>
	matchoffp/a>, pa href="+code=matchlen" class="sref">matchlenp/a>; 1444p/a>
	cseqp/a>, pa href="+code=i" class="sref">ip/a>; 1445p/a> 1446p/a>
	ip/a>
= 0; pa href="+code=i" class="sref">ip/a> < pa href="+code=ARRAY_SIZE" class="sref">ARRAY_SIZEp/a>(pa href="+code=sip_handlers" class="sref">sip_handlersp/a>); pa href="+code=i" class="sref">ip/a>++) { 1447p/a>
	sip_handlerp/a>
*pa href="+code=handler" class="sref">handlerp/a>; 1448p/a> 1449p/a>
	handlerp/a> = &pa href="+code=sip_handlers" class="sref">sip_handlersp/a>[pa href="+code=i" class="sref">ip/a>]; 1450p/a>
	handlerp/a>->pa href="+code=request" class="sref">requestp/a> ==
pa href="+code=NULL" class="sref">NULLp/a>) 1451p/a>
	1452p/a>
	datalenp/a> < pa href="+code=handler" class="sref">handlerp/a>->pa href="+code=len" class="sref">lenp/a> || 1453p/a>
	strnicmpp/a>(*pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=handler" class="sref">handlerp/a>->pa href="+code=method" class="sref">methodp/a>, pa href="+code=handler" class="sref">handlerp/a>->pa href="+code=len" class="sref">lenp/a>)) 1454p/a>
	1455p/a> 1456p/a>
	ct_sip_get_headerp/a>(pa href="+code=co" class="sref">ctp/a>, *pa href="+code=dptr" class="sref">dptrp/a>, 0, *pa href="+code=datalen" class="sref">datalenp/a>, pa href="+code=SIP_HDR_CSEQ" class="sref">SIP_HDR_CSEQp/a>, 1457p/a>
	matchoffp/a>, &pa href="+code=matchlen" class="sref">matchlenp/a>)
<= 0) 1458p/a>
	NF_DROPp/a>; 1459p/a>
	cseqp/a>
= pa href="+code=simple_strtoul" class="sref">simple_strtoulp/a>(*pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=matchoff" class="sref">matchoffp/a>, pa href="+code=NULL" class="sref">NULLp/a>, 10); 1460p/a>
	cseqp/a>) 1461p/a>
	NF_DROPp/a>; 1462p/a> 1463p/a>
	handlerp/a>->pa href="+code=request" class="sref">requestp/a>(pa href="+code=skb" class="sref">skbp/a>, pa href="+code=protoff" class="sref">protoffp/a>, pa href="+code=dataoff" class="sref">dataoffp/a>, pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=datalen" class="sref">datalenp/a>, 1464p/a>
	cseqp/a>); 1465p/a>
	1466p/a>
	NF_ACCEPTp/a>; 1467p/a>} 1468p/a> 1469p/a>static int pa href="+code=process_sip_msg" class="sref">process_sip_msgp/a>(struct pa href="+code=sk_buff" class="sref">sk_buffp/a>
*pa href="+code=skb" class="sref">skbp/a>, struct pa href="+code=nf_conn" class="sref">nf_connp/a>
*pa href="+code=co" class="sref">ctp/a>, 1470p/a>
	protoffp/a>, unsigned int pa href="+code=dataoff" class="sref">dataoffp/a>, 1471p/a>
	dptrp/a>, unsigned int *pa href="+code=datalen" class="sref">datalenp/a>) 1472p/a>{ 1473p/a>
	typeofp/a>(pa href="+code=nf_nat_sip_hook" class="sref">nf_nat_sip_hookp/a>)
pa href="+code=nf_nat_sip" class="sref">nf_nat_sipp/a>; 1474p/a>
	retp/a>; 1475p/a> 1476p/a>
	strnicmpp/a>(*pa href="+code=dptr" class="sref">dptrp/a>, pspa
 class="string">"SIP/2.0 "p/spa
 , pa href="+code=strlen" class="sref">strlenp/a>(pspa
 class="string">"SIP/2.0 "p/spa
 )) != 0) 1477p/a>
	retp/a>
= pa href="+code=process_sip_request" class="sref">process_sip_requestp/a>(pa href="+code=skb" class="sref">skbp/a>, pa href="+code=protoff" class="sref">protoffp/a>, pa href="+code=dataoff" class="sref">dataoffp/a>, pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=datalen" class="sref">datalenp/a>); 1478p/a>
	1479p/a>
	retp/a>
= pa href="+code=process_sip_respons"" class="sref">process_sip_respons"p/a>(pa href="+code=skb" class="sref">skbp/a>, pa href="+code=protoff" class="sref">protoffp/a>, pa href="+code=dataoff" class="sref">dataoffp/a>, pa href="+code=dptr" class="sref">dptrp/a>, pa href="+code=datalen" class="sref">datalenp/a>); 1480p/a> 1481p/a>
	retp/a>
==
pa href="+code=NF_ACCEPT" class="sref">NF_ACCEPTp/a> && pa href="+code=ct" class="sref">ctp/a>->pa href="+code=status" class="sref">statusp/a> & pa href="+code=IPS_NAT_MASK" class="sref">IPS_NAT_MASKp/a>)
{ 1482p/a>
	nf_nat_sipp/a>
= pa href="+code=rcu_dereferenc"" class="sref">rcu_dereferenc"p/a>(pa href="+code=nf_nat_sip_hook" class="sref">nf_nat_sip_hookp/a>); 1483p/a>
	nf_nat_sipp/a>
&& !pa href="+code=nf_nat_sip" class="sref">nf_nat_sipp/a>(pa href="+code=skb" class="sref">skbp/a>, pa href="+code=protoff" class="sref">protoffp/a>, pa href="+code=dataoff" class="sref">dataoffp/a>, 1484p/a>
	dptrp/a>, pa href="+code=datalen" class="sref">datalenp/a>)) 1485p/a>
	retp/a>
= pa href="+code=NF_DROP" class="sref">NF_DROPp/a>; 1486p/a>
	1487p/a> 1488p/a>
	retp/a>; 1489p/a>} 1490p/a> 1491p/a>static int pa href="+code=sip_help_tcp" class="sref">sip_help_tcpp/a>(struct pa href="+code=sk_buff" class="sref">sk_buffp/a>
*pa href="+code=skb" class="sref">skbp/a>, unsigned int pa href="+code=protoff" class="sref">protoffp/a>, 1492p/a>
	nf_connp/a>
*pa href="+code=co" class="sref">ctp/a>, enum pa href="+code=ip_conntrack_info" class="sref">ip_conntrack_infop/a>
pa href="+code=ctinfo" class="sref">ctinfop/a>) 1493p/a>{ 1494p/a>
	tcphdrp/a>
*pa href="+code=th" class="sref">thp/a>, pa href="+code=_tcph" class="sref">_tcphp/a>; 1495p/a>
	dataoffp/a>, pa href="+code=datalen" class="sref">datalenp/a>; 1496p/a>
	matchoffp/a>, pa href="+code=matchlen" class="sref">matchlenp/a>, pa href="+code=clen" class="sref">clenp/a>; 1497p/a>
	msglenp/a>, pa href="+code=origlen" class="sref">origlenp/a>; 1498p/a>
	dptrp/a>, *pa href="+code=end" class="sref">endp/a>; 1499p/a>
	s16p/a>
pa href="+code=diff" class="sref">diffp/a>, pa href="+code=tdiff" class="sref">tdiffp/a>
= 0; 1500p/a>
	retp/a>
= pa href="+code=NF_ACCEPT" class="sref">NF_ACCEPTp/a>; 1501p/a>
	boolp/a>
pa href="+code=term" class="sref">termp/a>; 1502p/a>
	typeofp/a>(pa href="+code=nf_nat_sip_seq_adjust_hook" class="sref">nf_nat_sip_seq_adjust_hookp/a>)
pa href="+code=nf_nat_sip_seq_adjust" class="sref">nf_nat_sip_seq_adjustp/a>; 1503p/a> 1504p/a>
	ctinfop/a> != pa href="+code=IP_CT_ESTABLISHED" class="sref">IP_CT_ESTABLISHEDp/a>
&& 1505p/a>
	ctinfop/a> != pa href="+code=IP_CT_ESTABLISHED_REPLY" class="sref">IP_CT_ESTABLISHED_REPLYp/a>) 1506p/a>
	NF_ACCEPTp/a>; 1507p/a> 1508p/a>
	/* No Data ? */p/spa
  1509p/a>
	thp/a>
= pa href="+code=skb_header_pointer" class="sref">skb_header_pointerp/a>(pa href="+code=skb" class="sref">skbp/a>, pa href="+code=protoff" class="sref">protoffp/a>, sizeof(pa href="+code=_tcph" class="sref">_tcphp/a>), &pa href="+code=_tcph" class="sref">_tcphp/a>); 1510p/a>
	thp/a>
==
pa href="+code=NULL" class="sref">NULLp/a>) 1511p/a>
	NF_ACCEPTp/a>; 1512p/a>
	dataoffp/a>
= pa href="+code=protoff" class="sref">protoffp/a> + pa href="+code=th" class="sref">thp/a>->pa href="+code=doff" class="sref">doffp/a> * 4; 1513p/a>
	dataoffp/a>
>= pa href="+code=skb" class="sref">skbp/a>->pa href="+code=len" class="sref">lenp/a>) 1514p/a>
	NF_ACCEPTp/a>; 1515p/a> 1516p/a>
	nf_ct_refreshp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=skb" class="sref">skbp/a>, pa href="+code=sip_timeouo" class="sref">sip_timeouop/a> * pa href="+code=HZ" class="sref">HZp/a>); 1517p/a> 1518p/a>
	unlikelyp/a>(pa href="+code=skb_linearize" class="sref">skb_linearizep/a>(pa href="+code=skb" class="sref">skbp/a>))) 1519p/a>
	NF_DROPp/a>; 1520p/a> 1521p/a>
	dptrp/a> = pa href="+code=skb" class="sref">skbp/a>->pa href="+code=data" class="sref">datap/a> + pa href="+code=dataoff" class="sref">dataoffp/a>; 1522p/a>
	datalenp/a> = pa href="+code=skb" class="sref">skbp/a>->pa href="+code=len" class="sref">lenp/a> - pa href="+code=dataoff" class="sref">dataoffp/a>; 1523p/a>
	datalenp/a> < pa href="+code=strlen" class="sref">strlenp/a>(pspa
 class="string">"SIP/2.0 200"p/spa
 )) 1524p/a>
	NF_ACCEPTp/a>; 1525p/a> 1526p/a>
	1527p/a>
	ct_sip_get_headerp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=dptr" class="sref">dptrp/a>, 0, pa href="+code=datalen" class="sref">datalenp/a>, 1528p/a>
	SIP_HDR_CONTENT_LENGTHp/a>, 1529p/a>
	matchoffp/a>, &pa href="+code=matchlen" class="sref">matchlenp/a>)
<= 0) 1530p/a>
	1531p/a> 1532p/a>
	clenp/a>
= pa href="+code=simple_strtoul" class="sref">simple_strtoulp/a>(pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=matchoff" class="sref">matchoffp/a>, (char **)&pa href="+code=end" class="sref">endp/a>, 10); 1533p/a>
	dptrp/a> + pa href="+code=matchoff" class="sref">matchoffp/a>
==
pa href="+code=end" class="sref">endp/a>) 1534p/a>
	1535p/a> 1536p/a>
	termp/a>
= pa href="+code=fals"" class="sref">fals"p/a>; 1537p/a>
	endp/a> + pa href="+code=strlen" class="sref">strlenp/a>(pspa
 class="string">"\r\n\r\n"p/spa
 )
<= pa href="+code=dptr" class="sref">dptrp/a> + pa href="+code=datalen" class="sref">datalenp/a>; pa href="+code=end" class="sref">endp/a>++) { 1538p/a>
	endp/a>[0]
==
pspa
 class="string">'\r'p/spa
  && pa href="+code=end" class="sref">endp/a>[1]
==
pspa
 class="string">'\n'p/spa
  && 1539p/a>
	endp/a>[2]
==
pspa
 class="string">'\r'p/spa
  && pa href="+code=end" class="sref">endp/a>[3]
==
pspa
 class="string">'\n'p/spa
 ) { 1540p/a>
	termp/a>
= pa href="+code=tru"" class="sref">tru"p/a>; 1541p/a>
	1542p/a>
	1543p/a>
	1544p/a>
	termp/a>) 1545p/a>
	1546p/a>
	endp/a> += pa href="+code=strlen" class="sref">strlenp/a>(pspa
 class="string">"\r\n\r\n"p/spa
 )
+ pa href="+code=clen" class="sref">clenp/a>; 1547p/a> 1548p/a>
	msglenp/a>
= pa href="+code=origlen" class="sref">origlenp/a>
= pa href="+code=end" class="sref">endp/a> - pa href="+code=dptr" class="sref">dptrp/a>; 1549p/a>
	msglenp/a>
> pa href="+code=datalen" class="sref">datalenp/a>) 1550p/a>
	NF_DROPp/a>; 1551p/a> 1552p/a>
	retp/a>
= pa href="+code=process_sip_msg" class="sref">process_sip_msgp/a>(pa href="+code=skb" class="sref">skbp/a>, pa href="+code=co" class="sref">ctp/a>, pa href="+code=protoff" class="sref">protoffp/a>, pa href="+code=dataoff" class="sref">dataoffp/a>, 1553p/a>
	dptrp/a>, &pa href="+code=msglen" class="sref">msglenp/a>); 1554p/a>
	retp/a>
!= pa href="+code=NF_ACCEPT" class="sref">NF_ACCEPTp/a>) 1555p/a>
	1556p/a>
	diffp/a>     = pa href="+code=msglen" class="sref">msglenp/a>
- pa href="+code=origlen" class="sref">origlenp/a>; 1557p/a>
	tdiffp/a>
  += pa href="+code=diff" class="sref">diffp/a>; 1558p/a> 1559p/a>
	dataoffp/a>
+= pa href="+code=msglen" class="sref">msglenp/a>; 1560p/a>
	dptrp/a> 
  += pa href="+code=msglen" class="sref">msglenp/a>; 1561p/a>
	datalenp/a>  = pa href="+code=datalen" class="sref">datalenp/a> + pa href="+code=diff" class="sref">diffp/a> - pa href="+code=msglen" class="sref">msglenp/a>; 1562p/a>
	1563p/a> 1554p/a>
	retp/a>
==
pa href="+code=NF_ACCEPT" class="sref">NF_ACCEPTp/a> && pa href="+code=ct" class="sref">ctp/a>->pa href="+code=status" class="sref">statusp/a> & pa href="+code=IPS_NAT_MASK" class="sref">IPS_NAT_MASKp/a>)
{ statuspter/nf_conntr class="line" nam"v3L14655>146556a>
	nf_nat_sip_seq_adjustp/a>; rcu_dereferenc"p/a>(pa href="+code=nf_nat_sip_hoo_adjust_hook" class="sref">nf_nat_sip_seq_adjust_hookp/a>)
paa href="net/netfilter/nf_conntrack_sip.c#L1562" idv3L1556" class="line" nam"v3L14665>146656a>
	nf_nat_sip_seq_adjustp/a>; 146756a>
	nf_nat_sip_seq_adjustp/a>; < href="+code=skb" class="sref">skbp/a>, pa href="+code=protoff" class="sref">protoffp/a>, pa href="+code=datff" class="sref">tdiffp/a>
  aa href="net/netfilter/nf_conntrack_sip.c#L1562" idv3L1558" class="line" nam"v3L14685>1468568>
	14695/a>sta href="net/netfilter/nf_conntrack_sip.c#L1563" idv3L14705 class="line" nam"v3L14705>14705/a>
	retp/a>; 14715/a>
	147257a> 14735/a>
	sip_help_tcpudc>; < uct pa href="+code=sk_buff" class="sref">sk_buffp/a>
*pa href="+code=skb" class="sref">skbp/a>, unsigned int pa href="+code=protoff" class="sref">protoffp/a>, 147457a>
	nf_connp/a>
*pa href="+code=co" class="sref">ctp/a>, enum pa href="+code=ip_conntrack_info" class="sref">ip_conntrack_infop/a>
pa href="+code=ctinfo" class="sref">ctinfop/a>) 14755/a> statuspte idv3L14765 class="line" nam"v3L14765>14765/a>
	dataoffp/a>, pa href="+code=datalen" class="sref">datalenp/a>; 14775/a>
	dptrp/a>, *a href="net/netfilter/nf_conntrack_sip.c#L14965 idv3L1558" class="line" nam"v3L14785>147857a> 14795/a>
	/* No Data ? */p/spa
  148058a>
	dataoffp/a>
+= a href="+code=protoff" class="sref">protoffp/a> + pa eof(pa uct pa href="+code=nf_udc" class="sref">tcpudc" c>
  aa href="net/netfilter/nf_conntrack_sip.c#L1562" idv3L14815 class="line" nam"v3L14815>14815/a>
	dataoffp/a>
>= pa href="+code=skb" class="sref">skbp/a>->pa href="+code=len" class="sref">lenp/a>) 14825/a>
	NF_ACCEPTp/a>; 148358a> 14845/a>
	nf_ct_refreshp/a>(pa href="+code=co" class="sref">ctp/a>, pa href="+code=skb" class="sref">skbp/a>, pa href="+code=sip_timeouo" class="sref">sip_timeouop/a> * pa href="+code=HZ" class="sref">HZp/a>); 148558a> 14865/a>
	unlikelyp/a>(pa href="+code=skb_linearize" class="sref">skb_linearizep/a>(pa href="+code=skb" class="sref">skbp/a>))) 148758a>
	NF_DROPp/a>; 148858a> 148958a>
	dptrp/a> = pa href="+code=skb" class="sref">skbp/a>->pa href="+code=data" class="sref">datap/a> + pa href="+code=dataoff" class="sref">dataoffp/a>; 149059a>
	datalenp/a> = pa href="+code=skb" class="sref">skbp/a>->pa href="+code=len" class="sref">lenp/a> - pa href="+code=dataoff" class="sref">dataoffp/a>; 149159a>
	datalenp/a> < pa href="+code=strlen" class="sref">strlenp/a>(pspa
 class="string">"SIP/2.0 200"p/spa
 )) 14925/a>
	NF_ACCEPTp/a>; 149359a> 14945/a>
	process_sip_msgp/a>(pa href="+code=skb" class="sref">skbp/a>, pa href="+code=co" class="sref">ctp/a>, pa href="+code=protoff" class="sref">protoffp/a>, pa href="+code=dataoff" class="sref">dataoffp/a>, dptrp/a>, &pa href="+code=msgalen" class="sref">datalenp/a>); 14955/a>
	14965/a>
	< href="net/netfilter/nf_conntrack_sip.c#L1563" idv3L14875 class="line" nam"v3L14975>14975/a>
	ct_conn" cck_sipp_tc c>
pa href="+code=ctis class="sref">nf_s/a>(pa href="+code=i" MAX_PORTSlass="sref">nf_MAX_PORTS>(pa][4] href="+code=cti_fread_most class="sref">unl_fread_most c>; 149859a> 149959a>static intct struct pa href="+code=sipconntrack_sipexperefpolicclass="sref">unlconntrack_sipexperefpolicc>
pa href="+code=ctis cpexpfpolicclass="sref">unls cpexpfpolicc>(pa href="+code=i" _HDREXPEC/a>)Xlass="sref">unl_HDREXPEC/a>)X> + pa ==
pref="neref="+code=status" class="sref">statuspt6 idv3L15006 class="line" nam"v3L15006>15006/a>
	unl_HDREXPEC/aSIGNALLING>(pa]
pref="neref="+code=status" class="sref">statuspt6 1dv3L15006 class="line" nam"v3L14916>150160a>
	unlcv3L>
	't;p/sned ale" got;p/spa
 , paf="neref="+code=status" class="sref">statuspt6 2dv3L15006 class="line" nam"v3L14926>150260a>
	methaxpexpereec>
	statuspt6 3dv3L15006 class="line" nam"v3L14936>150360a>
	sipeouop/a> * p       sp3pa 60af="neref="+code=status" class="sref">statuspt6 4dv3L15006 class="line" nam"v3L14946>15046/a>
	statuspt6 5dv3L15006 class="line" nam"v3L14956>15056/a>
	unl_HDREXPEC/aAUDIO>(pa]
pref="neref="+code=status" class="sref">statuspt6 6dv3L15006 class="line" nam"v3L14966>15066/a>
	unlcv3L>
	't;p/saudioot;p/spa
 , paf="neref="+code=status" class="sref">statuspt6 7dv3L15006 class="line" nam"v3L14976>150760a>
	methaxpexpereec>
	)Xlass="sref">unlCT_ESTDIRa>)X>, 150860a>
	sipeouop/a> * p       sp3pa 60af="neref="+code=status" class="sref">statuspt6 9dv3L15086 class="line" nam"v3L14996>15096/a>
	statuspt6 idv3L15106 class="line" nam"v3L15106>151061a>
	unl_HDREXPEC/aVIDEO>(pa]
pref="neref="+code=status" class="sref">statuspt6 idv3L15116 class="line" nam"v3L15116>15116/a>
	unlcv3L>
	't;p/svideoot;p/spa
 , paf="neref="+code=status" class="sref">statuspt6 idv3L15126 class="line" nam"v3L15126>151261a>
	methaxpexpereec>
	)Xlass="sref">unlCT_ESTDIRa>)X>, 151361a>
	sipeouop/a> * p       sp3pa 60af="neref="+code=status" class="sref">statuspt6 idv3L15146 class="line" nam"v3L15146>151461a>
	statuspt6 idv3L15156 class="line" nam"v3L15156>151561a>
	unl_HDREXPEC/aIMAGE>(pa]
pref="neref="+code=status" class="sref">statuspt6 6dv3L15006 class="line" nam"v3L15166>151661a>
	unlcv3L>
	't;p/simageot;p/spa
 , paf="neref="+code=status" class="sref">statuspt6 7dv3L15006 class="line" nam"v3L15176>151761a>
	methaxpexpereec>
	)Xlass="sref">unlCT_ESTDIRa>)X>, 151861a>
	sipeouop/a> * p       sp3pa 60af="neref="+code=status" class="sref">statuspt6 idv3L15196 class="line" nam"v3L15196>151961a>
	statuspt6 idv3L15206 class="line" nam"v3L15206>15206/a> 152162a> 15226/a>
	unlconntrack_sips cpfini>(pa voida href="net/netfilter/nf_conntrack_sip.c#L15246 idv3L15236 class="line" nam"v3L15236>152362a>{ 15246/a>
	unli>, pa href="+code=datjlass="sref">unlj>; 15256/a> 15266/a>
	unli>, p0; unli>, pt; pa href="+code=strports_class="sref">protorts_c>; unli>, p { 15276/a>
	unlj>; <0; unlj>; <0; pa href="+code=strARRAY_SIZElass="sref">unlARRAY_SIZE>(pa href="+code=skb" class="sref">nf_s/a>(pa href="+code=i" ilass="sref">unli>, p])a href="+code=datjlass="sref">unlj>; < { 15286/a>
	nf_s/a>(pa href="+code=i" ilass="sref">unli>, p] href="+code=i" jlass="sref">unlj>; <].href="+code=sipmLlass="sref">unl3L>
	NULLp/a>) 15296/a>
	15306/a>
	ct_conn" cck_sipp_tc c_unregist c>(pa p;pa href="+code=msgn class="sref">nf_s/a>(pa href="+code=i" ilass="sref">unli>, p] href="+code=i" jlass="sref">unlj>; <]153163a>
	153263a>
	15336/a>
	15346/a>
	< href="net/netfilter/nf_conntrack_sip.c#L15636 idv3L15256 class="line" nam"v3L15356>15356/a> sip__inic>
pa href="+code=cticonntrack_sips cpiniclass="sref">sipconntrack_sips cpinic>(pa voida href="net/netfilter/nf_conntrack_sip.c#L15246 idv3L15366 class="line" nam"v3L15366>15366/a>
	15376/a>
	unli>, pa href="+code=datjlass="sref">unlj>; retp/a>; 153863a> 15396/a>
	protorts_c>; 15406/a>
	protorts>(pa href="+code=i" ports_class="sref">protorts_c>; <++]o= href="+code=HZ"_HDRPORTlass="sref">unl_HDRPORT>; 154164a> 15426/a>
	unli>, p0; unli>, pt; pa href="+code=strports_class="sref">protorts_c>; unli>, p { 15436/a>
	retmLms c>(pa p;pa href="+code=msgn class="sref">nf_s/a>(pa href="+code=i" ilass="sref">unli>, p], pa eof(pa href="+code=_tc" class="sref">nf_s/a>(pa href="+code=i" ilass="sref">unli>, p])154464a>
	< href="net/netfilter/nf_conntrack_sip.c#L15636 idv3L15456 class="line" nam"v3L15456>15456/a>
	nf_s/a>(pa href="+code=i" ilass="sref">unli>, p] 0].href="+code=siptuplLlass="sref">unltuplL>, p.href="+code=sipsrclass="sref">prosrc>, p.href="+code=sipl3nuclass="sref">terl3nuc>, p0; href="+code=strAF_INETlass="sref">unlAF_INET>; 15466/a>
	nf_s/a>(pa href="+code=i" ilass="sref">unli>, p] 0].href="+code=siptuplLlass="sref">unltuplL>, p.href="+code=sipd class="sref">nf_d/a>; <.href="+code=siptoffpnuclass="sref">tertoffpnuc>, p0; href="+code=strIPPROTO_UDclass="sref">NF_IPPROTO_UDc>; 154764a>
	nf_s/a>(pa href="+code=i" ilass="sref">unli>, p] 0].href="+code=sipp_tclass="sref">unlp_tc>, p0; href="+code=str_help_tcpudclass="sref">sip_help_tcpudc>; 15486/a>
	nf_s/a>(pa href="+code=i" ilass="sref">unli>, p] 1].href="+code=siptuplLlass="sref">unltuplL>, p.href="+code=sipsrclass="sref">prosrc>, p.href="+code=sipl3nuclass="sref">terl3nuc>, p0; href="+code=strAF_INETlass="sref">unlAF_INET>; 15496/a>
	nf_s/a>(pa href="+code=i" ilass="sref">unli>, p] 1].href="+code=siptuplLlass="sref">unltuplL>, p.href="+code=sipd class="sref">nf_d/a>; <.href="+code=siptoffpnuclass="sref">tertoffpnuc>, p0; href="+code=strIPPROTO_TCclass="sref">NF_IPPROTO_TCc>; 15506/a>
	nf_s/a>(pa href="+code=i" ilass="sref">unli>, p] 1].href="+code=sipp_tclass="sref">unlp_tc>, p0; href="+code=str_help_tcptcclass="sref">sip_help_tcptcc>; 15516/a> 15526/a>
	nf_s/a>(pa href="+code=i" ilass="sref">unli>, p] 2].href="+code=siptuplLlass="sref">unltuplL>, p.href="+code=sipsrclass="sref">prosrc>, p.href="+code=sipl3nuclass="sref">terl3nuc>, p0; href="+code=strAF_INETclass="sref">s16AF_INETc>; 15536/a>
	nf_s/a>(pa href="+code=i" ilass="sref">unli>, p] 2].href="+code=siptuplLlass="sref">unltuplL>, p.href="+code=sipd class="sref">nf_d/a>; <.href="+code=siptoffpnuclass="sref">tertoffpnuc>, p0; href="+code=strIPPROTO_UDclass="sref">NF_IPPROTO_UDc>; 15546/a>
	nf_s/a>(pa href="+code=i" ilass="sref">unli>, p] 2].href="+code=sipp_tclass="sref">unlp_tc>, p0; href="+code=str_help_tcpudclass="sref">sip_help_tcpudc>; 15556/a>
	nf_s/a>(pa href="+code=i" ilass="sref">unli>, p] 3].href="+code=siptuplLlass="sref">unltuplL>, p.href="+code=sipsrclass="sref">prosrc>, p.href="+code=sipl3nuclass="sref">terl3nuc>, p0; href="+code=strAF_INETclass="sref">s16AF_INETc>; 15566/a>
	nf_s/a>(pa href="+code=i" ilass="sref">unli>, p] 3].href="+code=siptuplLlass="sref">unltuplL>, p.href="+code=sipd class="sref">nf_d/a>; <.href="+code=siptoffpnuclass="sref">tertoffpnuc>, p0; href="+code=strIPPROTO_TCclass="sref">NF_IPPROTO_TCc>; 15576/a>
	nf_s/a>(pa href="+code=i" ilass="sref">unli>, p] 3].href="+code=sipp_tclass="sref">unlp_tc>, p0; href="+code=str_help_tcptcclass="sref">sip_help_tcptcc>; 15586/a> 15596/a>
	unlj>; <0; unlj>; <0; pa href="+code=strARRAY_SIZElass="sref">unlARRAY_SIZE>(pa href="+code=skb" class="sref">nf_s/a>(pa href="+code=i" ilass="sref">unli>, p])a href="+code=datjlass="sref">unlj>, p { 15606/a>
	nf_s/a>(pa href="+code=i" ilass="sref">unli>, p] href="+code=i" jlass="sref">unlj>; <].href="+code=sipdata_" class="sref">datalen_p/a> = pa eof(pa uct pa href="+code=nf_ct_ref_msgpast class="sref">ct_connef_msgpast c> = 15616/a>
	nf_s/a>(pa href="+code=i" ilass="sref">unli>, p] href="+code=i" jlass="sref">unlj>; <].href="+code=siptuplLlass="sref">unltuplL>, p.href="+code=sipsrclass="sref">prosrc>, p.href="+code=sipulass="sref">prou>, p.href="+code=sipudclass="sref">sipudc>; <.href="+code=siptorclass="sref">nf_torc>, p0; href="+code=strhfpnslass="sref">prohfpns>(pa href="+code=skbportslass="sref">protorts>(pa href="+code=i" ilass="sref">unli>, p])a href="net/netfilter/nf_conntrack_sip.c#L14806 idv3L15526 class="line" nam"v3L15626>156266a>
	nf_s/a>(pa href="+code=i" ilass="sref">unli>, p] href="+code=i" jlass="sref">unlj>; <].href="+code=sipexperefpolicclass="sref">unlexperefpolicc>
pa ; href="+code=str_helexpfpolicclass="sref">unls cpexpfpolicc>(paa href="net/netfilter/nf_conntrack_sip.c#L14806 idv3L15436 class="line" nam"v3L15636>156366a>
	nf_s/a>(pa href="+code=i" ilass="sref">unli>, p] href="+code=i" jlass="sref">unlj>; <].href="+code=sipexperefss="sgpaxlass="sref">unlexperefss="sgpax>
pa ; href="+code=str_HDREXPEC/a>)Xlass="sref">unl_HDREXPEC/a>)X> + a href="net/netfilter/nf_conntrack_sip.c#L14806 idv3L15546 class="line" nam"v3L15646>155466a>
	nf_s/a>(pa href="+code=i" ilass="sref">unli>, p] href="+code=i" jlass="sref">unlj>; <].href="+code=sipmLlass="sref">unl3L>
	unlTHIS_MODULE> + a href="net/netfilter/nf_conntrack_sip.c#L14806 idv3L15556 class="line" nam"v3L14656>146566a> 146666a>
	protorts>(pa href="+code=i" ilass="sref">unli>, p]opa href="+code=NUL_HDRPORTlass="sref">unl_HDRPORT>; 146766a>
	sk_bprintc>(pa href="+code=skb" class="sref">nf_s/a>(pa href="+code=i" ilass="sref">unli>, p] href="+code=i" jlass="sref">unlj>; <].href="+code=sipcv3Llass="sref">unlcv3L>
	<,pa
 class="string">'t;p/snepot;p/spa
 )) 146866a>
	146966a>
	sk_bprintc>(pa href="+code=skb" class="sref">nf_s/a>(pa href="+code=i" ilass="sref">unli>, p] href="+code=i" jlass="sref">unlj>; <].href="+code=sipcv3Llass="sref">unlcv3L>
	<,pa
 class="string">'t;p/snep-%uot;p/spa
 , pa href="+code=datilass="sref">unli>, p14706/a>
	< href="net/netfilter/nf_conntrack_sip.c#L14806 idv3L15616 class="line" nam"v3L14716>147167a>
	proce_debuc>(pa h
 class="string">'t;p/stort #%u: %uquot;p/spa
 )
+a href="+code=datilass="sref">unli>, pa href="+code=protortslass="sref">protorts>(pa href="+code=i" ilass="sref">unli>, p])a href="net/netfilter/nf_conntrack_sip.c#L14806 idv3L14726 class="line" nam"v3L14726>147267a> 147367a>
	retp/a>
= pa href="+code=proconn" cck_sipp_tc c_regist class="sref">ct_conn" cck_sipp_tc c_regist c>(pa p;pa href="+code=msgn class="sref">nf_s/a>(pa href="+code=i" ilass="sref">unli>, p] href="+code=i" jlass="sref">unlj>; <]147467a>
	retp/a>
==
pa  147567a>
	nf_printc>(pa href="+code=skbKERN_ERRlass="sref">nf_KERN_ERR>
	't;p/sconnef_ms: failed to regist cot;p/spa
 )
+ href="net/netfilter/nf_conntrack_sip.c#L15386 idv3L15566 class="line" nam"v3L14766>147667a>
	't;p/s p_tc c  (; pf: %u tort: %uquot;p/spa
 )
+a href="net/netfilter/nf_conntrack_sip.c#L15386 idv3L14676 class="line" nam"v3L14776>147767a>
	nf_s/a>(pa href="+code=i" ilass="sref">unli>, p] href="+code=i" jlass="sref">unlj>; <].href="+code=siptuplLlass="sref">unltuplL>, p.href="+code=sipsrclass="sref">prosrc>, p.href="+code=sipl3nuclass="sref">terl3nuc>, pa href="+code=protortslass="sref">protorts>(pa href="+code=i" ilass="sref">unli>, p])a href="net/netfilter/nf_conntrack_sip.c#L14806 idv3L15386 class="line" nam"v3L14786>147867a>
	unlconntrack_sips cpfini>(pa )a href="net/netfilter/nf_conntrack_sip.c#L14806 idv3L15596 class="line" nam"v3L14796>147967a>
	retp/a>; 148068a>
	148168a>
	148268a>
	148368a>
	14846/a>
	148568a> 14866/a>
	sipmodulepinic>(pa href="+code=skbconntrack_sips cpiniclass="sref">sipconntrack_sips cpinic>(pa)a href="net/netfilter/nf_conntrack_sip.c#L14806 idv3L14876 class="line" nam"v3L14876>148768a>
	sipmodulepexic>(pa href="+code=skbconntrack_sips cpfinilass="sref">unlconntrack_sips cpfini>(pa)a href="net/netfilter/nf_conntrack_sip.c#L14806 idv3L15386 class="line" nam"v3L14886>148868a> 


The gleninal LXR software by the href="nethttp://source (;ge./netprojects/lxcl>LXR mentunicy>, pa this experit">/al version by href="netmailto:lxc@e" ux.noerlxc@e" ux.no>, p. lxc.e" ux.no kindly host d by href="nethttp://www.redpill-e" pro.noerRedpill L" pro AS>, pa provider of L" uxtct sult">& and operations services since 1995.