linux/net/core/filter.c
<<
>>
Prefs
   1/*
   2 * Linux Socket Filter - Kernel level socket filtering
   3 *
   4 * Author:
   5 *     Jay Schulist <jschlst@samba.org>
   6 *
   7 * Based on the design of:
   8 *     - The Berkeley Packet Filter
   9 *
  10 * This program is free software; you can redistribute it and/or
  11 * modify it under the terms of the GNU General Public License
  12 * as published by the Free Software Foundation; either version
  13 * 2 of the License, or (at your option) any later version.
  14 *
  15 * Andi Kleen - Fix a few bad bugs and races.
  16 * Kris Katterjohn - Added many additional checks in sk_chk_filter()
  17 */
  18
  19#include <linux/module.h>
  20#include <linux/types.h>
  21#include <linux/mm.h>
  22#include <linux/fcntl.h>
  23#include <linux/socket.h>
  24#include <linux/in.h>
  25#include <linux/inet.h>
  26#include <linux/netdevice.h>
  27#include <linux/if_packet.h>
  28#include <linux/gfp.h>
  29#include <net/ip.h>
  30#include <net/protocol.h>
  31#include <net/netlink.h>
  32#include <linux/skbuff.h>
  33#include <net/sock.h>
  34#include <linux/errno.h>
  35#include <linux/timer.h>
  36#include <asm/uaccess.h>
  37#include <asm/unaligned.h>
  38#include <linux/filter.h>
  39#include <linux/reciprocal_div.h>
  40#include <linux/ratelimit.h>
  41#include <linux/seccomp.h>
  42
  43/* No hurry in this branch
  44 *
  45 * Exported for the bpf jit load helper.
  46 */
  47void *bpf_internal_load_pointer_neg_helper(const struct sk_buff *skb, int k, unsigned int size)
  48{
  49        u8 *ptr = NULL;
  50
  51        if (k >= SKF_NET_OFF)
  52                ptr = skb_network_header(skb) + k - SKF_NET_OFF;
  53        else if (k >= SKF_LL_OFF)
  54                ptr = skb_mac_header(skb) + k - SKF_LL_OFF;
  55
  56        if (ptr >= skb->head && ptr + size <= skb_tail_pointer(skb))
  57                return ptr;
  58        return NULL;
  59}
  60
  61static inline void *load_pointer(const struct sk_buff *skb, int k,
  62                                 unsigned int size, void *buffer)
  63{
  64        if (k >= 0)
  65                return skb_header_pointer(skb, k, size, buffer);
  66        return bpf_internal_load_pointer_neg_helper(skb, k, size);
  67}
  68
  69/**
  70 *      sk_filter - run a packet through a socket filter
  71 *      @sk: sock associated with &sk_buff
  72 *      @skb: buffer to filter
  73 *
  74 * Run the filter code and then cut skb->data to correct size returned by
  75 * sk_run_filter. If pkt_len is 0 we toss packet. If skb->len is smaller
  76 * than pkt_len we keep whole skb->data. This is the socket level
  77 * wrapper to sk_run_filter. It returns 0 if the packet should
  78 * be accepted or -EPERM if the packet should be tossed.
  79 *
  80 */
  81int sk_filter(struct sock *sk, struct sk_buff *skb)
  82{
  83        int err;
  84        struct sk_filter *filter;
  85
  86        /*
  87         * If the skb was allocated from pfmemalloc reserves, only
  88         * allow SOCK_MEMALLOC sockets to use it as this socket is
  89         * helping free memory
  90         */
  91        if (skb_pfmemalloc(skb) && !sock_flag(sk, SOCK_MEMALLOC))
  92                return -ENOMEM;
  93
  94        err = security_sock_rcv_skb(sk, skb);
  95        if (err)
  96                return err;
  97
  98        rcu_read_lock();
  99        filter = rcu_dereference(sk->sk_filter);
 100        if (filter) {
 101                unsigned int pkt_len = SK_RUN_FILTER(filter, skb);
 102
 103                err = pkt_len ? pskb_trim(skb, pkt_len) : -EPERM;
 104        }
 105        rcu_read_unlock();
 106
 107        return err;
 108}
 109EXPORT_SYMBOL(sk_filter);
 110
 111/**
 112 *      sk_run_filter - run a filter on a socket
 113 *      @skb: buffer to run the filter on
 114 *      @fentry: filter to apply
 115 *
 116 * Decode and apply filter instructions to the skb->data.
 117 * Return length to keep, 0 for none. @skb is the data we are
 118 * filtering, @filter is the array of filter instructions.
 119 * Because all jumps are guaranteed to be before last instruction,
 120 * and last instruction guaranteed to be a RET, we dont need to check
 121 * flen. (We used to pass to this function the length of filter)
 122 */
 123unsigned int sk_run_filter(const struct sk_buff *skb,
 124                           const struct sock_filter *fentry)
 125{
 126        void *ptr;
 127        u2#" name="L30">  31 name="L84">  84        strM="L120t/cor1me="L_6=ccumulatn lpan class="comment"> */
  98        u2X     84        strM="L120t/cor1me="L_6Indexan gisr ispan class="comment"> */
  49        u2me href="+code=pskme uter[c#L32" sref">u2BPFOC" WORDShref="+code=pskBPFOC" WORDSuter];        strM="L120t/cor1me="L_6Scratch M      St guapan class="comment"> */
  49        u2tmp   ptr;
skb, int ptr;
 102
  86        /*
 114
 115 */
head & *filter) {
head &def37"gt;EXPORT_SYMBOCONFIG_X86_     fentry)
head &K   SK_RUN_FILTER/a> *skfentry)
fentry)
  49        u2K   err *skptr;
