linux/net/netfilter/nf_conntrack_proto_udp.c
<<
>>
Prefs
   1/* (C) 1999-2001 Paul `Rusty' Russell
   2 * (C) 2002-2004 Netfilter Core Team <coreteam@netfilter.org>
   3 *
   4 * This program is free software; you can redistribute it and/or modify
   5 * it under the terms of the GNU General Public License version 2 as
   6 * published by the Free Software Foundation.
   7 */
   8
   9#include <linux/types.h>
  10#include <linux/timer.h>
  11#include <linux/module.h>
  12#include <linux/udp.h>
  13#include <linux/seq_file.h>
  14#include <linux/skbuff.h>
  15#include <linux/ipv6.h>
  16#include <net/ip6_checksum.h>
  17#include <net/checksum.h>
  18
  19#include <linux/netfilter.h>
  20#include <linux/netfilter_ipv4.h>
  21#include <linux/netfilter_ipv6.h>
  22#include <net/netfilter/nf_conntrack_l4proto.h>
  23#include <net/netfilter/nf_conntrack_ecache.h>
  24#include <net/netfilter/nf_log.h>
  25#include <net/netfilter/ipv4/nf_conntrack_ipv4.h>
  26#include <net/netfilter/ipv6/nf_conntrack_ipv6.h>
  27
  28static unsigned int udp_timeouts[UDP_CT_MAX] = {
  29        [UDP_CT_UNREPLIED]      = 30*HZ,
  30        [UDP_CT_REPLIED]        = 180*HZ,
  31};
  32
  33static inline struct nf_udp_net *udp_pernet(struct net *net)
  34{
  35        return &net->ct.nf_ct_proto.udp;
  36}
  37
  38static bool udp_pkt_to_tuple(const struct sk_buff *skb,
  39                             unsigned int dataoff,
  40                             struct nf_conntrack_tuple *tuple)
  41{
  42        const struct udphdr *hp;
  43        struct udphdr _hdr;
  44
  45        /* Actually only need first 8 bytes. */
  46        hp = skb_header_pointer(skb, dataoff, sizeof(_hdr), &_hdr);
  47        if (hp == NULL)
  48                return false;
  49
  50        tuple->src.u.udp.port = hp->source;
  51        tuple->dst.u.udp.port = hp->dest;
  52
  53        return true;
  54}
  55
  56static bool udp_invert_tuple(struct nf_conntrack_tuple *tuple,
  57                             const struct nf_conntrack_tuple *orig)
  58{
  59        tuple->src.u.udp.port = orig->dst.u.udp.port;
  60        tuple->dst.u.udp.port = orig->src.u.udp.port;
  61        return true;
  62}
  63
  64/* Print out the per-protocol part of the tuple. */
  65static int udp_print_tuple(struct seq_file *s,
  66                           const struct nf_conntrack_tuple *tuple)
  67{
  68        return seq_printf(s, "sport=%hu dport=%hu ",
  69                          ntohs(tuple->src.u.udp.port),
  70                          ntohs(tuple->dst.u.udp.port));
  71}
  72
  73static unsigned int *udp_get_timeouts(struct net *net)
  74{
  75        return udp_pernet(net)->timeouts;
  76}
  77
  78/* Returns verdict for packet, and may modify conntracktype */
  79static int udp_packet(struct nf_conn *ct,
  80                      const struct sk_buff *skb,
  81                      unsigned int dataoff,
  82                      enum ip_conntrack_info ctinfo,
  83                      u_int8_t pf,
  84                      unsigned int hooknum,
  85                      unsigned int *timeouts)
  86{
  87        /* If we've seen traffic both ways, this is some kind of UDP
  88           stream.  Extend timeout. */
  89        if (test_bit(IPS_SEEN_REPLY_BIT, &ct->status)) {
  90                nf_ct_refresh_acct(ct, ctinfo, skb,
  91                                   timeouts[UDP_CT_REPLIED]);
  92                /* Also, more likely to be important, and not a probe */
  93                if (!test_and_set_bit(IPS_ASSURED_BIT, &ct->status))
  94                        nf_conntrack_event_cache(IPCT_ASSURED, ct);
  95        } else {
  96                nf_ct_refresh_acct(ct, ctinfo, skb,
  97                                   timeouts[UDP_CT_UNREPLIED]);
  98        }
  99        return NF_ACCEPT;
 100}
 101
 102/* Called when a new connection for this protocol found. */
 103static bool udp_new(struct nf_conn *ct, const struct sk_buff *skb,
 104                    unsigned int dataoff, unsigned int *timeouts)
 105{
 106        return true;
 107}
 108
 109static int udp_error(struct net *net, struct nf_conn *tmpl, struct sk_buff *skb,
 110                     unsigned int dataoff, enum ip_conntrack_info *ctinfo,
 111                     u_int8_t pf,
 112                     unsigned int hooknum)
 113{
 114        unsigned int udplen = skb->len - dataoff;
 115        const struct udphdr *hdr;
 116        struct udphdr _hdr;
 117
 118        /* Header is too small? */
 119        hdr = skb_header_pointer(skb, dataoff, sizeof(_hdr), &_hdr);
 120        if (hdr == NULL) {
 121                if (LOG_INVALID(net, IPPROTO_UDP))
 122                        nf_log_packet(pf, 0, skb, NULL, NULL, NULL,
 123                                      "nf_ct_udp: short packet ");
 124                return -NF_ACCEPT;
 125        }
 126
 127        /* Truncated/malformed packets */
 128        if (ntohs(hdr->len) > udplen || ntohs(hdr->len) < sizeof(*hdr)) {
 129                if (LOG_INVALID(net, IPPROTO_UDP))
 130                        nf_log_packet(pf, 0, skb, NULL, NULL, NULL,
 131                                "nf_ct_udp: truncated/malformed packet ");
 132                return -NF_ACCEPT;
 133        }
 134
 135        /* Packet with no checksum */
 136        if (!hdr->check)
 137                return NF_ACCEPT;
 138
 139        /* Checksum invalid? Ignore.
 140         * We skip checking packets on the outgoing path
 141         * because the checksum is assumed to be correct.
 142         * FIXME: Source route IP option packets --RR */
 143        if (net->ct.sysctl_checksum && hooknum == NF_INET_PRE_ROUTING &&
 144            nf_checksum(skb, hooknum, dataoff, IPPROTO_UDP, pf)) {
 145                if (LOG_INVALID(net, IPPROTO_UDP))
 146                        nf_log_packet(pf, 0, skb, NULL, NULL, NULL,
 147                                "nf_ct_udp: bad UDP checksum ");
 148                return -NF_ACCEPT;
 149        }
 150
 151        return NF_ACCEPT;
 152}
 153
 154#if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)
 155
 156#include <linux/netfilter/nfnetlink.h>
 157#include <linux/netfilter/nfnetlink_cttimeout.h>
 158
 159static int udp_timeout_nlattr_to_obj(struct nlattr *tb[],
 160                                     struct net *net, void *data)
 161{
 162        unsigned int *timeouts = data;
 163        struct nf_udp_net *un = udp_pernet(net);
 164
 165        /* set default timeouts for UDP. */
 166        timeouts[UDP_CT_UNREPLIED] = un->timeouts[UDP_CT_UNREPLIED];
 167        timeouts[UDP_CT_REPLIED] = un->timeouts[UDP_CT_REPLIED];
 168
 169        if (tb[CTA_TIMEOUT_UDP_UNREPLIED]) {
 170                timeouts[UDP_CT_UNREPLIED] =
 171                        ntohl(nla_get_be32(tb[CTA_TIMEOUT_UDP_UNREPLIED])) * HZ;
 172        }
net<173" class="line" name="L12241ref">net<173" cnntrack_proto_udp.c#L1ref">net<173" cf5m/ass="line" name="L172"> 172        {108" class="line" name="L1172       {108" clasO1a hre17t/netfilter/nf_conntrf_conntrack_proto_udp.c#L167" id="L167" class="line" name="L167"> 167         172        {108" class="line" s="line" " name="L74">  74{
<1a hre17"net/netfilter/nf_conntrackoto_udp.c#L171" id="L171" class="line" name="L171"> 171                        ntohl(nla_ge173" cnntrack_proto_udp.c#L1ref">net<173" cf5m/ass=ef="+code=CTA_TIMEOUT_UDP_UNREPLIED" class="sref">CTA_TIMEOUT_UDP_UNREPLIED])) * timeouts;
<1a hre176/netfilter/nf_conntrack_proto_udp.c#L172" id="L172" class="line" "sref">UD" name="L76">  76}
<1a hre17t/netfilter/nf_connt0="sref">CTA_TIMEOUT_UDP_UNREPLIED])) * e" name="L77">  77
<1a hre1="net/f_conntrack_proto_udp.c#L172" id="L172" class="line" s="line" onntracktype */
<1a hre17"net/netfilter/nf_conntrack_proto_udp.c#L49" id="L49" c1"+code=ct1" class="sref">ct,
<1a hre1="net/filter/nf_netfilter/nf_conntrack_proto_udp.c#L49" id="L49" c1"sref">UDP class="sref">skb,
<1a hre1="net/onntrack_proto_udp.c#L159" objtic _nlattr_to_obj" classudp.c#L159" objtic _nlatt nf_conn *tmpl, struct net *net, void *dataoff,
<1a hre1="net/line" name="L172"> 172        {108" class="line"tinfo" cl1ass="sref">ctinfo,
<1a hre1="net/netfiltef_connf_conntrack_proto_udp.c#L162" id="L162" class="line" name="L162"> 162        unsigned int *timeouts = pf,
<1a hre18t/netfilter/nf_conntrack_proto_udp.c#L164" id="L164" claknum" cla1ss="sref">hooknum,
<1a hre1="net/netfiltef_conntrack_proto_ud="+pu                144            nla_get_be32(tb[nlattr *timeouts)
<1a hre18"net/netfilter/nf_conntrack_prchecksum" class=ton171" class="line=ton1hl" class="sref">ntohL170" id="L170" class="line" name="L170"> 170                /"+code=CTA_TIMEOUT_UDP_UNREPLIED" class=ef||"+code=nlattr" class="sref">nlattr *UD" name="L86">  86{
<1a hre18t/netfilter/nf_conntrack_proto_ud="+pu                144            nla_ge173" cnntrack_proto_udp.c#L1ref">net<173" cf5m/as="+code=nlattr" class="sref">nlattr *ome kind of UDP
<1a hre18t/netfilter/nf_conntrntrack_prchecksum" class=ton171" class="line=ton1hl" class="sref">ntohL170" id="L170" class="line" name="L170"> 170                net, void *
<1a hre18t/netfilter/nf_conntrga honntrack_proto_ud="+pu  failurname="L94">  94timeouts = status)) {
<1a hre1="net/netfiltef_connt0="sref">CTA_TIMEOUT_UDP_UNREPLIED])) * skb,
<1a hre19t/netfilter/nf_conntrack_proto_udp.c#L101" id="L101" class="sref"1>UDP_CT_REPLIED]);
<1a hre1="net/nntrack_proto_ud="+pu  failurname="L94">  94
<1a hre1="net/netfilteack_proto_udp.c#L148" iENOSPCame="L94">  94timeouts = status))
<1a hre19"net/netfilter/nf_conntrack_proto_udp.c#L54" id="L54" cl1+code=ct"1 class="sref">ct);
<1a hre19t/netfilter/nf_conntrack_proto_udp.c#L155" id="L155" cla="L95">  195        } else {
<1a hre19"net/netfiltc_udp.c#L66" id="L66" class="="+policyame="L94">  94UD class="sref">skb,
<1a hre1="net/onntrack_proto_udp.c#L159" id=+policyame="L94">  94nla_geMAXntrack_proto_udp.c#L1ref">net<1MAXde=n+1srefline" name="L172"> 172        {108" class="line"="sref">U1DP_CT_UNREPLIED]);
<1a hre1="net/netfiltla_get_be32" class="sref">nla_get_be32(tb[ 162        uNLA_U           }="+code=nlattr" class="sref">nlattr *  98        }
<1a hre1="net/netfiltla_get_be32" class="sref">nla_ge173" cnntrack_proto_udp.c#L1ref">net<173" cf5m/assnetfilteefl  href="+code=netd="L170" class="/a>162"> 162        uNLA_U           }="+code=nlattr" class="sref">nlattr *NF_ACCEPT;
timeouts =  100}
IS_ENABLED( 165        /* set defa2ss="line"2name="L101"> 101

NULLstatus))
<2ref="2et/netnetfiltc#L66" id="L66" class=f="+tab                 f="+tab  162">onntrack_proto_udp.href="+tab                 udp.href="+tab  a hrefrefline" name="L172"> 172        {108" class="line2ts" class2"sref">timeouts)
 172        {108" class="line2t6" class2"5        } else {
<2ref="20"net/netfilter/nf_con/a>.s, "sport=%2e=true" c2ass="sref">true;
ntohsudp. 107}
ntohsudp.  98        }
<2ref="20t/netfilter/nf_conntr/a>.        udroc_dass=vec_jiffieid="L170" class=droc_dass=vec_jiffieim/as="+code=nlattr" class="sref">nlattr *skb,
nlattr *ctinfo,
 172        {108" class="line2+code=pf"2class="sref">pf,
s, "sport=%2num" clas2="sref">hooknum)
ntohsudp. 113{
ntohsudp.dataoff;
.        udroc_dass=vec_jiffieid="L170" class=droc_dass=vec_jiffieim/as="+code=nlattr" class="sref">nlattr *hdr;
nlattr *_hdr;
 117
timeouts = IS_ONNTRACK_PROCS_OMPAS_ENABLED" class="sref">IS_ONNTRACK_PROCS_OMPASnet/netfilter/nf_conntrack_proto_udp.c#L72" id="L72" c2=_hdr" cl2ss="sref">_hdr);
onntrack_proto_udp.rotpat.href="+tab                 udp.rotpat.href="+tab  a hrefrefline" name="L172"> 172        {108" class="line2NULL" cla2s="sref">NULL) {
 172        {108" class="line2class="sr2f">IPPROTO_UDP))
s, "sport=%2e=NULL" c2ass="sref">NULL,
ntohsudp..ntohsudp.NF_ACCEPT;
.        udroc_dass=vec_jiffieid="L170" class=droc_dass=vec_jiffieim/as="+code=nlattr" class="sref">nlattr * 125        }
nlattr * 126
 172        {108" class="line2cs="line"2ed packets */
s, "sport=%2=hdr" cla2s="sref">hdr)) {
ntohsudp.IPPROTO_UDP))
ntohsudp.NULL,
nlattr *nlattr *NF_ACCEPT;
 133        }
