linux/net/atm/clip.c
<<
>>
Prefs
   1/* net/atm/clip.c - RFC1577 Classical IP over ATM */
   2
   3/* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
   4
   5#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__
   6
   7#include <linux/string.h>
   8#include <linux/errno.h>
   9#include <linux/kernel.h> /* for UINT_MAX */
  10#include <linux/module.h>
  11#include <linux/init.h>
  12#include <linux/netdevice.h>
  13#include <linux/skbuff.h>
  14#include <linux/wait.h>
  15#include <linux/timer.h>
  16#include <linux/if_arp.h> /* for some manifest constants */
  17#include <linux/notifier.h>
  18#include <linux/atm.h>
  19#include <linux/atmdev.h>
  20#include <linux/atmclip.h>
  21#include <linux/atmarp.h>
  22#include <linux/capability.h>
  23#include <linux/ip.h> /* for net/route.h */
  24#include <linux/in.h> /* for struct sockaddr_in */
  25#include <linux/if.h> /* for IFF_UP */
  26#include <linux/inetdevice.h>
  27#include <linux/bitops.h>
  28#include <linux/poison.h>
  29#include <linux/proc_fs.h>
  30#include <linux/seq_file.h>
  31#include <linux/rcupdate.h>
  32#include <linux/jhash.h>
  33#include <linux/slab.h>
  34#include <net/route.h> /* for struct rtable and routing */
  35#include <net/icmp.h> /* icmp_send */
  36#include <net/arp.h>
  37#include <linux/param.h> /* for HZ */
  38#include <linux/uaccess.h>
  39#include <asm/byteorder.h> /* for htons etc. */
  40#include <linux/atomic.h>
  41
  42#include "common.h"
  43#include "resources.h"
  44#include <net/atmclip.h>
  45
  46static struct net_device *clip_devs;
  47static struct atm_vcc *atmarpd;
  48static struct timer_list idle_timer;
  49static const struct neigh_ops clip_neigh_ops;
  50
  51static int to_atmarpd(enum atmarp_ctrl_type type, int itf, __be32 ip)
  52{
  53        struct sock *sk;
  54        struct atmarp_ctrl *ctrl;
  55        struct sk_buff *skb;
  56
  57        pr_debug("(%d)\n", type);
  58        if (!atmarpd)
  59                return -EUNATCH;
  60        skb = alloc_skb(sizeof(struct atmarp_ctrl), GFP_ATOMIC);
  61        if (!skb)
  62                return -ENOMEM;
  63        ctrl = (struct atmarp_ctrl *)skb_put(skb, sizeof(struct atmarp_ctrl));
  64        ctrl->type = type;
  65        ctrl->itf_num = itf;
  66        ctrl->ip = ip;
  67        atm_force_charge(atmarpd, skb->truesize);
  68
  69        sk = sk_atm(atmarpd);
  70        skb_queue_tail(&sk->sk_receive_queue, skb);
  71        sk->sk_data_ready(sk, skb->len);
  72        return 0;
  73}
  74
  75static void link_vcc(struct clip_vcc *clip_vcc, struct atmarp_entry *entry)
  76{
  77        pr_debug("%p to entry %p (neigh %p)\n", clip_vcc, entry, entry->neigh);
  78        clip_vcc->entry = entry;
  79        clip_vcc->xoff = 0;     /* @@@ may overrun buffer by one packet */
  80        clip_vcc->next = entry->vccs;
  81        entry->vccs = clip_vcc;
  82        entry->neigh->used = jiffies;
  83}
  84
  85static void unlink_clip_vcc(struct clip_vcc *clip_vcc)
  86{
  87        struct atmarp_entry *entry = clip_vcc->entry;
  88        struct clip_vcc **walk;
  89
  90        if (!entry) {
  91                pr_crit("!clip_vcc->entry (clip_vcc %p)\n", clip_vcc);
  92                return;
  93        }
  94        netif_tx_lock_bh(entry->neigh->dev);    /* block clip_start_xmit() */
  95        entry->neigh->used = jiffies;
  96        for (walk = &entry->vccs; *walk; walk = &(*walk)->next)
  97                if (*walk == clip_vcc) {
  98                        int error;
  99
 100                        *walk = clip_vcc->next; /* atomic */
 101                        clip_vcc->entry = NULL;
 102                        if (clip_vcc->xoff)
 103                                netif_wake_queue(entry->neigh->dev);
 104                        if (entry->vccs)
 105                                goto out;
 106                        entry->expires = jiffies - 1;
 107                        /* force resolution or expiration */
 108                        error = neigh_update(entry->neigh, NULL, NUD_NONE,
 109                                             NEIGH_UPDATE_F_ADMIN);
 110                        if (error)
 111                                pr_crit("neigh_update failed with %d\n", error);
 112                        goto out;
 113                }
 114        pr_crit("ATMARP: failed (entry %p, vcc 0x%p)\n", entry, clip_vcc);
 115out:
 116        netif_tx_unlock_bh(entry->neigh->dev);
 117}
 118
 119/* The neighbour entry n->lock is held. */
 120static int neigh_check_cb(struct neighbour *n)
 121{
 122        struct atmarp_entry *entry = neighbour_priv(n);
 123        struct clip_vcc *cv;
 124
 125        if (n->ops != &clip_neigh_ops)
 126                return 0;
 127        for (cv = entry->vccs; cv; cv = cv->next) {
 128                unsigned long exp = cv->last_use + cv->idle_timeout;
 129
 130                if (cv->idle_timeout && time_after(jiffies, exp)) {
 131                        pr_debug("releasing vcc %p->%p of entry %p\n",
 132                                 cv, cv->vcc, entry);
 133                        vcc_release_async(cv->vcc, -ETIMEDOUT);
 134                }
 135        }
 136
 137        if (entry->vccs || time_before(jiffies, entry->expires))
 138                return 0;
 139
 140        if (atomic_read(&n->refcnt) > 1) {
 141                struct sk_buff *skb;
 142
 143                pr_debug("destruction postponed with ref %d\n",
 144                         atomic_read(&n->refcnt));
 145
 146                while ((skb = skb_dequeue(&n->arp_queue)) != NULL)
 147                        dev_kfree_skb(skb);
 148
 149                return 0;
 150        }
 151
 152        pr_debug("expired neigh %p\n", n);
 153        return 1;
 154}
 155
 156static void idle_timer_check(unsigned long dummy)
 157{
 158        write_lock(&arp_tbl.lock);
 159        __neigh_for_each_release(&arp_tbl, neigh_check_cb);
 160        mod_timer(&idle_timer, jiffies + CLIP_CHECK_INTERVAL * HZ);
 161        write_unlock(&arp_tbl.lock);
 162}
 163
 164static int clip_arp_rcv(struct sk_buff *skb)
 165{
 166        struct atm_vcc *vcc;
 167
 168        pr_debug("\n");
 169        vcc = ATM_SKB(skb)->vcc;
 170        if (!vcc || !atm_charge(vcc, skb->truesize)) {
 171                dev_kfree_skb_any(skb);
 172                return 0;
 173        }
 174        pr_debug("pushing to %p\n", vcc);
 175        pr_debug("using %p\n", CLIP_VCC(vcc)->old_push);
 176        CLIP_VCC(vcc)->old_push(vcc, skb);
 177        return 0;
 178}
 179
 180static const unsigned char llc_oui[] = {
 181        0xaa,   /* DSAP: non-ISO */
 182        0xaa,   /* SSAP: non-ISO */
 183        0x03,   /* Ctrl: Unnumbered Information Command PDU */
 184        0x00,   /* OUI: EtherType */
 185        0x00,
 186        0x00
 187};
 188
 189static void clip_push(struct atm_vcc *vcc, struct sk_buff *skb)
 190{
 191        struct clip_vcc *clip_vcc = CLIP_VCC(vcc);
 192
 193        pr_debug("\n");
 194
 195        if (!clip_devs) {
 196                atm_return(vcc, skb->truesize);
 197                kfree_skb(skb);
 198                return;
 199        }
 200
 201        if (!skb) {
 202                pr_debug("removing VCC %p\n", clip_vcc);
 203                if (clip_vcc->entry)
 204                        unlink_clip_vcc(clip_vcc);
 205                clip_vcc->old_push(vcc, NULL);  /* pass on the bad news */
 206                kfree(clip_vcc);
 207                return;
 208        }
 209        atm_return(vcc, skb->truesize);
 210        skb->dev = clip_vcc->entry ? clip_vcc->entry->neigh->dev : clip_devs;
 211        /* clip_vcc->entry == NULL if we don't have an IP address yet */
 212        if (!skb->dev) {
 213                dev_kfree_skb_any(skb);
 214                return;
 215        }
 216        ATM_SKB(skb)->vcc = vcc;
 217        skb_reset_mac_header(skb);
 218        if (!clip_vcc->encap ||
 219            skb->len < RFC1483LLC_LEN ||
 220            memcmp(skb->data, llc_oui, sizeof(llc_oui)))
 221                skb->protocol = htons(ETH_P_IP);
 222        else {
 223                skb->protocol = ((__be16 *)skb->data)[3];
 224                skb_pull(skb, RFC1483LLC_LEN);
 225                if (skb->protocol == htons(ETH_P_ARP)) {
 226                        skb->dev->stats.rx_packets++;
 227                        skb->dev->stats.rx_bytes += skb->len;
 228                        clip_arp_rcv(skb);
 229                        return;
 230                }
 231        }
 232        clip_vcc->last_use = jiffies;
 233        skb->dev->stats.rx_packets++;
 234        skb->dev->stats.rx_bytes += skb->len;
 235        memset(ATM_SKB(skb), 0, sizeof(struct atm_skb_data));
 236        netif_rx(skb);
 237}
 238
 239/*
 240 * Note: these spinlocks _must_not_ block on non-SMP. The only goal is that
 241 * clip_pop is atomic with respect to the critical section in clip_start_xmit.
 242 */
 243
 244static void clip_pop(struct atm_vcc *vcc, struct sk_buff *skb)
 245{
 246        struct clip_vcc *clip_vcc = CLIP_VCC(vcc);
 247        struct net_device *dev = skb->dev;
 248        int old;
 249        unsigned long flags;
 250
 251        pr_debug("(vcc %p)\n", vcc);
 252        clip_vcc->old_pop(vcc, skb);
 253        /* skb->dev == NULL in outbound ARP packets */
 254        if (!dev)
 255                return;
 256        spin_lock_irqsave(&PRIV(dev)->xoff_lock, flags);
 257        if (atm_may_send(vcc, 0)) {
 258                old = xchg(&clip_vcc->xoff, 0);
 259                if (old)
 260                        netif_wake_queue(dev);
 261        }
 262        spin_unlock_irqrestore(&PRIV(dev)->xoff_lock, flags);
 263}
 264
 265static void clip_neigh_solicit(struct neighbour *neigh, struct sk_buff *skb)
 266{
 267        __be32 *ip = (__be32 *) neigh->primary_key;
 268
 269        pr_debug("(neigh %p, skb %p)\n", neigh, skb);
 270        to_atmarpd(act_need, PRIV(neigh->dev)->number, *ip);
 271}
 272
 273static void clip_neigh_error(struct neighbour *neigh, struct sk_buff *skb)
 274{
 275#ifndef CONFIG_ATM_CLIP_NO_ICMP
 276        icmp_send(skb, ICMP_DEST_UNREACH, ICMP_HOST_UNREACH, 0);
 277#endif
 278        kfree_skb(skb);
 279}
 280
 281static const struct neigh_ops clip_neigh_ops = {
 282        .family =               AF_INET,
 283        .solicit =              clip_neigh_solicit,
 284        .error_report =         clip_neigh_error,
 285        .output =               neigh_direct_output,
 286        .connected_output =     neigh_direct_output,
 287};
 288
 289static int clip_constructor(struct neighbour *neigh)
 290{
 291        struct atmarp_entry *entry = neighbour_priv(neigh);
 292
 293        if (neigh->tbl->family != AF_INET)
 294                return -EINVAL;
 295
 296        if (neigh->type != RTN_UNICAST)
 297                return -EINVAL;
 298
 299        neigh->nud_state = NUD_NONE;
 300        neigh->ops = &clip_neigh_ops;
 301        neigh->output = neigh->ops->output;
 302        entry->neigh = neigh;
 303        entry->vccs = NULL;
 304        entry->expires = jiffies - 1;
 305
 306        return 0;
 307}
 308
 309/* @@@ copy bh locking from arp.c -- need to bh-enable atm code before */
 310
 311/*
 312 * We play with the resolve flag: 0 and 1 have the usual meaning, but -1 means
 313 * to allocate the neighbour entry but not to ask atmarpd for resolution. Also,
 314 * don't increment the usage count. This is used to create entries in
 315 * clip_setentry.
 316 */
 317
 318static int clip_encap(struct atm_vcc *vcc, int mode)
 319{
 320        CLIP_VCC(vcc)->encap = mode;
 321        return 0;
 322}
 323
 324static netdev_tx_t clip_start_xmit(struct sk_buff *skb,
 325                                   struct net_device *dev)
 326{
 327        struct clip_priv *clip_priv = PRIV(dev);
 328        struct dst_entry *dst = skb_dst(skb);
 329        struct atmarp_entry *entry;
 330        struct neighbour *n;
 331        struct atm_vcc *vcc;
 332        struct rtable *rt;
 333        __be32 *daddr;
 334        int old;
 335        unsigned long flags;
 336
 337        pr_debug("(skb %p)\n", skb);
 338        if (!dst) {
 339                pr_err("skb_dst(skb) == NULL\n");
 340                dev_kfree_skb(skb);
 341                dev->stats.tx_dropped++;
 342                return NETDEV_TX_OK;
 343        }
 344        rt = (struct rtable *) dst;
 345        if (rt->rt_gateway)
 346                daddr = &rt->rt_gateway;
 347        else
 348                daddr = &ip_hdr(skb)->daddr;
 349        n = dst_neigh_lookup(dst, daddr);
 350        if (!n) {
 351                pr_err("NO NEIGHBOUR !\n");
 352                dev_kfree_skb(skb);
 353                dev->stats.tx_dropped++;
 354                return NETDEV_TX_OK;
 355        }
 356        entry = neighbour_priv(n);
 357        if (!entry->vccs) {
 358                if (time_after(jiffies, entry->expires)) {
 359                        /* should be resolved */
 360                        entry->expires = jiffies + ATMARP_RETRY_DELAY * HZ;
 361                        to_atmarpd(act_need, PRIV(dev)->number, *((__be32 *)n->primary_key));
 362                }
 363                if (entry->neigh->arp_queue.qlen < ATMARP_MAX_UNRES_PACKETS)
 364                        skb_queue_tail(&entry->neigh->arp_queue, skb);
 365                else {
 366                        dev_kfree_skb(skb);
 367                        dev->stats.tx_dropped++;
 368                }
 369                goto out_release_neigh;
 370        }
 371        pr_debug("neigh %p, vccs %p\n", entry, entry->vccs);
 372        ATM_SKB(skb)->vcc = vcc = entry->vccs->vcc;
 373        pr_debug("using neighbour %p, vcc %p\n", n, vcc);
 374        if (entry->vccs->encap) {
 375                void *here;
 376
 377                here = skb_push(skb, RFC1483LLC_LEN);
 378                memcpy(here, llc_oui, sizeof(llc_oui));
 379                ((__be16 *) here)[3] = skb->protocol;
 380        }
 381        atomic_add(skb->truesize, &sk_atm(vcc)->sk_wmem_alloc);
 382        ATM_SKB(skb)->atm_options = vcc->atm_options;
 383        entry->vccs->last_use = jiffies;
 384        pr_debug("atm_skb(%p)->vcc(%p)->dev(%p)\n", skb, vcc, vcc->dev);
 385        old = xchg(&entry->vccs->xoff, 1);      /* assume XOFF ... */
 386        if (old) {
 387                pr_warning("XOFF->XOFF transition\n");
 388                goto out_release_neigh;
 389        }
 390        dev->stats.tx_packets++;
 391        dev->stats.tx_bytes += skb->len;
 392        vcc->send(vcc, skb);
 393        if (atm_may_send(vcc, 0)) {
 394                entry->vccs->xoff = 0;
 395                goto out_release_neigh;
 396        }
 397        spin_lock_irqsave(&clip_priv->xoff_lock, flags);
 398        netif_stop_queue(dev);  /* XOFF -> throttle immediately */
 399        barrier();
 400        if (!entry->vccs->xoff)
 401                netif_start_queue(dev);
 402        /* Ohm2e_skb" cnet/atm/clip.c#L3476 racedg: 0 ahref="op. ( 303        4a hre40ment"> * to allocate the neif="+code=outod enougip.becauseor rh vccreal"nebespaleep.becauseatm/clip.c#L399" id="L399" class=4l4ne" nam4="L394"> 394        4a hre40ment"> * don't incrementttttttttttofs is bnetf  305
 * clip_setentry. 306        4eturn40"+code=entry" class="sref">ee" class="sref">spin_unlock_irqrestore(&PRf">clip_priv->xoff_lock, flags);
 307}
out_release_neigh;
 398        4"net/40"+code=netif_stop_queue" classf="+ href="start_queue(dev);
 309NETDEV_TX_OK;
 310
 311 312cmka>);
cmka>ev" c=atm_vcc" class="sref">atm_vcc *vcc, int mof="+out;
 313 314clip_vcc *clip_vcc =  315 316e->seb_push( 317
EBADFDsh( 318static i4t clip_vcc *skbkmk_wmem_alloc);
clip_vcc *fGFP_KERNE/a>;
 319{
e">clip_vcc * 320        4a hre42        ENOMEMsh( 321        4eturn42"+code=pr_debug" class="sref">pr_debug("neigh %p, vccs &#>, , n">clip_vcc *vcc);
 322}
vcc">clip_vcc *vcc = vcc =  323
e->seuser_ba_lock, vcc">clip_vcc =  324static <4 href42"+code=pr_debug" class="srefset_bcit =         et_bciev" class="sref">dev+codVF_IShref=B(PR->selags);
 325        4     42"+code=old" class="sref">old">clip_vcc *vccntry = ;
 326{
e">clip_vcc *vccff = 0;
 327        4truct42"+code=spin_lock_irqsave" cl">clip_vcc *vccntap =  328        4truct42"+code=netif_stop_queue" cla">clip_vcc *last_use = jiffies;
 329        4truct42"+code=barrier" class="sref"">clip_vcc *;
HZ;
 330        4truct43"+code=dev" class="sref">dev">clip_vcc *vcc = seb_push( 331        4truct43"+code=pr_debug" class="sref">clip_vcc *vcc = sebo =  332        4truct43"+code=vcc" class="sref">vcc->seb_push(vcc">clib_push( 333        4a hre4="+code=__be32" class="sref"> = sebo = vcc">clibo = clibo<=vccip.c#L361" id="L361" class=4line" nam4="L334"> 334        4nt  335        4nsign4d long /* Ohm2e_skb" cnet/atm/cre-process everyrh vccrecei="nebetween =      336
eode_process_recvnetif_start_queueode_process_recvnetif_cc" class="sref">vcc, 0)) {
 337        4a hre43m/clip.c#L318" id="L318" class=4line" nam4="L338"> 338        4f (!<4 href="+code=dt/atm/clip.c#L322" id="L322" class=4line" nam4="L339"> 339        4     43tm/clip.c#L280" id="L280" class=4line" nam4="L340"> 340        4     44m/clip.c#L311" id="L311" class=4line" nam4="L341"> 341        4     44uct cref="net/a> = cliref="netev" c=atm_vcc" class="sref">atm_vcc *vcc, int vcc__be32 *)ev" )p.c#L357" id="L357" class=4line" nam4="L342"> 342        4     4 returip.c#L394" id="L394" class=4line" nam4="L343"> 343        4
neighbour *neigh)
 344        4a hre44atmarp_entry *entry;
 345        4f ( 346        4     4 clip_vcc *clip_vcc =  347        4lse
<44a href="+code=clip_priv" class="srertable *rt;
 348        4     44m/clip.c#L309" id="L309" class=4line" nam4="L349"> 349        4a hre449ef="+code=old" class="sref">vcc->seb_push(clib_push( 350        4f (!<45pr_warning("XOFF->XOFF transitnon-ref= VCChref="net/atm/clip.c#L388" id="L388" class=4line" nam4="L351"> 351        4     4 EBADFsh( 352        4     4  353        4     45"+code=__be32" class="sref">">clip_vcc *skb">CLIP_VCC(vcc)-> 354        4     45ref="+code=entry"" class="sref">ei =  355        4
e">clip_vcc *vccntry =  356        4a hre45        ("NO NEIGHBOUR !\n"hid vcchidden ETS 357        4f (!<45         358        4     4 if ( 359        4     4         pr_debug("neigh %p, vccs &#removehref="net/atm/clip.c#L388" id="L388" class=4line" nam4="L360"> 360        4     4         seun0clip_vcc *clip_vcc" class="sref">vcc">clip_vcc * 361        4     4          362        4     46 363        4     46"+code=__be32" class="sref">a> = (struct ei<_route_output;
ini+codt;
vcci =  364        4     46ref="+code=entry" class="sref">eIS_ERR/a> = vcca> = (struct  365        4     4 else {
vcca> = (struct  366        4     46"+code=entry" class="sref">eeigh = n_"sref">dst_neigh_lookup(_href="+code=dst" cp_hdr" class="sref">f="+tbcol;
PRi = vcca> = (struct dev,  367        4     46"+code=spin_lock_irqsave" cli<_rt_put;
vcca> = (struct  368        4     46href="+code=dst" class="sref">dsteigh =  369        4     4 goto ENOMEMsh( 370        4
devntry = neighbour_priv(n)igh =  371        4a hre4="+code=pr_debtry" class="sref">entry->clip_vcc *vccntry =  372        4a hre47}
e">clip_vcc *vccntry =  373        4a hre4="+code=pr_deb   se">pr_debug("atm_skb(%p)->vcddhref="net/atm/clip.c#L388" id="L388" class=4line" nam4="L374"> 374        4f ( 375        4     4 void *se">pr_debug("atm_skb(%p)->vupdatehref="net/atm/clip.c#L388" id="L388" class=4line" nam4="L376"> 376
clip_vcc *clip_vcc" class="sref">vcc">clip_vcc * 377        4     4  378        4     4 0 *vcc">clip_vcc *entry-> 379        4     47f="net/atm/clip.c#L390" id="L390" class=4line" nam4="L380"> 380        4
devnip_neigh_error,et/atm/clghbour_priv" class="sre_update/a> = n)igh = llc_oui, sizeof(, sizeof( 381        4a hre48        devspan>_UPDATE_F_OVERRIDEi, sizeof(_UPDATE_F_OVERRIDE     |class="sref">devspan>_UPDATE_F_ADMI83LLC_LEN);
span>_UPDATE_F_ADMI8de=v)ip.c#L388" id="L388" class=4line" nam4="L382"> 382        4a hre4="+code=ATM_SKB" class="sref"ssf="+ href="start_queue(dev)igh =  383        4a hre4="+code=entry"=NETDEV_TX_OK" class="lip_neigh_error,et/atm/clip.c#L330" id="L330" class=4line" nam4="L384"> 384        4a hre4="+codip.c#L390" id="L390" class=4line" nam4="L385"> 385        4a hre48m/clip.c#L306" id="L306" class=4line" nam4="L386"> 386        4f (net_de_opes;
net_de_ope=n" cse" class="sref="+conf="+coopes;
 387        4     4 clip_start_xmit(sndoref">clip_s       clief">clip_start_xmit(struct  388        4     4 goto (sndor(cliconstet_d_neigh_error,">cliconstet_d_n+coddp.c#L390" id="L390" class=4line" nam4="L389"> 389        4
 390        4a hre49m/clip.c#L311" id="L311" class=4line" nam4="L391"> 391        4a hre49uct clieetuptart_xmit(struct etupev" c=net_device" class="sref">net_device *dev)
 392        4a hre49returip.c#L394" id="L394" class=4line" nam4="L393"> 393        4f (->snf="+coopes;
PRf">clnf="+coopes;
 394        4     49"+code=pr_debug" class="sref->stypevice *( 395        4     49"+code=old" class="sref">old->snff="+de=n_;
atmarp_entry * 396        4
e->shard_header_;
RFC1483LLC_LEN);
 397        4a hre4="+code=spin_lock_irqsave" cl->smtu>-> 398        4a hre4="+code=netif_stop_queue" cla->stx;
 399        4a hre4="+code=barrier/* Ohm2e_skb" cnet/atm/cWhen p, vcca ccs &#realransit odisc,s is odisc determ 400        5f (!<5 href="+code=er/* Ohm2e_skb" cnet/atm/c 391        5     5 reasonode= t/atm/clip.c#L386" id="L386" class=5l2ne" nam5="L392"> 392        5span 5lass="comment">/* Ohm2e_skb" cnet/atm/c" cpromiseebetween decet/ burst-tolerance mean="ne   393        5a hre503ss="comment">/* Ohm2e_skb" cnet/atm/cagainst memory hogsnet/atm/clip.c#L386" id="L386" class=5l4ne" nam5="L394"> 394        5a hre50"+code=pr_debug" class="sref->sde=n_lags);
eIFF_XMIT_DST_RELEASEi, sizeof( 305
 306        5eturn50m/clip.c#L377" id="L377" class=5line" nam5="L307"> 307}
ccreate/a> = ccreateev" cip_encap" class="srnumber, *(( 398        5"net/50"+codip.c#L394" id="L394" class=5line" nam5="L309"> 309net_device *dev)
 310
clibp_priv->clibp_priv-> 311 312 313 314dev);
clit/aes;
dev)->nexdtart_xmit(snexdde=_ip.c#L326" id="L326" class=5line" nam5="L315"> 315dev)->number, *((, *(( 316EEXISTi, sizeof( 317
 318static i5t number, *(( 319{
dev);
clit/aes;
dev)->nexdtart_xmit(snexdde=_ip.c#L326" id="L326" class=5line" nam5="L320"> 320        5a hre52        dev)->number, *((, *(( 321        5eturn52        number, *((dev)->number, *(( 322}
 323
e-> *clibp_priv->="+code=n" class="sref">n">clieetuptart_xmit(struct etupev" )ip.c#L355" id="L355" class=5line" nam5="L324"> 324static <5 href52ref="+code=entry"" class="sref">e)
 325        5     52else {
ENOMEMsh( 326{
e">clibp_priv->dev)-> 327        5truct52"+code=spin_lock_irqsave" cls"+cnt/a> = 0;
dev)->n   , *((n,umber, *(( 328        5truct52"+code=netif_stop_queue" cla(& =         &PRf">clip_priv->xoff_lock,  329        5truct52"+code=barrier" class="sref"">cliip_priv-> 330        5truct53"+code=dev" class="sref">devnip_neigh_error,et/atm/clghbour_priv" classregisteronf="+c_entry *dev)-> 331        5truct53"+code=pr_debtry" class="sref">enip_neigh_error,et/atm/cl)lip.c#L394" id="L394" class=5line" nam5="L332"> 332        5truct53}
e"+codnf="+c_entry *dev)-> 333        5a hre53"+code=pr_deb    334        5nt  335        5nsign53"+code=old" class="sref">old">cliip_priv->clit/aes;
 336
e">clit/aes;
 337        5a hre53"+code=spin_lock_irqsave" cl">pr_debug("neigh %p, vccs &#registered (id=:, skb)->n   , *(( 338        5f (!<5 href="+code=dt/atm/cy_send" class="number, *(( 339        5     53tm/clip.c#L280" id="L280" class=5line" nam5="L340"> 340        5     54m/clip.c#L311" id="L311" class=5line" nam5="L341"> 341        5     54uct cnet_de_evet/a;
 342        5     54}
hearbug( 343        5
 344        5a hre54net_device *dev)
 345        5f ( 346        5     5 dsteit_eqvice *dev;
dev)->PRini+codt;
 347        5lse
<54return -PRNOTIFY_DONEi, sizeof( 348        5     54m/clip.c#L309" id="L309" class=5line" nam5="L349"> 349        5a hre549ef="+code=old" class="sref">vcclvet/a;
 350        5f (!<55PRNOTIFY_DONEi, sizeof( 351        5     55ment"p.c#L397" id="L397" class=5line" nam5="L352"> 352        5     55ass="comment">/* Ohm2e_skb" cnet/atm/cignore non-ref= +code=set/atm/clip.c#L386" id="L386" class=5line" nam5="L353"> 353        5     55ref="+code=atm_may_send" class="->stypevice *dev->snf="+coopes;
PRf">clnf="+coopes;
 354        5     55PRNOTIFY_DONEi, sizeof( 355        5
 356        5a hre55        vcclvet/a;
 357        5f (!<55         358        5     5 if (pr_debug("neigh %p, vccs &#href="nU=href="net/atm/clip.c#L388" id="L388" class=5line" nam5="L359"> 359        5     5         (devact_uptart_xmit(sact_up+codd" _send" class="IV(dev)->number, *(( 360        5     5          361        5     5          362        5     56}
e">pr_debug("neigh %p, vccs &#href="nDOW8href="net/atm/clip.c#L388" id="L388" class=5line" nam5="L363"> 363        5     56"+code=pr_deb   (devact_dowa>;
dev)->number, *(( 364        5     56 365        5     5 else {
 366        5     56"+code=entry"cf="bour_priv" classhref="nCHANGEMTU3LLC_LEN);
href="nCHANGEMTU    :p.c#L398" id="L398" class=5line" nam5="L367"> 367        5     56return -e">pr_debug("neigh %p, vccs &#href="nCHANGE*href="net/atm/clip.c#L388" id="L388" class=5line" nam5="L368"> 368        5     56if (devact_change>;
dev)->number, *(( 369        5     5 goto  370        5
 371        5a hre5="+code=pr_debe=EINVAclass="sref">PRNOTIFY_DONEi, sizeof( 372        5a hre57}
 373        5a hre5="+codp.c#L280" id="L280" class=5line" nam5="L374"> 374        5f (cief="evet/a;
 375        5     5 void *heifa;
 376
 377        5     57a href="+code=clip_priv" class="srein>net_device *net_dede=x_vcc" class="srefin>netvice *netm/clip.c#L355" id="L355" class=5line" nam5="L378"> 378        5     57m/clip.c#L309" id="L309" class=5line" nam5="L379"> 379        5     57"+code=barrier" class="sref"in>netvice *netm/cl = (c=net_device" class="srin>ifaddr, *((ifaddrde=x_v)class="sref">heifa;
 380        5
 381        5a hre58     > * clip_setentry. 382        5a hre5="+cod> * clip_setentry. 383        5a hre58ment"> * to allocate the neif="+codet/atm/clip.c#L386" id="L386" class=5line" nam5="L384"> 384        5a hre58ref="+code=entry" class="sref">elvet/a;
( 385        5a hre58else {
 386        5f (PRef">cnet_de_evet/a;
vccin>netvice *netm/clev" class="sref">dev)-> 387        5     5  388        5     58m/clip.c#L309" id="L309" class=5line" nam5="L389"> 389        5
PRef">cnet_eotifiera;
 390        5a hre59href="+code=etes" class="srefnotifier_calcol;
cnet_de_evet/a;
 391        5a hre59uct <}ip.c#L330" id="L330" class=5line" nam5="L392"> 392        5a hre59ment"p.c#L330" id="L330" class=5line" nam5="L393"> 393        5f ( 394        5     59ref="p.c#L361" id="L361" class=5line" nam5="L395"> 395        5     59"+coda href==net_device" class="sreotifier_bff_lock, PRef">cief="eotifiera;
 396        5
cief="evet/a;
 397        5a hre5="+cod}ip.c#L330" id="L330" class=5line" nam5="L398"> 398        5a hre59m/clip.c#L309" id="L309" class=5line" nam5="L399"> 399        5a hre5="+codp.c#L309" id="L309" class=6line" nam6="L400"> 400        6f (!<60m/clip.c#L311" id="L311" class=6l1ne" nam6="L391"> 391        6     60uct vcc, int  392        6span 60returip.c#L394" id="L394" class=6l3ne" nam6="L393"> 393        6a hre60"+code=entry" class="sref">e">pr_debug("neigh %p, vccs &#href="net/atm/clip.c#L388" id="L388" class=6l4ne" nam6="L394"> 394        6a hre60ref="p.c#L361" id="L361" class=6line" nam6="L305"> 305
oldrtnloff_lock, lip.c#L388" id="L388" class=6l6ne" nam6="L396"> 396        6eturn60"+code=entry" class="sref">ehref="ay_send(;
 307}
;
RIV" class="sref">PRsk_hre>;
devsk_recei="netif_start_queuesk_recei="netif_ode=nip.c#L355" id="L355" class=6l8ne" nam6="L398"> 398        6"net/60"+code=netif_stop_queue" clartnlounff_lock, lip.c#L388" id="L388" class=6l9ne" nam6="L399"> 399        6ss="c60"+codp.c#L309" id="L309" class=6line" nam6="L310"> 310
dev">pr_debug("neigh %p, vccs &#(donehref="+code=skb"lip.c#L388" id="L388" class=6l1ne" nam6="L311"> 311 312 313 314;
PRhref="a_"+coopes;
 315clo="ev" hUNICAST" class="skref="a_clo="start_queuehref="a_clo="ev" p.c#L394" id="L394" class=6l6ne" nam6="L316"> 316 317
 318static i6t  319{
 *PRhref="a_"+cs;
 320        6a hre62href="+code=etes" class="srefopes;
fref="a_"+coopes;
 321        6eturn62         322}
 323
devaref="a_"+cs;
 324static <6 href62ref="}ip.c#L330" id="L330" class=6line" nam6="L325"> 325        6     62m/clip.c#L306" id="L306" class=6line" nam6="L326"> 326{
 327        6truct62tm/cla href=ip_encap" class="srh+coini+caatf="_entry *vcc, int  328        6truct62"+codip.c#L394" id="L394" class=6line" nam6="L329"> 329        6truct62"+code=barrier" class="sref"rtnloff_lock, lip.c#L388" id="L388" class=6line" nam6="L330"> 330        6truct63"+code=dev" ctry" class="sref">ehref="ay_send( 331        6truct63        , lip.c#L388" id="L388" class=6line" nam6="L332"> 332        6truct63}
EADDRINUSEi, sizeof( 333        6a hre63"+code=pr_debip.c#L280" id="L280" class=6line" nam6="L334"> 334        6nt  335        6nsign63"+code=old" class="sref">oldmod_timer, *((RIV" class="sref">PRidle_timer, *((vccjiffiees;
vcc"+codCHECK_INTERVA/a>;
vccHZa>;
 336
 337        6a hre63"+code=spin_lock_irqsave" clhref="ay_send(, int  338        6f (!<63"+code=netif_stop_queue" cla(et_bcit =         et_bciev" class="sref">devATM_VF_METAt =        ATM_VF_META    moRIV" class="sref">PR->selags);
 339        6     63"+code=barrier" class="sref"(et_bcit =         et_bciev" class="sref">devATM_VF_READYt =        ATM_VF_READY    moRIV" class="sref">PR->selags);
 340        6     64         341        6     64"+code=pr_debug" class="sref->se)
fref="a_"+cs;
 342        6     64}
->devsk_hre>;
 343        6
e->sepus = ;
 344        6a hre64e->sepo"_entry *;
/* Ohm2e_skb" cnet/atm/c"rashet/atm/clip.c#L386" id="L386" class=6line" nam6="L345"> 345        6f (old->sepus<_oae>;
;
/* Ohm2e_skb" cnet/atm/c"rashet/atm/clip.c#L386" id="L386" class=6line" nam6="L346"> 346        6     64"+code=entry" class="sref">ertnlounff_lock, lip.c#L388" id="L388" class=6line" nam6="L347"> 347        6lse
<64return - 348        6     64m/cliip.c#L280" id="L280" class=6line" nam6="L349"> 349        6a hre64"+codp.c#L309" id="L309" class=6line" nam6="L350"> 350        6f (!<65cioctcol;
cioctcev" c=net_device" class="srso"net>->vccsf_lock,  351        6     65ment"ip.c#L394" id="L394" class=6line" nam6="L352"> 352        6     65ass="comment"=net_device" class="sraatm_vcc *vcc, int , devsf_lock,  353        6     65ref="+code=atmp_encap" class="srlipock,  354        6     65ref="p.c#L361" id="L361" class=6line" nam6="L355"> 355        6
vccemay_send( 356        6a hre65"+code=entry"cf="bour_priv" classSIOCMK"+coy_send( 357        6f (!<65        ;
 358        6     6 if (( 359        6     6          =        ATMARP_SETENTRY+cod:p.c#L398" id="L398" class=6line" nam6="L360"> 360        6     6         ( 361        6     66        e"apode=y_send(devCAo_NET_ADMI83LLC_LEN);
CAo_NET_ADMI8ode=inp.c#L398" id="L398" class=6line" nam6="L362"> 362        6     66}
EPERMi, sizeof( 363        6     66"+code=pr_deb    364        6     66 365        6     66else {
ENOIOCTLCMDock,  366        6     66"+code=entry"ip.c#L280" id="L280" class=6line" nam6="L367"> 367        6     66m/clip.c#L318" id="L318" class=6line" nam6="L368"> 368        6     66if (vccemay_send( 369        6     66        ( 370        6
ccreate/a> = ccreateev" c_TX_OK" class="arbug( 371        6a hre67         372        6a hre672       ;
 373        6a hre67"+code=pr_deb    * 374        6f (elipock,  375        6     6 void *devsf_lock, devstate/a> =  376
 377        6     67return - 378        6     67if ( 379        6     67        ( 380        6
cmkiptart_xmit(structmkipev" ccc" class="sref, int vccarbug( 381        6a hre68         382        6a hre682        =        ATMARP_SETENTRY+cod:p.c#L398" id="L398" class=6line" nam6="L383"> 383        6a hre68"+code=pr_deb    33*vccarbug( 384        6a hre68 385        6a hre68else {
( 386        6f (vccarbug( 387        6     68return - 388        6     68if ( 389        6
 390        6a hre69href=ip.c#L280" id="L280" class=6line" nam6="L391"> 391        6a hre69ment"p.c#L397" id="L397" class=6line" nam6="L392"> 392        6a hre69ment"a href==net_device" class="sr"+coioctcol;
cioctcoopes;
 393        6f ( 394        6     694+code=entry"tes" class="srefioctcol;
cioctcol;
cioctcev"  p.c#L390" id="L390" class=6line" nam6="L395"> 395        6     69"+cod}ip.c#L330" id="L330" class=6line" nam6="L396"> 396        6
 397        6a hre6="+cod#ifdefolass="sref">vcc"ONFIG_PROC_FS3LLC_LEN);
CONFIG_PROC_FS/clip.c#L377" id="L377" class=6line" nam6="L398"> 398        6a hre69m/clip.c#L309" id="L309" class=6line" nam6="L399"> 399        6a hre69f="nea href=here"ICAST" class="ssvc_addr, *((vccseqvice *vccaddr, *(( 400        7f (!<70m/cliip.c#L394" id="L394" class=7l1ne" nam7="L391"> 391        7     70        ;
 392        7span 702        36 393        7a hre70"+codp.c#L280" id="L280" class=7l4ne" nam7="L394"> 394        7a hre70ref="+code=entry"class="sref">vccaddr, *((devsas_addr, *(( 305
 = 0;
devseqvice * skbaddr, *((devsas_addr, *(( 396        7eturn70        vccaddr, *((devsas_addr, *(( 397        7="net70return -, devseqvice * 398        7"net/70"+code=netif_}"tm/cld" c"class="sref">vccaddr, *((devsas_addr, *(( 399        7ss="c70         = 0;
devseqvice *  310
 311 312vccaddr, *((devsas_addr, *(( 313vccprcs;
devsas_addr, *(( 314vccfield);
 315vccjol;
 316 317
efield);
vccprcs;
 36 36;
 318static i7t efield);
eiol;
 319{
ejol;
ejol;
 320        7a hre72eseq_"+cnt/a> = 0;
devseqvice * vccprcs;
 321        7eturn72        efield);
 322}
eseq_"utcock, devseqvice * 323
 324static <7 href72ref="+code=enip.c#L280" id="L280" class=7line" nam7="L325"> 325        7     72m/cliip.c#L280" id="L280" class=7l6ne" nam7="L326"> 326{
 327        7truct72tm/cl>/* Ohm2e_skb" cnet/atm/cThis meanss is neighbour tmarp has no attached VCC objects.et/atm/clip.c#L386" id="L386" class=7l8ne" nam7="L328"> 328        7truct72"+cod#def 329        7truct72"+codp.c#L309" id="L309" class=7line" nam7="L330"> 330        7truct73;
vccseqvice *vcca>;
 331        7truct73        vcctmarp_entry *c, int cvccef">c, int c 332        7truct73returip.c#L394" id="L394" class=7line" nam7="L333"> 333        7a hre73"+code=pr_deb=clip_vcc" class="srefef">net_device *dev)
se)
 334        7nt  335        7nsign73"+code=old" cchar _TX_OK" class="bu/a> = 0;
 336
vccllcock, vccof/a> = 0;
 337        7a hre73m/clip.c#L318" id="L318" class=7l8ne" nam7="L338"> 338        7f (!<73"+code=netif_stop_queue" cla(vcock, c, int c);
SEQ_NO_VCC_TOKE8ef=") ||p.c#L318" id="L318" class=7l9ne" nam7="L339"> 339        7     73        devsk_hre>;
c, int cse, int devsk_familp_entry * 36 340        7     74m/clip.c#L311" id="L311" class=7line" nam7="L341"> 341        7     74"+code=pr_debug" class="srefllcock, c, int c);
SEQ_NO_VCC_TOKE8ef=") ||evice" class="sref">c, int cdeveneap_entry * 342        7     74ment"p.c#L330" id="L330" class=7line" nam7="L343"> 343        7
eef">c, int c);
SEQ_NO_VCC_TOKE8ef=")p.c#L330" id="L330" class=7line" nam7="L344"> 344        7a hre74snfighvice *suseay_send( 345        7f ( 346        7     74        c, int cdevintt_u="start_queueintt_u="m/clip.c#L388" id="L388" class=7line" nam7="L347"> 347        7lse
<74m/clip.c#L318" id="L318" class=7l8ne" nam7="L348"> 348        7     74"+code=netif_stop_queue" clalxp_entry * *vccHZa>;
 349        7a hre74"+codp.c#L309" id="L309" class=7line" nam7="L350"> 350        7f (!<75"+code=dev" class="sref">devseq_"+cnt/a> = 0;
devseqvice *     351        7     75        se)
sn   vice *vcc(vcock, vccllcock, vcclxp_entry * 352        7     75ment"p.c#L330" id="L330" class=7line" nam7="L353"> 353        7     75ref="+code=atlass="sref">vccof/a> = 0;
 = 0;
devbu/a> = 0;
devbu/a> = 0;
 vcca>;
se"+cmary_kep_entry * 354        7     75 355        7
 356        7a hre75"+code=entry"vice" class="srbu/a> = 0;
 357        7f (!<75"+code=spin_lock_irqsave" clseq_"+cnt/a> = 0;
devseqvice * devbu/a> = 0;
 358        7     75m/clip.c#L309" id="L309" class=7line" nam7="L359"> 359        7     7         eef">c, int c);
SEQ_NO_VCC_TOKE8ef=")lip.c#L394" id="L394" class=7line" nam7="L360"> 360        7     76etime_befor vice *devjiffiees;
vcclmarp_entry *slxpirees;
 361        7     76         = 0;
devseqvice * 362        7     76}
 363        7     76"+code=pr_deb    = 0;
devseqvice *  364        7     76(tmarp_entry *snfighvice *sss=ct/a;
 365        7     76else {
vcc(vcock,  366        7     76         = 0;
devseqvice *    367        7     76return -c, int cse, int se)
snumber, *(( 368        7     76if (c, int cse, int sevpiol;
vccef">c, int cse, int sevciol;
 369        7     76         370        7
devseqvice *ef">c, int cse, int seremote/a> =  371        7a hre77        , devseqvice * 372        7a hre772        373        7a hre77"+codip.c#L280" id="L280" class=7line" nam7="L374"> 374        7f ( 375        7     77"+coda et_device" class="sref">cseq_state/a> = cseq_state     ip.c#L394" id="L394" class=7l6ne" nam7="L376"> 376
/* Ohm2e_skb" cnet/atm/cThis me"+co must be first.et/atm/clip.c#L386" id="L386" class=7line" nam7="L377"> 377        7     77return - 378        7     77m/clip.c#L309" id="L309" class=7line" nam7="L379"> 379        7     77        /* Ohm2e_skb" cnet/atm/cLocal to " cl specifef=iteration.et/atm/clip.c#L386" id="L386" class=7line" nam7="L380"> 380        7
c, int cvcc, int  381        7a hre78uct <}ip.c#L330" id="L330" class=7line" nam7="L382"> 382        7a hre78ment"p.c#L330" id="L330" class=7line" nam7="L383"> 383        7a hre78"+coda href==net_device" class="sref">c, int cvccef">cseq_nextc, int cseq_nextcvcct_entry * 384        7a hre78c, int cvcceuipock,  385        7a hre78else ip.c#L394" id="L394" class=7line" nam7="L386"> 386        7f (e"uipock,  387        7     78return -e"uipock, se;
 388        7     78if (e"uipock,  389        7
 390        7a hre79e"uipock,  391        7a hre79"+code=pr_debip.c#L280" id="L280" class=7line" nam7="L392"> 392        7a hre792ef="+code=entry" class="sref">e"uipock, );
SEQ_NO_VCC_TOKE8ef=")p.c#L330" id="L330" class=7line" nam7="L393"> 393        7f (eLL;
 394        7     79ref="p.c#L361" id="L361" class=7line" nam7="L395"> 395        7     79"+code=old" class="sref">old"uipock, , snfx/a;
 396        7
 397        7a hre79return -e"uipock,  398        7a hre79m/cliip.c#L280" id="L280" class=7line" nam7="L399"> 399        7a hre79"+codp.c#L309" id="L309" class=8line" nam8="L400"> 400        8f (!<80vccef">cseq_+coowallock, cseq_+coowallev" c=net_device" class="sref">cseq_state/a> = cseq_state     class="sref">vccstate/a> =  391        8     80        vcct_entry *vccloff_/a;
vccpoes;
 392        8span 80returip.c#L394" id="L394" class=8l3ne" nam8="L393"> 393        8a hre80"+code=pr_deb=clip_vcc" class="srefef">c, int cvcc, int se, int  394        8a hre80ref="p.c#L361" id="L361" class=8line" nam8="L305"> 305
old, int cseq_nextc, int cseq_nextcvcct_entry *vcc, int  396        8eturn80        old, int vccpoes;
;
 397        8="net80return -vccpoes;
 398        8"net/80if (old, int cseq_nextc, int cseq_nextcvcct_entry *vcc, int  399        8ss="c80        e, int  310
 311vccpoes;
 312 313 314se, int , int  315 316e, int  317
 318static i8t  319{
vccef">cseq_sub_iter/a> = cseq_sub_iterev" c=net_device" class="srneighcseq_state/a> = vcc_state/a> =  320        8a hre82vcca>;
vccloff_/a;
vccpoes;
 321        8eturn82ment"ip.c#L394" id="L394" class=8line" nam8="L322"> 322}
cseq_state/a> = cseq_state     class="sref">vccstate/a> = cseq_state/a> = cseq_state     cilass="sref">vcc_state/a> =  323
 324static <8 href82ref="+code=entry"lass="sref">vcca>;
se)
styp vice * * 325        8     82else {
eLL;
 326{
 327        8truct82return -e"f">cseq_+coowallock, cseq_+coowallev" class="sref">vccstate/a> = )
vcca>;
 328        8truct82m/cliip.c#L280" id="L280" class=8l9ne" nam8="L329"> 329        8truct82"+codp.c#L309" id="L309" class=8line" nam8="L330"> 330        8truct83vccef">cseq_star/a;
cseq_star/ev" c=net_device" class="srseq_fie=y_send(vccseqvice *vccloff_/a;
vccpoes;
 331        8truct83ment"ip.c#L394" id="L394" class=8line" nam8="L332"> 332        8truct83}
cseq_state/a> = cseq_state     class="sref">vccstate/a> = vccseqvice *se"+cvate/a> =  333        8a hre83"+code=pr_debICAST" class="sstate/a> = senes;
cseq_sub_iter/a> = cseq_sub_iterev" ip.c#L304" id="L304" class=8line" nam8="L334"> 334        8nt eneighcseq_star/a;
vccseqvice *vccpoes;
f="_tbcol;
vccNEIGH_SEQ_NEIGH_ONLYt =        NEIGH_SEQ_NEIGH_ONLYef=")ip.c#L322" id="L322" class=8line" nam8="L335"> 335        8nsign83m/cliip.c#L280" id="L280" class=8l6ne" nam8="L336"> 336
 337        8a hre83m/clia href=ip_encap" class="sref">cseq_show/a> = cseq_showev" c=net_device" class="srseq_fie=y_send(vccseqvice *vcca>)
 338        8f (!<83"+codip.c#L394" id="L394" class=8l9ne" nam8="L339"> 339        8     83        , *(( 340        8     84 341        8     84ment"p.c#L397" id="L397" class=8line" nam8="L342"> 342        8     842ef="+code=entry" class="sref">ea>)
);
SEQ_START_TOKE8ef=") ip.c#L394" id="L394" class=8line" nam8="L343"> 343        8
vccseqvice *vccL39_"="_banner, *(( 344        8a hre84 345        8f (cseq_state/a> = cseq_state     class="sref">vccstate/a> = vccseqvice *se"+cvate/a> =  346        8     84        c, int cvcc, int se, int  347        8lse
<84return -vcca>;
)
 348        8     84m/clip.c#L309" id="L309" class=8l9ne" nam8="L349"> 349        8a hre84        ;
vccseqvice *vcca>;
vccneighbour_"+ca>)
vcca>;
 350        8f (!<85"+code=dev" cip.c#L280" id="L280" class=8line" nam8="L351"> 351        8     85         352        8     85ment"ip.c#L280" id="L280" class=8line" nam8="L353"> 353        8     85"+codp.c#L280" id="L280" class=8line" nam8="L354"> 354        8     85f="_seq_opes;
 355        8
cseq_star/a;
cseq_star/ev"  p.c#L390" id="L390" class=8l6ne" nam8="L356"> 356        8a hre85"+code=entry"tes" class="srefnex/a;
 357        8f (!<85"+code=spin_ltes" class="srefstop_entry * 358        8     858+code=spin_ltes" class="srefshow/a> = cseq_show/a> = cseq_showev"  p.c#L390" id="L390" class=8l9ne" nam8="L359"> 359        8     8      }ip.c#L330" id="L330" class=8line" nam8="L360"> 360        8     86m/clip.c#L311" id="L311" class=8line" nam8="L361"> 361        8     86     a href=ip_encap" class="srf="_seq_opea>;
;
vccino"sol;
vccfie=y_send( 362        8     86returip.c#L394" id="L394" class=8line" nam8="L363"> 363        8     86"+code=pr_debt/atm/c class="sref">eseq_opea_ne/a;
vccino"sol;
vccfie=y_send(f="_seq_opes;
 364        8     86cseq_state/a> = cseq_state    ilip.c#L388" id="L388" class=8line" nam8="L365"> 365        8     86m/cliip.c#L280" id="L280" class=8l6ne" nam8="L366"> 366        8     86m/clip.c#L377" id="L377" class=8line" nam8="L367"> 367        8     86m/clia href=const==net_device" class="srfie=_operationes;
f="_seq_fopes;
 368        8     868+code=spin_ltes" class="srefopea>;
;
 369        8     86         370        8
 371        8a hre87        relea="       ;
 372        8a hre872        373        8a hre87"+codiip.c#L388" id="L388" class=8line" nam8="L374"> 374        8f ( 375        8     87void p.c#L355" id="L355" class=8l6ne" nam8="L376"> 376
cexit_noproa>, int cexit_noproaev" cherelip.c#L388" id="L388" class=8line" nam8="L377"> 377        8     87m/clip.c#L318" id="L318" class=8line" nam8="L378"> 378        8     87m/clia href=ip_encap" class="sr__ini/a;
fre_ef">cini/a;
cini/ev" cherelp.c#L318" id="L318" class=8l9ne" nam8="L379"> 379        8     87     ip.c#L394" id="L394" class=8line" nam8="L380"> 380        8
devregistercaat_ioctcol;
ef">cioctc_opes;
cioctc_opeode=iip.c#L322" id="L322" class=8line" nam8="L381"> 381        8a hre88"+code=pr_debug" class="srefregistercid=+code=_notifier, *((ef">c+co_notifier, *((c+co_notifierode=iip.c#L322" id="L322" class=8line" nam8="L382"> 382        8a hre882+code=pr_debug" class="srefregisterc, *((ef">ci/at_notifier, *((ci/at_notifierode=iip.c#L322" id="L322" class=8line" nam8="L383"> 383        8a hre88"+codp.c#L280" id="L280" class=8line" nam8="L384"> 384        8a hre88ide=_timer, *((vccide=_timer_checlock,  385        8a hre88void p.c#L355" id="L355" class=8line" nam8="L386"> 386        8f (vccCONFIG_PROC_FSock,  387        8     88return - 388        8     88if (vccp_entry * 389        8
 390        8a hre89vccp_entry *devS_IRUGO3LLC_LEN);
S_IRUGOev" ,=lass="sref">vccL39_"+oa_roo/a;
f="_seq_fopes;
 391        8a hre89        ep_entry * 392        8a hre89}
vccpr_tipock,  393        8f (vcchre_ef">cexit_noproa>, int cexit_noproaev" clip.c#L388" id="L388" class=8line" nam8="L394"> 394        8     89vccENOMEMvice * 395        8     89else {
 396        8
 397        8a hre89retur#endifp.c#L388" id="L388" class=8line" nam8="L398"> 398        8a hre89m/clip.c#L309" id="L309" class=8line" nam8="L399"> 399        8a hre89         400        9f (!<90 391        9     90ment"p.c#L397" id="L397" class=9l2ne" nam9="L392"> 392        9span 90retura href=here"ICAST" class="shre_ef">cexit_noproa>, int cexit_noproaev" cherelp.c#L397" id="L397" class=9l3ne" nam9="L393"> 393        9a hre90"+codip.c#L394" id="L394" class=9l4ne" nam9="L394"> 394        9a hre90net_device *dev)
vccnfx/a;
 305
 396        9eturn90"+code=entry"vice" class="srunregisterc, *((ef">ci/at_notifier, *((ci/at_notifierode=iip.c#L322" id="L322" class=9l7ne" nam9="L397"> 397        9="net90"+code=spin_lock_irqsave" clunregistercid=+code=_notifier, *((ef">c+co_notifier, *((c+co_notifierode=iip.c#L322" id="L322" class=9l8ne" nam9="L398"> 398        9"net/90m/clip.c#L309" id="L309" class=9l9ne" nam9="L399"> 399        9ss="c90        dev;
ef">cioctc_opes;
cioctc_opeode=iip.c#L322" id="L322" class=9line" nam9="L310"> 310
 311 312 313/* Ohm2e_skb" cnet/atef="net/a*/atm/clip.c#L386" id="L386" class=9l4ne" nam9="L314"> 314ide=_timer, *(( 315 316c+coes;
c+coem/clip.c#L304" id="L304" class=9l7ne" nam9="L317"> 317
 318static i9t vccnfx/a;
vcc)
snfx/a;
 319{
vcc)
 320        9a hre92vcc)
 321        9eturn92         322}
 323
 324static <9 href92ref="p.c#L361" id="L361" class=9line" nam9="L325"> 325        9     925etura href=here"ICAST" class="s_cexita;