ptr;
  42
 10switch ef">SK_RUN_FILTER/a> *skfilter) {
 12cas"">head &BPFOS_ALU_ADD_X   filter) {
  6" name="L49">  49  #" name="L30">  31+class="sref">errptr;
  9a>         tinue class="sref">ptr;
  5cas"">head &BPFOS_ALU_ADD_K   filter) {
  6" name="L49">  49  #" name="L30">  31+class="sref">errptr;
  9a>         tinue class="sref">ptr;
head &BPFOS_ALU_SUB_X   filter) {
 10" name="L49">  49  #" name="L30">  31-class="sref">errptr;
  5a>         tinue class="sref">ptr;
 10 as"">head &BPFOS_ALU_SUB_K   filter) {
  5" name="L49">  49  #" name="L30">  31-class="sref">errptr;
  6" name="   tinue class="sref">ptr;
  9 as"">head &BPFOS_ALU_MUL_X   filter) {
  5" name="L49">  49  #" name="L30">  31*class="sref">errptr;
  6" name="   tinue class="sref">ptr;
  9 as"">head &BPFOS_ALU_MUL_K   filter) {
  49  #" name="L30">  31*class="sref">errptr;
 10" name="   tinue class="sref">ptr;
  6 as"">head &BPFOS_ALU_DIV_X   filter) {
 1000000000100"> 100      X   k >= 0)
 124           107"> 10 class="sref">ptr;
  6" name="L49">  49  #" name="L30">  31/class="sref">errptr;
  9a>         tinue class="sref">ptr;
  5cas"">head &BPFOS_ALU_DIV_K   filter) {
  6" name="L49">  49  #" name="L30">  31ss="sref">filterEXPORT_SYMBO#" name="L30">  3 class="sref">skbK   sk_filter);
  9a>         tinue class="sref">ptr;
head &BPFOS_ALU_AND_X   filter) {
 10" name="L49">  49  #" name="L30">  31"srefclass="sref">errptr;
  5a>         tinue class="sref">ptr;
 10 as"">head &BPFOS_ALU_AND_K   filter) {
  5" name="L49">  49  #" name="L30">  31"srefclass="sref">errptr;
  6" name="   tinue class="sref">ptr;
  9 as"">head &BPFOS_ALU_OR_X   filter) {
  5" name="L49">  49  #" name="L30">  31|class="sref">errptr;
  6" name="   tinue class="sref">ptr;
  9 as"">head &BPFOS_ALU_OR_K   filter) {
  49  #" name="L30">  31|class="sref">errptr;
 10" name="   tinue class="sref">ptr;
  6 as"">head &BPFOS_ALU_LSH_X   filter) {
 1000000000L49">  49  #" name="L30">  31"lt;lass="sref">size X   ptr;
  5" name="   tinue class="sref">ptr;
  6 as"">head &BPFOS_ALU_LSH_K   filter) {
  9a>      L49">  49  #" name="L30">  31"lt;lass="sref">size K   ptr;
  5" name="   tinue class="sref">ptr;
  6 as"">head &BPFOS_ALU_RSH_X   filter) {
  9a>      L49">  49  #" name="L30">  31"gfx/rig="sref">size X   ptr;
ptr;
 10 as"">head &BPFOS_ALU_RSH_K   filter) {
  9a>      L49">  49  #" name="L30">  31"gfx/rig="sref">size K   ptr;
 1000000000   tinue class="sref">ptr;
 12cas"">head &BPFOS_ALU_NEG   filter) {
  6" name="L49">  49  #" name="L30">  31="sref">pkt_len#" name="L30">  3 class="sref">ptr;
  900000000   tinue class="sref">ptr;
  5cas"">head &BPFOS_JMP_J#" name="L30BPFOS_JMP_Jfilter) {
  6" name="L49">  49  R/a> *errptr;
  9a>         tinue class="sref">ptr;
head &BPFOS_JMP_JGT_K   filter) {
 10" name="L49">  49  R/a> *EXPORT_SYMBO#" name="L30">  31"gfxclass="sref">skbK   pkt_len *skpkt_len *skptr;
  5a>         tinue class="sref">ptr;
 10 as"">head &BPFOS_JMP_JGE_K   filter) {
  5" name="L49">  49  R/a> *EXPORT_SYMBO#" name="L30">  31"gfxclass="sref">errpkt_len *skpkt_len *skptr;
  6" name="   tinue class="sref">ptr;
  9 as"">head &BPFOS_JMP_JEQ_K   filter) {
  5" name="L49">  49  R/a> *EXPORT_SYMBO#" name="L30">  31=class="sref">errpkt_len *skpkt_len *skptr;
  6" name="   tinue class="sref">ptr;
  9 as"">head &BPFOS_JMP_JSET_K   filter) {
  49  R/a> *EXPORT_SYMBO#" name="L30">  31"sref">head &K   pkt_len *skpkt_len *skptr;
 10" name="   tinue class="sref">ptr;
  6 as"">head &BPFOS_JMP_JGT_X   filter) {
 1000000000L49">  49  R/a> *EXPORT_SYMBO#" name="L30">  31"gfxclass="sref">skbX   pkt_len *skpkt_len *skptr;
  5" name="   tinue class="sref">ptr;
  6 as"">head &BPFOS_JMP_JGE_X   filter) {
  9a>      L49">  49  R/a> *EXPORT_SYMBO#" name="L30">  31"gfxclass="sref">errpkt_len *skpkt_len *skptr;
  5" name="   tinue class="sref">ptr;
  6 as"">head &BPFOS_JMP_JEQ_X   filter) {
  9a>      L49">  49  R/a> *EXPORT_SYMBO#" name="L30">  31=class="sref">errpkt_len *skpkt_len *skptr;
ptr;
 10 as"">head &BPFOS_JMP_JSET_X   filter) {
  9a>      L49">  49  R/a> *EXPORT_SYMBO#" name="L30">  31"sref">head &X   pkt_len *skpkt_len *skptr;
 1000000000   tinue class="sref">ptr;
 12 as"">head &BPFOS_LD_W_ABShref="+code=pskBPFOS_LD_W_ABSine":="sref">filter) {
  6" name="L49">  49    if (errptr;
err<="srew   filter) {
  5" name="L49">  49        ptrptr(skb, skbtmp   sk_filter);
  6" name="L56">  56        if (ptr = filter) {
  9a>      " name="L49">  49  #" name="L30">  31ss="sref">filterptr<  if (sk_filter);
 12   tinue class="sref">ptr;
 10" name=" name="L108"> 108}
  9a>      107"> 10 class="sref">ptr;
 10 as"">head &BPFOS_LD_H_ABShref="+code=pskBPFOS_LD_H_ABSine":="sref">filter) {
  5" name="L49">  49    if (errptr;
ptrfilter) {
  9a>      L49">  49        ptrptr(skb, skbtmp   sk_filter);
  5" name="L56">  56        if (ptr = filter) {
  6" name="a>      L49">  49  #" name="L30">  31ss="sref">filterptr<  if (sk_filter);
  9a>      " name="   tinue class="sref">ptr;
 108}
 10" name="107"> 10 class="sref">ptr;
  6 as"">head &BPFOS_LD_B_ABShref="+code=pskBPFOS_LD_B_ABSine":="sref">filter) {
 10a>      L49">  49    if (errptr;
ptr(filter) {
  6" name="L49">  49        ptrptr(skb, skbtmp   sk_filter);
  9a>      L56">  56        if (ptr = filter) {
  5L65">  6" name="L49">  49  #" name="L30">  31ss*">  56      u8/a>#" name="L30u8line"*)>  56        if (sk_filter);
  6" name="L62">  6   tinue class="sref">ptr;
  9a>       name="L108"> 108}
 10 class="sref">ptr;
 10 as"">head &BPFOS_LD_W_LENhref="+code=pskBPFOS_LD_W_LENine":="sref">filter) {
  5a>      L49">  49  #" name="L30">  31ss="sref">filter(skptr;
 10L62">  6   tinue class="sref">ptr;
  5 as"">head &BPFOS_LDX_W_LENhref="+code=pskBPFOS_LDX_W_LENine":="sref">filter) {
  6" name=">head &X   filter(skptr;
  9L62">  6   tinue class="sref">ptr;
  5 as"">head &BPFOS_LD_W_INDhref="+code=pskBPFOS_LD_W_INDine":="sref">filter) {
  6" name="L49">  49    if (errerrptr;
  999999999gotolass="sref">ptrptr;
head &BPFOS_LD_H_INDhref="+code=pskBPFOS_LD_H_INDine":="sref">filter) {
 10" name="L49">  49    if (errerrptr;
  699999999gotolass="sref">ptrptr;
 10 as"">head &BPFOS_LD_B_INDhref="+code=pskBPFOS_LD_B_INDine":="sref">filter) {
 124   L49">  49    if (errerrptr;
  6" name="gotolass="sref">ptr(ptr;
  9 as"">head &BPFOS_LDX_B_MSHhref="+code=pskBPFOS_LDX_B_MSHine":="sref">filter) {
  54   L49">  49        ptrptr(skbK   skbtmp   sk_filter);
  6" name="L56">  56        if (ptr = filter) {
  9a>      4   L49">  49  X     56      u8/a>#" name="L30u8line"*)>  56        if (sk_filter);
  9   tinue class="sref">ptr;
 10" name=" name="L108"> 108}
  5a>      107"> 10 class="sref">ptr;
 10 as"">head &BPFOS_LD_IM -filter) {
  5" name="L49">  49  #" name="L30">  31class="sref">errptr;
  6" name="   tinue class="sref">ptr;
  9 as"">head &BPFOS_LDX_IM -filter) {
  5" name="L49">  49  X   filterptr;
  6" name="   tinue class="sref">ptr;
  9 as"">head &BPFOS_LD_n -filter) {
  49  #" name="L30">  31ss="sref">filteru2K   ptr;
 10" name="   tinue class="sref">ptr;
  6 as"">head &BPFOS_LDX_n -filter) {
 1000000000L49">  49  X   filteru2K   ptr;
  5" name="   tinue class="sref">ptr;
  6 as"">head &BPFOS_MISC_TAX   filter) {
  9a>      L49">  49  X   filter<#" name="L30">  3 class="sref">ptr;
  5" name="   tinue class="sref">ptr;
  6 as"">head &BPFOS_MISC_TX#" name="L30BPFOS_MISC_TXfilter) {
  9a>      L49">  49  #" name="L30">  31="sref">size X   ptr;
ptr;
 10 as"">head &BPFOS_RET_K   filter) {
  9a>      107"> 107        rK   ptr;
 10 as"">head &BPFOS_RET_#" name="L30BPFOS_RET_filter) {
 12a>      107"> 107        r#" name="L30">  3 class="sref">ptr;
  6 as"">head &BPFOS_ST/a>#" name="L30BPFOS_STine":="sref">filter) {
  900000000="sref">filteru2K   filter<#" name="L30">  3 class="sref">ptr;
  5L65">  6   tinue class="sref">ptr;
  6 as"">head &BPFOS_STX   filter) {
  9a>      ="sref">filteru2K   filterptr;
  6   tinue class="sref">ptr;
 10cas"">head &BPFOS_ANC_PROTOCef="+code=EXPORT_BPFOS_ANC_PROTOCefine":="sref">filter) {
  5a>      L49">  49  #" name="L30">  31="sref">size ntohs/a>#" name="L30ntohss="srass="sref">ptr(sksk_filter);
 10L65">  6   tinue class="sref">ptr;
  5cas"">head &BPFOS_ANC_PKTTYPE="+code=EXPORT_BPFOS_ANC_PKTTYPEine":="sref">filter) {
  6" name="L49">  49  #" name="L30">  31ss="sref">filter(skptr;
  9L65">  6   tinue class="sref">ptr;
  5cas"">head &BPFOS_ANC_IFINDEX   filter) {
  6" name="L56"!="sref">filter(sk(filter) {
  99999999999999999107"> 10 class="sref">ptr;
  49  #" name="L30">  31ss="sref">filter(sk(sk(ptr;
 10" name="   tinue class="sref">ptr;
  6 as"">head &BPFOS_ANC_MARK   filter) {
 1000000000L49">  49  #" name="L30">  31ss="sref">filter(skptr;
  5" name="   tinue class="sref">ptr;
  6 as"">head &BPFOS_ANC_QUEUE="+code=EXPORT_BPFOS_ANC_QUEUEine":="sref">filter) {
  9a>      L49">  49  #" name="L30">  31ss="sref">filter(sk(ptr;
  5" name="   tinue class="sref">ptr;
  6 as"">head &BPFOS_ANC_HATYPE="+code=EXPORT_BPFOS_ANC_HATYPEine":="sref">filter) {
  9a>      L56"!="sref">filter(sk(filter) {
 10 class="sref">ptr;
 10a>      L49">  49  #" name="L30">  31ss="sref">filter(sk(skptr;
  9a>         tinue class="sref">ptr;
 10 as"">head &BPFOS_ANC_RXHASHhref="+code=pskBPFOS_ANC_RXHASHine":="sref">filter) {
 12a>      L49">  49  #" name="L30">  31ss="sref">filter(sk  3 class="sref">ptr;
  6" name="   tinue class="sref">ptr;
  9 as"">head &BPFOS_ANC_CPUhref="+code=pskBPFOS_ANC_CPUine":="sref">filter) {
  5" name="L49">  49  #" name="L30">  31ss="sref">filtersk_filter);
  6" name="   tinue class="sref">ptr;
  9 as"">head &BPFOS_ANC_ALU_XOR_X   filter) {
  49  #" name="L30">  31^ss="sref">filterptr;
 10" name="   tinue class="sref">ptr;
  9 as"">head &BPFOS_ANC_NLATTR   filter) {
 1000000000struct"sref">size nlat if (size nlaf (ptr;
ptr;
  6" name="L56">  56      de=_is_nonL35"aif (ptr(filter) {
  9a>              107"> 10 class="sref">ptr;
  5" name="L56">  56      #" name="L30">  31"gfxclass="sref">skbr(sksize nlat if (filter) {
  6" name="a>      107"> 10 class="sref">ptr;
ptr;
size nlaf (size nla_findf (size nlat if (skbr(sku2#" name="L30">  3],class="sref">ptr;
 10" name=">              sref">size r(sku2#" name="L30">  3 class="sref">skbX   ptr;
  6" name="L56">  56      nlaf (filter) {
 10a>              sref">size #" name="L30">  31ss(void"*)>  56      nlaf (  56      r(skptr;
 12a>      elseclass="sref">ptr;
  6" name="        sref">size #" name="L30">  31ss0 class="sref">ptr;
  9a>         tinue class="sref">ptr;
  5 name="L108"> 108}
  6 as"">head &BPFOS_ANC_NLATTR_NEST/a>#" name="L30BPFOS_ANC_NLATTR_NESTine":ss="sref">filter) {
  9a>      struct"sref">size nlat if (size nlaf (ptr;
ptr;
 1000000000L56">  56      de=_is_nonL35"aif (ptr(filter) {
  5a>              107"> 10 class="sref">ptr;
 10L62">  6L56">  56      #" name="L30">  31"gfxclass="sref">skbr(sksize nlat if (filter) {
  5a>              107"> 10 class="sref">ptr;
ptr;
  9L62">  6sref">size nlaf (size nlat if (skbr(sku2#" name="L30">  3] class="sref">ptr;
  5L62">  6L56">  56      nlaf (skskb#" name="L30">  31- c#L32" sref">u2r(skfilter) {
  6" name="        107"> 10 class="sref">ptr;
ptr;
  6sref">size nlaf (size nla_find_nestedf (ptrskbX   ptr;
 10" name="L56">  56      nlaf (filter) {
  699999999L62">  6sref">size #" name="L30">  31ss(void"*)>  56      nlaf (  56      r(skptr;
 1000000000elseclass="sref">ptr;
 124   L62">  6sref">size #" name="L30">  31ss0 class="sref">ptr;
  6" name="   tinue class="sref">ptr;
  9 name="L108"> 108}
size CONFIG_SECCOMP_FILTER   ptr;
  6 as"">head &BPFOS_ANC_SECCOMP_LD_W/a>#" name="L30BPFOS_ANC_SECCOMP_LD_Wine":="sref">filter) {
  9a>      L49">  49  #" name="L30">  31ss="sref">filter(ptr *skptr;
ptr;
ptr;
  5default:="sref">filter) {
 10a>      L49">  49  WARN_RATELIMIT/a>#" name="L30WARN_RATELIMITs="sr1 clspana>#" nametringa>"Unknowna>a> :%u jt:%u tf:%u k:%u\n",class="sref">ptr;
  5" name="03"> 10a>      L49">  49  R/a> *skskbR/a> *skptr;
  6" name="03"> 10a>      L49">  49  R/a> *skskbR/a> *skptr;
  999999999107"> 10 class="sref">ptr;
  5 name="L108"> 108}
 108}
ptr;
 10 class="sref">ptr;
 108}
skptr}
(ptr;
ptr;
#" namcomment">/*class="sref">ptr;
#" namcomment"> * Security :class="sref">ptr;
#" namcomment"> * A BPF program is able to us""16 cells of memory to strclass="sref">ptr;
#" namcomment"> * values (check u32 mem[BPFOMEMWORDS]  c de_run_>}
class="sref">ptr;
#" namcomment"> * As we d  t wa t to clear mem[] array for each packet going throughclass="sref">ptr;
#" namcomment"> * de_run_>}
}
class="sref">ptr;
#" namcomment"> * a cell"L56not previously written, and we check all"branches to be sureclass="sref">ptr;
#" namcomment"> * a malicious us"r doesn't try to abus""us.class="sref">ptr;
 */class="sref">ptr;
skbcheck_oint_and_str#" name="L30check_oint_and_strsize sock_>}
(size >}
(skbf, filter) {
filter) {
skbufilter.c#L1f="+cou1"line"*sref">size masks/a>#" name="L30masksine" class="sref">skbmemvalidf="+code=load_pmemvalid>  31ss0  lspana>#" namcomment">/* one bit p"r cell,"16 cells */class="sref">ptr;
skbpcf="+code=load_ppcine" class="sref">skb107f="+code=load_p107>  31ss0 class="sref">ptr;
ptr;
ptr#" name="L30BPFOMEMWORDS>  31"gfxc16= class="sref">ptr;
size masks/a>#" name="L30masksine"1ss="sref">filterptrsize masks/a>#" name="L30masksine") class="sref">skbGFP_KERNEf="+code=EXPORT_GFP_KERNEfode== class="sref">ptr;
filter#" name="L30masksine")class="sref">ptr;
 10107"> 1-ss="sref">skptr;
skbmems07f="+code=load_pmems07s="srass="sref">ptr#" name="L30masksine" c0xff class="sref">skbR, size masks/a>#" name="L30masksine")= class="sref">ptr;
ptr;
  56       cf="+code=load_ppcine"1ss0  l  56       cf="+code=load_ppcine"1lass lass="sref">skbR,        cf="+code=load_ppcine"++ass="sref">filter) {
  6lass="sref">skbmemvalidf="+code=load_pmemvalid>  31"srefss="sref">filter#" name="L30masksine"[c#L32" sref">u2 cf="+code=load_ppcine"] class="sref">ptr;
ptr;
  5switch rass="sref">ptr(u2 cf="+code=load_ppcine"].ss="sref">skfilter) {
  6 as"">head &BPFOS_ST/a>#" name="L30BPFOS_STine":="sref">filter) {
  9 as"">head &BPFOS_STX   filter) {
  49  memvalidf="+code=load_pmemvalid>  31|= (11"lt;lass ass="sref">ptr(u2 cf="+code=load_ppcine"].ss="sref">skptr;
 10" name="brenk class="sref">ptr;
  6 as"">head &BPFOS_LD_n -filter) {
 10 as"">head &BPFOS_LDX_n -filter) {
  5" name="L56"!rass="sref">ptr  31"sref (11"lt;lass ass="sref">ptr(u2 cf="+code=load_ppcine"].ss="sref">skfilter) {
  6a>      " name="L49">  49  107f="+code=load_p107>  31ss-ss="sref">skptr;
  9a>              gotolass="sref">ptr(ptr;
  5" name=" name="L108"> 108}
  666666666brenk class="sref">ptr;
  9 as"">head &BPFOS_JMP_J#" name="L30BPFOS_JMP_Jfilter) {
/* a jump must s07 masks on targ07 */class="sref">ptr;
 10a>      L49">  49  masks/a>#" name="L30masksine"[c#L32" sref">u2 cf="+code=load_ppcine" + 11+lass="sref">err(u2 cf="+code=load_ppcine"].ss="sref">skfilter  3 class="sref">ptr;
  9a>      lass="sref">skbmemvalidf="+code=load_pmemvalid>  31ss~0 class="sref">ptr;
 1066666666brenk class="sref">ptr;
 12 as"">head &BPFOS_JMP_JEQ_K   filter) {
  6 as"">head &BPFOS_JMP_JEQ_X   filter) {
  9 as"">head &BPFOS_JMP_JGE_K   filter) {
  5 as"">head &BPFOS_JMP_JGE_X   filter) {
  6 as"">head &BPFOS_JMP_JGT_K   filter) {
  9 as"">head &BPFOS_JMP_JGT_X   filter) {
head &BPFOS_JMP_JSET_X   filter) {
 10 as"">head &BPFOS_JMP_JSET_K   filter) {
  999999999lspana>#" namcomment">/* a jump must s07 masks on targ07s */class="sref">ptr;
 1000000000L49">  49  masks/a>#" name="L30masksine"[c#L32" sref">u2 cf="+code=load_ppcine" + 11+lass="sref">err(u2 cf="+code=load_ppcine"].ss="sref">skfilter  3 class="sref">ptr;
 12a>      L49">  49  masks/a>#" name="L30masksine"[c#L32" sref">u2 cf="+code=load_ppcine" + 11+lass="sref">err(u2 cf="+code=load_ppcine"].ss="sref">skfilter  3 class="sref">ptr;
  6" name="lass="sref">skbmemvalidf="+code=load_pmemvalid>  31ss~0 class="sref">ptr;
  9a>      brenk class="sref">ptr;
  5 name="L108"> 108}
 108}
ptr(filter) {
skptr#" name="L30masksine"= class="sref">ptr;
 107        r107f="+code=load_p107>  3 class="sref">ptr;
 108}
ptr;
#" namcomment">/**class="sref">ptr;
#" namcomment"> *      sk_chk_>}
}
 span>class="sref">ptr;
#" namcomment"> *      @>;
}
 span>class="sref">ptr;
#" namcomment"> *      @>len: length of >}
class="sref">ptr;
#" namcomment"> *inspan>class="sref">ptr;
#" namcomment"> * Check the us"r's >}
 span>class="sref">ptr;
#" namcomment"> * >}
}
 span>class="sref">ptr;
#" namcomment"> * no references or jumps that are out of range, no illegal> span>class="sref">ptr;
#" namcomment"> * instructions, and must end with a RET instruction.class="sref">ptr;
#" namcomment"> *inspan>class="sref">ptr;
#" namcomment"> * All jumps are forward as they are not signed.class="sref">ptr;
#" namcomment"> *class="sref">ptr;
#" namcomment"> * R07"> s 0"L56the rule s07 is legal or -EINVAf"L56not.class="sref">ptr;
#" namcomment"> */class="sref">ptr;
skbsk_chk_>}
size sock_>}
(size >}
(skbf, filter) {
filter) {
/*class="sref">ptr;
#" namcomment">         * Valid instructions are initialized to non-0.class="sref">ptr;
#" namcomment">         * Invalid instructions are initialized to 0.class="sref">ptr;
#" namcomment">         */class="sref">ptr;
skbu8/a>#" name="L30u8line"ss="sref">sk#" name="L30ckfilter) {
  6[c#L32" sref">u2BPFOALU   u2BPFOADD   u2BPFOK   filterfilter) {
  9[c#L32" sref">u2BPFOALU   u2BPFOADD   u2BPFOX   filterfilter) {
  5[c#L32" sref">u2BPFOALU   u2BPFOSUB   u2BPFOK   filterfilter) {
  6[c#L32" sref">u2BPFOALU   u2BPFOSUB   u2BPFOX   filterfilter) {
  9[c#L32" sref">u2BPFOALU   u2BPFOMUf="+code=EXPORT_BPFOMUfline|c#L32" sref">u2BPFOK   filterfilter) {
u2BPFOALU   u2BPFOMUf="+code=EXPORT_BPFOMUfline|c#L32" sref">u2BPFOX   filterfilter) {
 10[c#L32" sref">u2BPFOALU   u2BPFODIV   u2BPFOX   filterfilter) {
  5[c#L32" sref">u2BPFOALU   u2BPFOAND   u2BPFOK   filterfilter) {
 10[c#L32" sref">u2BPFOALU   u2BPFOAND   u2BPFOX   filterfilter) {
  5[c#L32" sref">u2BPFOALU   u2BPFOOR   u2BPFOK   filterfilter) {
  6[c#L32" sref">u2BPFOALU   u2BPFOOR   u2BPFOX   filterfilter) {
  9[c#L32" sref">u2BPFOALU   u2BPFOLSHhref="+code=pskBPFOLSHine"|c#L32" sref">u2BPFOK   filterfilter) {
  5[c#L32" sref">u2BPFOALU   u2BPFOLSHhref="+code=pskBPFOLSHine"|c#L32" sref">u2BPFOX   filterfilter) {
  6[c#L32" sref">u2BPFOALU   u2BPFORSHhref="+code=pskBPFORSHine"|c#L32" sref">u2BPFOK   filterfilter) {
  9[c#L32" sref">u2BPFOALU   u2BPFORSHhref="+code=pskBPFORSHine"|c#L32" sref">u2BPFOX   filterfilter) {
u2BPFOALU   u2BPFONEG   filterfilter) {
 10[c#L32" sref">u2BPFOLD   u2BPFOW/a>#" name="L30BPFOWline|c#L32" sref">u2BPFOABS/a>#" name="L30BPFOABSine"]111ss="sref">filter#" name="L30BPFOS_LD_WOABSine",="sref">filter) {
  5[c#L32" sref">u2BPFOLD   u2BPFOHhref="+code=pskBPFOHine"|c#L32" sref">u2BPFOABS/a>#" name="L30BPFOABSine"]111ss="sref">filter#" name="L30BPFOS_LD_HOABSine",="sref">filter) {
 10[c#L32" sref">u2BPFOLD   u2BPFOB   u2BPFOABS/a>#" name="L30BPFOABSine"]111ss="sref">filter#" name="L30BPFOS_LD_BOABSine",="sref">filter) {
  5[c#L32" sref">u2BPFOLD   u2BPFOW/a>#" name="L30BPFOWline|c#L32" sref">u2BPFOLENhref="+code=pskBPFOLENine"]111ss="sref">filterfilter) {
  6[c#L32" sref">u2BPFOLD   u2BPFOW/a>#" name="L30BPFOWline|c#L32" sref">u2BPFOIND   filterfilter) {
  9[c#L32" sref">u2BPFOLD   u2BPFOHhref="+code=pskBPFOHine"|c#L32" sref">u2BPFOIND   filterfilter) {
  5[c#L32" sref">u2BPFOLD   u2BPFOB   u2BPFOIND   filterfilter) {
  6[c#L32" sref">u2BPFOLD   u2BPFOIM-filterfilter) {
  9[c#L32" sref">u2BPFOLDX   u2BPFOW/a>#" name="L30BPFOWline|c#L32" sref">u2BPFOLENhref="+code=pskBPFOLENine"]11ss="sref">filterfilter) {
u2BPFOLDX   u2BPFOB   u2BPFOMSHhref="+code=pskBPFOMSHine"]11ss="sref">filterfilter) {
 10[c#L32" sref">u2BPFOLDX   u2BPFOIM-filterfilter) {
  5[c#L32" sref">u2BPFOMISChref="+code=pskBPFOMISCline|c#L32" sref">u2BPFOTAX   filterfilter) {
 10[c#L32" sref">u2BPFOMISChref="+code=pskBPFOMISCline|c#L32" sref">u2BPFOTX#" name="L30BPFOTXfilter#" name="L30BPFOS_MISCOTXfilter) {
  5[c#L32" sref">u2BPFORET/a>#" name="L30BPFORETline|c#L32" sref">u2BPFOK   filterfilter) {
  6[c#L32" sref">u2BPFORET/a>#" name="L30BPFORETline|c#L32" sref">u2BPFO#" name="L30BPFOAine"]1111111111ss="sref">filter#" name="L30BPFOS_RET_filter) {
  9[c#L32" sref">u2BPFOALU   u2BPFODIV   u2BPFOK   filterfilter) {
  5[c#L32" sref">u2BPFOLD   u2BPFOn -filterfilter) {
  6[c#L32" sref">u2BPFOLDX   u2BPFOn -filterfilter) {
  9[c#L32" sref">u2BPFOST/a>#" name="L30BPFOSTine"]11111111111111111ss="sref">filter#" name="L30BPFOS_STine",="sref">filter) {
u2BPFOSTX   filterfilter) {
 10[c#L32" sref">u2BPFOJMP   u2BPFOJ#" name="L30BPFOJAine"]111111111ss="sref">filter#" name="L30BPFOS_JMP_Jfilter) {
  5[c#L32" sref">u2BPFOJMP   u2BPFOJEQ   u2BPFOK   filterfilter) {
 10[c#L32" sref">u2BPFOJMP   u2BPFOJEQ   u2BPFOX   filterfilter) {
  5[c#L32" sref">u2BPFOJMP   u2BPFOJGE   u2BPFOK   filterfilter) {
  6[c#L32" sref">u2BPFOJMP   u2BPFOJGE   u2BPFOX   filterfilter) {
  9[c#L32" sref">u2BPFOJMP   u2BPFOJGT/a>#" name="L30BPFOJGTline|c#L32" sref">u2BPFOK   filterfilter) {
  5[c#L32" sref">u2BPFOJMP   u2BPFOJGT/a>#" name="L30BPFOJGTline|c#L32" sref">u2BPFOX   filterfilter) {
  6[c#L32" sref">u2BPFOJMP   u2BPFOJSET/a>#" name="L30BPFOJSETline|c#L32" sref">u2BPFOK   filterfilter) {
  9[c#L32" sref">u2BPFOJMP   u2BPFOJSET/a>#" name="L30BPFOJSETline|c#L32" sref">u2BPFOX   filterfilter) {
ptr;
skbpcf="+code=load_ppcine" class="sref">ptr;
ptr;
  56      R, skbR, skbBPFOnAXINSNS/a>#" name="L30BPFOMAXINSNS cla=="sref">filter) {
  5107"> 1-ss="sref">skptr;
ptr;
/* check the >}
class="sref">ptr;
  56       cf="+code=load_ppcine"1ss0  l  56       cf="+code=load_ppcine"1lass lass="sref">skbR,        cf="+code=load_ppcine"++ass="sref">filter) {
  6struct"sref">size sock_>}
(size >tes7f="+code=load_p>tes7ine"1ss"sreflass="sref">skbR}
(u2 cf="+code=load_ppcine"] class="sref">ptr;
  9c#L32" sref">u2ufilter.c#L1f="+cou1"line"c#L32" sref">u2f">ulter.c#L1f="+cof">uine"1sssref">size >tes7f="+code=load_p>tes7ine"" class="sref">skptr;
ptr;
 10L56">  56      f">ulter.c#L1f="+cof">uine"1 classsref">size ARRAY_SIZE     56      f">us/a>#" name="L30ckfilter) {
  9a>      107"> 1-ss="sref">skptr;
 10c#L32" sref">u2f">ulter.c#L1f="+cof">uine"1sssref">size f">us/a>#" name="L30cku2f">ulter.c#L1f="+cof">uine"] class="sref">ptr;
 12L56"!="sref">filterulter.c#L1f="+cof">uine"=="sref">filter) {
  6a>      107"> 1-ss="sref">skptr;
  9lspana>#" namcomment">/* Some instructions need special checks */class="sref">ptr;
  5switch rass="sref">ptrulter.c#L1f="+cof">uine"=ss="sref">filter) {
  6 as"">head &BPFOS_ALUODIV_K   filter) {
  9L96">  9lspana>#" namcomment">/* check for division by zero */class="sref">ptr;
 12L56"sref">size >tes7f="+code=load_p>tes7ine"" class="sref">skfilter) {
 10L65">  6a>      107"> 1-ss="sref">skptr;
  999999999lref">size >tes7f="+code=load_p>tes7ine"" class="sref">sk  56      >tes7f="+code=load_p>tes7ine"" class="sref">skptr;
 1000000000brenk class="sref">ptr;
 12 as"">head &BPFOS_LD_n -filter) {
  6 as"">head &BPFOS_LDX_n -filter) {
  9 as"">head &BPFOS_ST/a>#" name="L30BPFOS_STine":="sref">filter) {
  5 as"">head &BPFOS_STX   filter) {
  699999999lspana>#" namcomment">/* check for invalid memory addresses */class="sref">ptr;
  9L96">  9L56"sref">size >tes7f="+code=load_p>tes7ine"" class="sref">sksize BPFOn -WORDS/a>#" name="L30BPFOMEMWORDS>  3=="sref">filter) {
 1222222222107"> 1-ss="sref">skptr;
 10" name="brenk class="sref">ptr;
  6 as"">head &BPFOS_JMP_J#" name="L30BPFOS_JMP_Jfilter) {
 1000000000Lspana>#" namcomment">/*class="sref">ptr;
#" namcomment">"a>      124"> 1222222222* Note, the larg0 >tes7" clak might6 aus""loops.class="sref">ptr;
#" namcomment"> a>      124"> 1222222222* Compare this with conditional jumps below,class="sref">ptr;
#" namcomment"> a>      124"> 1222222222* where offs07s are limited. --ANK (981016)class="sref">ptr;
#" namcomment"> a>      124"> 1222222222*/class="sref">ptr;
  699999999L56"sref">size >tes7f="+code=load_p>tes7ine"" class="sref">sk  56      R, skfilter) {
  9L96">  999999999107"> 1-ss="sref">skptr;
 12brenk class="sref">ptr;
 10 as"">head &BPFOS_JMP_JEQ_K   filter) {
  6 as"">head &BPFOS_JMP_JEQ_X   filter) {
 10 as"">head &BPFOS_JMP_JGE_K   filter) {
 12 as"">head &BPFOS_JMP_JGE_X   filter) {
  6 as"">head &BPFOS_JMP_JGT_K   filter) {
  9 as"">head &BPFOS_JMP_JGT_X   filter) {
  5 as"">head &BPFOS_JMP_JSET_X   filter) {
  6 as"">head &BPFOS_JMP_JSET_K   filter) {
  9L96">  9lspana>#" namcomment">/* for conditionals both must be safe2*/class="sref">ptr;
 12L56"sref">size  cf="+code=load_ppcine" + sref">size >tes7f="+code=load_p>tes7ine"" class="sref">sksize R, ptr;
 10L65">  6a>  sref">size  cf="+code=load_ppcine" + sref">size >tes7f="+code=load_p>tes7ine"" class="sref">sksize R, filter) {
  99999999999999999107"> 1-ss="sref">skptr;
 1000000000brenk class="sref">ptr;
 12 as"">head &BPFOS_LD_WOABS/a>#" name="L30BPFOS_LD_WOABSine":="sref">filter) {
  6 as"">head &BPFOS_LD_HOABS/a>#" name="L30BPFOS_LD_HOABSine":="sref">filter) {
  9 as"">head &BPFOS_LD_BOABS/a>#" name="L30BPFOS_LD_BOABSine":="sref">filter) {
size ANCILLARY     56      CODE   head &SKFOAD_OFF   size SKFOAD_     9\="sref">filter) {
  66666666666666666c#L32" sref">u2f">ulter.c#L1f="+cof">uine"1sssref">size BPFOS_ANC_     9\="sref">filter) {
  9103"> 1000000000brenk="sref">filter) {
ptr<>tes7f="+code=load_p>tes7ine"" class="sref">skfilter) {
 1066666666c#L32" sref">u2ANCILLARY     56      PROTOCOf="+code=EXPORT_PROTOCOfode== class="sref">ptr;
  566666666c#L32" sref">u2ANCILLARY     56      PKTTYPE   ptr;
 1066666666c#L32" sref">u2ANCILLARY     56      IFINDEX   ptr;
  566666666c#L32" sref">u2ANCILLARY     56      NLATTR   ptr;
  666666666c#L32" sref">u2ANCILLARY     56      NLATTR_NEST/a>#" name="L30NLATTR_NESTode== class="sref">ptr;
  966666666c#L32" sref">u2ANCILLARY     56      MARK   ptr;
  566666666c#L32" sref">u2ANCILLARY     56      QUEUE   ptr;
  666666666c#L32" sref">u2ANCILLARY     56      HATYPE   ptr;
  966666666c#L32" sref">u2ANCILLARY     56      RXHASHhref="+code=pskRXHASHode== class="sref">ptr;
u2ANCILLARY     56      CPU   ptr;
 1066666666c#L32" sref">u2ANCILLARY     56      ALUOXOR_X   ptr;
  555555555 name="L108"> 108}
 10 name="L108"> 108}
  5ass="sref">ptr<>tes7f="+code=load_p>tes7ine"" class="sref">skulter.c#L1f="+cof">uine"1sssref">size f">ulter.c#L1f="+cof">uine" class="sref">ptr;
 108}
 108}
/* #" t instruction must be a RET skclass="sref">ptr;
ptr<>}
(u2R, skulter.c#L1f="+cof">uine"=ss="sref">filter) {
head &BPFOS_RET_K   filter) {
head &BPFOS_RET_#" name="L30BPFOS_RET_filter) {
 10107"> 107        rcheck_load_and_st/a>s/a>#" name="L30check_load_and_st/a>sine"">  56      >}
(size R, ptr;
 108}
 1-ss="sref">skptr;
 108}
sk  56      sk_chk_>}
ptr;
 108}
#" namcomment">/**class="sref">ptr;
#" namcomment"> *name="sk_>}
}
class="sref">ptr;
#" namcomment"> *      @rcu: rcu_head that    tains the"sk_>}
class="sref">ptr;
#" namcomment"> */class="sref">ptr;
skbsk_>}
size rcu_headf="+code=load_prcu_headsize rcuf="+code=load_prcuine"=="sref">filter) {
filter) {
size sk_>}
size >pa href="+code=pfpine"1sssref">size f" taina _o  56      rcuf="+code=load_prcuine",Lstruct"sref">size sk_>}
size rcuf="+code=load_prcuine"= class="sref">ptr;
ptr;
size bpf_jit_fre/f="+code=load_pbpf_jit_fre/ine"">  56      >pa href="+code=pfpine"= class="sref">ptr;
sk  56      >pa href="+code=pfpine"= class="sref">ptr;
 108}
sk  56      sk_>}
ptr;
ptr;
skb__sk_prepare_>}
size sk_>}
size >pa href="+code=pfpine"=="sref">filter) {
filter) {
skber f="+code=load_per uter class="sref">ptr;
ptr;
size >pa href="+code=pfpine"" class="sref">sksize sk_run_>}
ptr;
ptr;
sksize sk_chk_>}
size >pa href="+code=pfpine"" class="sref">sk#" name="L30insnsine",ssref">size Rpa href="+code=pfpine"" class="sref">skptr;
size er f="+code=load_per uter=="sref">filter) {
  6107"> 107        rer f="+code=load_per uter class="sref">ptr;
ptr;
sk  56      >pa href="+code=pfpine"= class="sref">ptr;
 10 class="sref">ptr;
 108}
ptr;
#" namcomment">/**class="sref">ptr;
#" namcomment"> *name="sk_unattached_>}
}
class="sref">ptr;
#" namcomment"> *      @fprog: the >}
class="sref">ptr;
#" namcomment"> *      @pfp: the unattached >}
class="sref">ptr;
#" namcomment"> *class="sref">ptr;
#" namcomment"> * Create a >}
}rst run dom/s=span>class="sref">ptr;
#" namcomment"> * sanity checks on it to make sure it does not explkclass="sref">ptr;
#" namcomment"> * If an er or occurs o  there is insufficieclcmemory fo  the >}
class="sref">ptr;
#" namcomment"> * a negative er no sk ed. On duccess the"107"> 1is zerohs=span>class="sref">ptr;
#" namcomment"> */class="sref">ptr;
skbsk_unattached_>}
size sk_>}
size p>pa href="+code=ppfpine",="sref">filter) {
  66666666666666666struct"sref">size sock_>progf="+code=load_psock_>progine" *sref">size >progf="+code=load_p>progine"=="sref">filter) {
filter) {
size sk_>}
size >pa href="+code=pfpine" class="sref">ptr;
size Rsizef="+code=load_pRsizeuter1sssizeof"struct"sref">size sock_>}
(size >progf="+code=load_p>progine"" class="sref">skptr;
skber f="+code=load_per uter class="sref">ptr;
ptr;
/* Make sure new >}
class="sref">ptr;
size >progf="+code=load_p>progine"" class="sref">sk}
(skfilter) {
 10107"> 1-ss="sref">skptr;
ptr;
size >pa href="+code=pfpine"1sssref">size kmallocf="+code=load_pkmallocine"">  56      >sizef="+code=load_pRsizeuter1+ssizeof"*sref">size >pa href="+code=pfpine"=,ssref">size GFP_KERNEf="+code=EXPORT_GFP_KERNEfine"= class="sref">ptr;
filter<>pa href="+code=pfpine"=="sref">filter) {
  5107"> 1-ss="sref">skptr;
sksize >pa href="+code=pfpine"" class="sref">sk#" name="L30insnsine",ssref">size Rprogf="+code=load_p>progine"" class="sref">sk}
(size Rsizef="+code=load_pRsizeuter= class="sref">ptr;
ptr;
skskbRpa href="+code=pfpine"" class="sref">skptr;
size Rpa href="+code=pfpine"" class="sref">sksize >progf="+code=load_p>progine"" class="sref">skptr;
ptr;
sksize __sk_prepare_>}
  56      >pa href="+code=pfpine"= class="sref">ptr;
size er f="+code=load_per uter=="sref">filter) {
  6gotossref">size >ree_mema href="+code=pfree_mem cla class="sref">ptr;
 108}
size p>pa href="+code=ppfpine"1sssref">size >pa href="+code=pfpine" class="sref">ptr;
 10 class="sref">ptr;
size >ree_mema href="+code=pfree_mem cla:="sref">filter) {
sk  56      >pa href="+code=pfpine"= class="sref">ptr;
 1lass="sref">skber f="+code=load_per uter class="sref">ptr;
 108}
sk  56      sk_unattached_>}
ptr;
ptr;
skbsk_unattached_>}
size sk_>}
size >pa href="+code=pfpine"=="sref">filter) {
filter) {
sk}
  56      >pa href="+code=pfpine"= class="sref">ptr;
 108}
size EXPORT_SYMBOf_GPf="+code=EXPORT_EXPORT_SYMBOf_GPfine"">  56      sk_unattached_>}
ptr;
ptr;
#" namcomment">/**class="sref">ptr;
#" namcomment"> *      sk_attach_>}
}
class="sref">ptr;
#" namcomment"> *      @fprog: the >}
class="sref">ptr;
#" namcomment">"*      @sk: the docket tosus/s=span>class="sref">ptr;
ptr;
#" namcomment">"*      @sk: the+code=load_p>progine"=="sref">filter"*      @sk: the+code=load)w#" name="L30BPFOS_RET_f23ef">p71an>class="sref">ptr;1s="sref">ptr;
class="sref">ptre=load)w#" name="L30BPFOS_RET_}
u2ANCILLARY   class="sref">ptr;
class="srefe=load)w#" name="L30BPFOS_RET_u2ANCILLARY   }
c>ptr;
class="sree=load)w#" name="L30BPFOS_RET_u2ANCILLARY   }rst run dom/s=span>class">ptr;
#" namcomment"> */#L32" sre6">u2ANCILLARY   skbsk_>}#L32" sre6">u2ANCILLARY   }
progine"=="sref">filter) {
 rcuf="+code=load_prerfilter<
filtklas66"lines="sref">filter) {
 108}
size08"> 108<6a>}
size >pa href="+code=pfpine"1sssref">size f" taina _o  56 ,href="+code=sf" tol#L7ina _o  5ol#L7ilas66"line name="L108"> 108}
ptr<>te67f="+code=load_p>tes7ine6" cla6s="sref">sksize sock_>}
(size >progf="+code=load_p>progine"" class="sref">skptr;
s}
ptr;
/* #6 t instruction must be a6RET s6class="sref">ptr;
ptr;
sizeptr<>}
6a a>(u2R,a a>(skfilter) {
 10107"> 1-smp;BPFOS_6ET_K     56  /a>;
ptr;
#" name="L30BPFOS6RET_<69las67line"lspana>#" namcomment">/**     6  rcheck_load_and_st/a>s6a>#" 69 size >progf="+ze >pa href="+cref"zeuter1+ssizeof"*sref"cref"zeuter1ched_>}
filtklas6 href6=9et/core6e/filter.c#L49" id="L49"6 clas+Ef="+code=EXPORT_GFP_KERNEfine"= class="sref">ptr;
filt}
sk}
net/cor6e/filter.c#L47" id="L47"6 clas64"line" name="L57">  5107"> 1-s>skptr;
sk) {
size Rprogf="+code=load_p>progine"" class="sref">sk}
(size Rsizef="+code=load_pRsizeuter= class="sref">ptr;
head &6BOf="+cod6=EXPORT_EXPORT_SYMBOfine6">  569 cla class="sref">ptr/a> >pa href="+cref"z"L60" class="sref">skcref"z"L60" ched_>}
filtklas6 href6=9et/core6e/ina _o  56 ,href6=9et/core6e/filter.c#L49" id="L49"6 clas+Ef="+code=EXPORT_GFP_KERNEfine"= class="sref">p646line" name="L56"!="sref">filt  56  /a>;
sk/* #6ss="sref">ptr;
size EXPORT_SYMame="sk_>6
"linesref">size EXPORT_SYMap;BPFOS_6 rcu_head that    tains 6he"sk699skptr;
size R7cl7ss="sref">ptr;
pa href="+code=pfpine"= clref">size >progf="+code=load_p>progine"" class="sref">skptr;
ptr;
ptr;
pa href="+code=pfpine"= cload_p__sk_prepare_>}
  56      >pa href="+code=pfpine"= class="sref">ptr;
size sk_>7
sizehead &7href6"5et7core6f/filter.c#L95" id=7L95"670="sref">skulter.c#L1f="+cof">uf">ptrunch=netne"= class="sref">ptrunch=netched_>}
filtklas6 href6=9et/core6e/ina _o  56 65line" name="LL56"sref">sizeptr href6="net/cor6e/filter.c#L62" id="L62"6 clas66"line name="L108"> 108}
<7re/f="+co7e=load_pkfre/ine"">  56<7a>   7  >pa href="+c6"linesref">size EXPORT_SY7 href6"8e7/core6f/filter.c#L98" id7"L98"7class6"linesref">size EXPORT_SY7 8ref6"8e7/  570a> >pa href="+code=pfpine"" ol#L7ina _o  5ol#L7ilas6 56      >tes7fcu_dt/cft/cnce>ptotecte"sref">filter) {dt/cft/cnce>ptotecte"ched_>}
filtklas6ref6=net/core6e/filtrcuine"= class="sref">ptr;
size EXPORT_SY7 9ref6"8e7/rcu_head that    tains 7110"670="net/cor5e/filter.c#L70" id="L70"5 c="sref">ptr/a> >pa href="+cref"owned_by_eserer.c#L48" id="Lcref"owned_by_eserched_>}
filtklas6p646line" name="L56"!="sref">fil7b__sk_pre7are_>}
) {
pt>) {
}
filtklas6ref6=net/core6e/filtrcuine"= class="sref">ptr;
  56 65line" name="LL56"sref">sizeptr;
sk}
(  5ol#L7ilas64"line" name="L57">  5107"> 1-7href6"4et7core6filter.c#L114" id="7114"671size f">us/a>#" name="L30ckptrunch=netne"= class="sref">ptrunch=netched_>}
filtklas6 href6=9et/core6eol#L7ina _o  5ol#L7ilas645line" name="LL56"sref">sizesksize >ree_mema7href6"6et7core6filter.c#L116" id="7116"67lass616"linesref">size EXPORT_SY7 f="+code7load_per uter1sssref">si7e7sk_chk56      sk_unattached_>}
sizefilt71lass6"linesref">size EXPORT_SY7     7  rer f="+code=load_per 7ter c7ass="sed_>}
filter<
filtklas66"lines="sref">filter) {
<7href6"net7core6filter.c#L120" id="7120"67lass628"line" name=" as"">head &7f_jit_com7il/f="+code=load_pbpf_ji7_comp7l/ine"">  56}
 108}
<7ref">ptr<7a>;
size f" taina _optr;
 108}
<7rber f="+7/core6filter.c#L123" id=7L123"72las65line" name="Lss="sref">sk}
filter) {
      >tes7fcu_dt/cft/cnce>ptotecte"sref">filter) {dt/cft/cnce>ptotecte"ched_>}
filtklas6ref6=net/core6e/filtrcuine"= class="sref">ptr;
size EXPORT_SY7cl7ss="sref">ptr;
  56      NLAT"L70"5 c="sref">ptr/a> >pa href="+cref"owned_by_eserer.c#L48" id="Lcref"owned_by_eserched_>}
filtklas6p646line" name="L56"!="sref">fil7ame="sk_u7attached_>}
sk}
(filter) {
head &7     @fpr7g: the >}
cl72LLARYine"">  56  (filtklas6ref6=net/core6e/filtrcuine"= class="sref">ptr;
fil7ahref6"8e7 the unattached >}
ptr<.c#L1f="+cof">uf">ptrunch=netne"= class="sref">ptrunch=netched_>}
filtklas6 href6=9et/core6e/ine"=="sref">filter) {
fil7a/a>     7s="sref">ptr;
ptr;
size >ree_mema7Create a 7}
size EXPORT_SY7sanity ch7cks on it to make sure i7 does73/ine"">  56size >ree_mema7If an er 7r occurs o  there is ins7ffici7clcmem6"linesref">size EXPORT_SY7sber f="+7 er no sk ed.7On du7cess th6      sk_unattached_>}
fil7cl7ss="sref">ptr;



e/div>

pfooor6a>
The origic#L4LXR softwr5e/byilterline" namhttp://sourcefonet.e="Lptojects/lx6a>LXR r;
#L4vers//fibyiline" nammasreo:lx6@trlx6@tr
psubfooor6a>
lx6.trRedpill Lr