timeouts =  134
IS_ONNTRACK_PROCS_OMPASame="L165"> 165        /* set defa2ket with 2o checksum */
 165        /* set defa2ks="line"2ss="sref">check)
NF_ACCEPT;
tps="sref">ntohsnlattr * 138
 163        struct net, void * 172        {108" class="line2ts on the2outgoing path
NULL
ntohs "+tab                 f="+tab  162"+code=net" class="sref">net, void *
CTA_TIMEOUT_UDP_UNREPLIED])) *  &&
ntohs "+tab                 f="+tab  162"l 162        ukmemdup               kmemduphl" class="sref">ntoudp.href="+tab                 udp.href="+tab  a hr="+code=nlattr" class="sref">nlattr *pf)) {
udp.href="+tab                 udp.href="+tab  a hr href="+code=udp" class="sref">udp.IPPROTO_UDP))
NULLCTA_TIMEOUT_UDP_UNREPLIED])) * NULL,
ntohs "+tab                 f="+tab  162"+code=net" class="sref">net, void *);
  94timeouts = NF_ACCEPT;
ntohs "+tab                 f="+tab  162"[0]/a>.dataref="+code=UDP_CT_UNREPLIED" class="sref">UDP_CT_UNREPLIED] = un->timeouts[ 149        }
ntohs "+tab                 f="+tab  162"[1]/a>.dataref="+code=UDP_CT_UNREPLIED" class="sref">UDP_CT_UNREPLIED] = un->timeouts[ 150
timeouts[NF_ACCEPT;
CTA_TIMEOUT_UDP_UNREPLIED])) *  152}
 153
)
tps="sref">ntohsnlattr * 155
 163        struct net, void * 172        {108" class="line2/nfnetlin2_cttimeout.h>
NULL 158
IS_ONNTRACK_PROCS_OMPAS_ENABLED" class="sref">IS_ONNTRACK_PROCS_OMPASnet/netfilter/nf_conntrack_proto_udp.c#L72" id="L72" c2ode=tb" c2ass="sref">tb[],
ntohs "+rotpat.tab                 f="+rotpat.tab  162"l 162        ukmemdup               kmemduphl" class="sref">ntoudp.rotpat.href="+tab                 udp.rotpat.href="+tab  a hr="+code=nlattr" class="sref">nlattr *data)
udp.rotpat.href="+tab                 udp.rotpat.href="+tab  a hr href="+code=udp" class="sref">udp. 161{
NULLCTA_TIMEOUT_UDP_UNREPLIED])) * data;
ntohs "+rotpat.tab                 f="+rotpat.tab  162"+code=net" class="sref">net, void *net);
  94timeouts =  164

ntohs "+rotpat.tab                 f="+rotpat.tab  162"[0]/a>.dataref="+code=UDP_CT_UNREPLIED" class="sref">UDP_CT_UNREPLIED] = un->timeouts[];
ntohs "+rotpat.tab                 f="+rotpat.tab  162"[1]/a>.dataref="+code=UDP_CT_UNREPLIED" class="sref">UDP_CT_UNREPLIED] = un->timeouts[];
timeouts[ 168
timeouts[]) {
CTA_TIMEOUT_UDP_UNREPLIED])) * UD2_CT_UNREPLIED] =
HZ;
 172        }
 160                                     struct onntrack_proto_2" idd="L170" class=droto162"+code=net" class="sref">net, void *       {108" clasO2a hre27t/netline" name="L172"> 172        {108" class="line2 s="line"2" name="L74">  74{
<2a hre27"net/netfiltenf_conntrack_proto_r                srruct <="sref">CTA_TIMEOUT_UDP_UNREPLIED])) * timeouts;
<2a hre27t/netfilter/nf_conntrack_proto_udp.c#L163" id="L163" class="line" name="L163"> 163        struct nf_udp_net *un = udp_pernet(U2" name="L76">  76}
<2a hre27t/netfilter/nref="+code=udp_timeouto_u id="Lnid="L163" class="lin id="Lnid=tmpl" class="sref">tps="sref">ntohsdataref="+code=UDP_CT_UNREPLIED" class="sref">Ups="sref">ntohsudp_pernet(  77
<2a hre27t/netfilter/nf_conntrack_proto_udp.c#L168" id="L168" cl2 s="line"2onntracktype */
<2a hre27t/netfilter/nf_conntrack_proto_udps="sref">ntohs] = userNcode=nline" name="L172"> 172        {108" class="line2"+code=ct2" class="sref">ct,
<2a hre28t/netfilter/nf_conntrnf_conntrack_proto_iREPLIED] = im/asudp_pernet" class="sref">udp_pernet(UD2 class="sref">skb,
<2a hre28t/netfilter/nf_conntrack_proto_udp.c#L101" id="L101" cl2aoff" cla2ss="sref">dataoff,
<2a hre28t/netfilter/nf_conntr"lin=un" class="srefiREPLIED] = im/asc= 0ct.unun.net, void *ctinfo,
<2a hre28t/netfilter/nf_conntrfilter/nf_conntrack_proref="+code=UDP_CT_UNREPLIED" class="sref">UDP_CT_UNREPLIED] = timeouts[] = udp.c#L159"N"+code=un" class="sriREPLIED] = im/assudp_pernet" class="sref">udp_pernet(pf,
<2a hre28t/netfilter/nf_conntrack_proto_udp.c#L172" id="L172" class="line2knum" cla2ss="sref">hooknum,
<2a hre28t/netfilter/nf_conntrack_proto_udp.c#L155" id="L155" cl2uts" clas2s="sref">timeouts)
<2a hre28t/netfilter/nf_coonntrack_proto_2" idd="L170" class=droto162"">sysctl_checksum 172        {108" class="line2""sref">U2" name="L86">  86{
<2a hre28t/netfilter/nf_coer/nf_conntrack_pror                srruct timeouts[tps="sref">ntohsudp_pernet(
<2a hre28t/netfilter/nf_conntrf_coonntrack_proto_r                srruct net, void *
<2a hre28t/netfilter/nf_conntrrrrrrrrrf_conntrack_proto_udp.r                srruct <="sref">CTA_TIMEOUT_UDP_UNREPLIED])) * status)) {
<2a hre29t/netfilter/nf_conntrack_proto_udp.c#L150" id="L150" cl2code=skb"2 class="sref">skb,
<2a hre29t/netfilter/nf_conntrf_conntrack_pror                srruct timeouts[tps="sref">ntohsudp_pernet(UDP_CT_REPLIED]);
<2a hre29t/netfilter/nf_conntrf_coonntrack_proto_r                srruct net, void *
<2a hre29t/netfilter/nf_conntrfilter/nf_conntrack_proettps="sref">ntohsudp_pernet(status))
<2a hre29t/netfilter/nf elsedp_pernet" class="sref">udp_pernet(ct);
<2a hre29t/netfilter/nf_conntrf_conntrack_pror                srruct timeouts[tps="sref">ntohsudp_pernet(        } else {
<2a hre29"net/dp_pernet" class="sref">udp_pernet(U2 class="sref">skb,
<2a hre29t/netfilter/nf_conntrack_proto_udp.r                srruct <="sref">CTA_TIMEOUT_UDP_UNREPLIED])) * ]);
<2a hre29"net/f_conntrack_proto_udp.c#L172" id="L172" class="line2e" name="2L98">  98        }
<2a hre29"net/netfilter/nf_conntrack_proto_udp.c#L49" id="L49" c3T" class=3sref">NF_ACCEPT;
tudp.codenid_2" idd="L170" class=udp.codenid_2" id  160                                     struct <+code=net" class="sref">net, void * 100}
 101