fre_ef">cexita;
cexitev" cherelp.c#L397" id="L397" class=9l6ne" nam9="L326"> 326{
 327        9truct92"+code=spin_lock_irqsave" clremove_"+oa_tmarp_entry *devL39_"+oa_roo/a;
 328        9truct92m/clip.c#L309" id="L309" class=9l9ne" nam9="L329"> 329        9truct92        devhre_ef">cexit_noproa>, int cexit_noproaev" clip.c#L388" id="L388" class=9line" nam9="L330"> 330        9truct93 331        9truct93ment"p.c#L397" id="L397" class=9line" nam9="L332"> 332        9truct93}
devmodue=_ini/a;
vccfre_ef">cini/a;
cini/ev" lip.c#L388" id="L388" class=9l3ne" nam9="L333"> 333        9a hre93"+codlass="sref">devmodue=_exita;
vccfre_ef">cexita;
cexitev" lip.c#L388" id="L388" class=9line" nam9="L334"> 334        9nt vccMODULE_AUTHORa;
 335        9nsign93m/clilass="sref">vccMODULE_DESCRIPTIO83LLC_LEN);
MODULE_DESCRIPTIO8ev" clquot;neigh %p, vccs &#Ceighical/IP overeATM interfacef="+code=skb"lip.c#L388" id="L388" class=9l6ne" nam9="L336"> 336
vccMODULE_LICENSEi, sizeof( 337        9a hre93m/cli


33foo/er<> Tis orig;pal LXR==oftware bys is .c#L388" http://sourceforge.id="projects/lxr<>LXR=" cnuni/ym/cl cthis experinet/al versionsbys.c#L388" mailto:lxr@7lxr@7 33subfoo/er<> lxr.7Redpill L