data                 struct  143        if (ntohsudp_pernet(status))
<3ref="30t/netfilter/nf_conntrack_proto_udp.c#L164" id="L164" cl3ts" class3"sref">timeouts)
onntrack_proto_etonntrack_proto___read_mostlyame="L94">  94<__read_mostlyct         } else {
<3ref="30"net/filter/nf_conntrack_proto_udp.c#L161" id="L161" cla3s7" class3"class="sref">skb,
<3ref="30t/netfilter/n href="+code=netl32" idd="L170" class=l32" id/netfilter/nf_conntref">timeouts[Pm" clad="L170" class=Pm" clacodehref="+code=udp" class="sref">udp. 107}
ilter/nf_conntref">timeouts[f">hooknum, udp.  98        }
<3ref="30t/netfilter/n href="+code=netese                lse net/netfilter/nf_conntref"147" id="L147" class="linef="de=s" class="sref">s, "sport=%3ode=skb" 3lass="sref">skb,
udp.ctinfo,
udp.pf,
udp.hooknum)
udp. 113{
] = codec#L159"Nnet/netfilter/n=nf_udp_net" class="scodec#L159"NREPLIED] = s="scodec#L159"Nf" clref="+code=udp" class="sref">udp.dataoff;
udp.hdr;
udp._hdr;
 154#if net, void * 117
udp.
static tup                 ea>static tup  /netfilter/n=nf_udp_net" clasetstatic tup                 etstatic tup  f" clref="+code=udp" class="sref">udp._hdr);
statiup  _fde=               ea>statiup  _fde=/netfilter=nf_udp_net" clasetstatiup  _fde=               etstatiup  _fde=f" clref="+code=udp" class="sref">udp.NULL) {
  94+policyame="L94">  94+policyf" clref="+code=udp" class="sref">udp.IPPROTO_UDP))
timeouts[NULL,
 154#if (net, void *.        ifnlec#L159"net/netfilter/n=nfilter/nf_conntrack_proto_udp.c#L161" id="L161" cla3T" class=3sref">NF_ACCEPT;
.timeouts[static obj               static objf" clref="+code=udp" class="sref">udp. 125        }
.timeouts[udp. 126
statmax               ea>statmax/netfilteef">timeouts[ss="sref">nla_geMAXntrack_proto_udp.c#L1ref">net<1MAXde=nlref="+code=udp" class="sref">udp.
nla_geMAXntrack_proto_udp.c#L1ref">net<1MAXde=nlref="+code=udp" class="sref">udp.hdr)) {
  94timeouts[+policyame="L94">  94udp.IPPROTO_UDP))
nlattr *NULL,
IS_ENABLED( 165        /* set defa3lformed p3cket ");
nlattr *NF_ACCEPT;
nlattr * 133        }
timeouts =  134
NULL etudp_pernet(udp_pernet(check)
onntrack_proto_etonntrack_proto___read_mostlyame="L94">  94<__read_mostlyct NF_ACCEPT;
 138
timeouts[Pm" cla6d="L170" class=Pm" cla6 nlattr *ilter/nf_conntref">timeouts[f">hooknum, udp.s, "sport=%3 assumed 3o be correct.
udp.
udp..udp.pf)) {
udp.IPPROTO_UDP))
] = codec#L159"Nnet/netfilter/n=nf_udp_net" class="scodec#L159"NREPLIED] = s="scodec#L159"Nf" clref="+code=udp" class="sref">udp.NULL,
udp.);
udp.NF_ACCEPT;
 154#if net, void * 149        }
udp. 150
static tup  /netfilter/n=nf_udp_net" clasetstatic tup                 etstatic tup  f" clref="+code=udp" class="sref">udp.NF_ACCEPT;
statiup  _fde=               ea>statiup  _fde=/netfilter=nf_udp_net" clasetstatiup  _fde=               etstatiup  _fde=f" clref="+code=udp" class="sref">udp. 152}
  94+policyame="L94">  94+policyf" clref="+code=udp" class="sref">udp. 153
timeouts[)
 154#if (net, void * 155
        ifnlec#L159"net/netfilter/n=nfilter/nf_conntrack_proto_udp.c#L161" id="L161" cla3/netfilte3/nfnetlink.h>
static obj               ea>static objnet/neef">timeouts[static obj               static objf" clref="+code=udp" class="sref">udp..timeouts[udp. 158
timeouts[ss="sref">nla_geMAXntrack_proto_udp.c#L1ref">net<1MAXde=nlref="+code=udp" class="sref">udp.tb[],
nla_geMAXntrack_proto_udp.c#L1ref">net<1MAXde=nlref="+code=udp" class="sref">udp.data)
  94timeouts[+policyame="L94">  94udp. 161{
nlattr *data;
IS_ENABLED( 165        /* set defa3de=net" c3ass="sref">net);
nlattr * 164
nlattr *timeouts = NULL etudp_pernet(


The original LXR software by the p_pernet"http://sourceforge. cla>(LXR rotounityde=nl this experio_udal version by p_pernet"masreo:lx"@IEDux.no">lx"@IEDux.node=n.
lx".IEDux.no kindly hosttraby p_pernet"http://www.redpill-IED>(<.no">Redpill LED>(< ASde=nl >(