linux/net/decnet/dn_dev.c
<<
>>
Prefs
   1/*
   2 * DECnet       An implementation of the DECnet protocol suite for the LINUX
   3 *              operating system.  DECnet is implemented using the  BSD Socket
   4 *              interface as the means of communication with the user level.
   5 *
   6 *              DECnet Device Layer
   7 *
   8 * Authors:     Steve Whitehouse <SteveW@ACM.org>
   9 *              Eduardo Marcelo Serrat <emserrat@geocities.com>
  10 *
  11 * Changes:
  12 *          Steve Whitehouse : Devices now see incoming frames so they
  13 *                             can mark on who it came from.
  14 *          Steve Whitehouse : Fixed bug in creating neighbours. Each neighbour
  15 *                             can now have a device specific setup func.
  16 *          Steve Whitehouse : Added /proc/sys/net/decnet/conf/<dev>/
  17 *          Steve Whitehouse : Fixed bug which sometimes killed timer
  18 *          Steve Whitehouse : Multiple ifaddr support
  19 *          Steve Whitehouse : SIOCGIFCONF is now a compile time option
  20 *          Steve Whitehouse : /proc/sys/net/decnet/conf/<sys>/forwarding
  21 *          Steve Whitehouse : Removed timer1 - it's a user space issue now
  22 *         Patrick Caulfield : Fixed router hello message format
  23 *          Steve Whitehouse : Got rid of constant sizes for blksize for
  24 *                             devices. All mtu based now.
  25 */
  26
  27#include <linux/capability.h>
  28#include <linux/module.h>
  29#include <linux/moduleparam.h>
  30#include <linux/init.h>
  31#include <linux/net.h>
  32#include <linux/netdevice.h>
  33#include <linux/proc_fs.h>
  34#include <linux/seq_file.h>
  35#include <linux/timer.h>
  36#include <linux/string.h>
  37#include <linux/if_addr.h>
  38#include <linux/if_arp.h>
  39#include <linux/if_ether.h>
  40#include <linux/skbuff.h>
  41#include <linux/sysctl.h>
  42#include <linux/notifier.h>
  43#include <linux/slab.h>
  44#include <asm/uaccess.h>
  45#include <net/net_namespace.h>
  46#include <net/neighbour.h>
  47#include <net/dst.h>
  48#include <net/flow.h>
  49#include <net/fib_rules.h>
  50#include <net/netlink.h>
  51#include <net/dn.h>
  52#include <net/dn_dev.h>
  53#include <net/dn_route.h>
  54#include <net/dn_neigh.h>
  55#include <net/dn_fib.h>
  56
  57#define DN_IFREQ_SIZE (sizeof(struct ifreq) - sizeof(struct sockaddr) + sizeof(struct sockaddr_dn))
  58
  59static char dn_rt_all_end_mcast[ETH_ALEN] = {0xAB,0x00,0x00,0x04,0x00,0x00};
  60static char dn_rt_all_rt_mcast[ETH_ALEN]  = {0xAB,0x00,0x00,0x03,0x00,0x00};
  61static char dn_hiord[ETH_ALEN]            = {0xAA,0x00,0x04,0x00,0x00,0x00};
  62static unsigned char dn_eco_version[3]    = {0x02,0x00,0x00};
  63
  64extern struct neigh_table dn_neigh_table;
  65
  66/*
  67 * decnet_address is kept in network order.
  68 */
  69__le16 decnet_address = 0;
  70
  71static DEFINE_SPINLOCK(dndev_lock);
  72static struct net_device *decnet_default_device;
  73static BLOCKING_NOTIFIER_HEAD(dnaddr_chain);
  74
  75static struct dn_dev *dn_dev_create(struct net_device *dev, int *err);
  76static void dn_dev_delete(struct net_device *dev);
  77static void dn_ifaddr_notify(int event, struct dn_ifaddr *ifa);
  78
  79static int dn_eth_up(struct net_device *);
  80static void dn_eth_down(struct net_device *);
  81static void dn_send_brd_hello(struct net_device *dev, struct dn_ifaddr *ifa);
  82static void dn_send_ptp_hello(struct net_device *dev, struct dn_ifaddr *ifa);
  83
  84static struct dn_dev_parms dn_dev_list[] =  {
  85{
  86        .type =         ARPHRD_ETHER, /* Ethernet */
  87        .mode =         DN_DEV_BCAST,
  88        .state =        DN_DEV_S_RU,
  89        .t2 =           1,
  90        .t3 =           10,
  91        .name =         "ethernet",
  92        .up =           dn_eth_up,
  93        .down =         dn_eth_down,
  94        .timer3 =       dn_send_brd_hello,
  95},
  96{
  97        .type =         ARPHRD_IPGRE, /* DECnet tunneled over GRE in IP */
  98        .mode =         DN_DEV_BCAST,
  99        .state =        DN_DEV_S_RU,
 100        .t2 =           1,
 101        .t3 =           10,
 102        .name =         "ipgre",
 103        .timer3 =       dn_send_brd_hello,
 104},
 105#if 0
 106{
 107        .type =         ARPHRD_X25, /* Bog standard X.25 */
 108        .mode =         DN_DEV_UCAST,
 109        .state =        DN_DEV_S_DS,
 110        .t2 =           1,
 111        .t3 =           120,
 112        .name =         "x25",
 113        .timer3 =       dn_send_ptp_hello,
 114},
 115#endif
 116#if 0
 117{
 118        .type =         ARPHRD_PPP, /* DECnet over PPP */
 119        .mode =         DN_DEV_BCAST,
 120        .state =        DN_DEV_S_RU,
 121        .t2 =           1,
 122        .t3 =           10,
 123        .name =         "ppp",
 124        .timer3 =       dn_send_brd_hello,
 125},
 126#endif
 127{
 128        .type =         ARPHRD_DDCMP, /* DECnet over DDCMP */
 129        .mode =         DN_DEV_UCAST,
 130        .state =        DN_DEV_S_DS,
 131        .t2 =           1,
 132        .t3 =           120,
 133        .name =         "ddcmp",
 134        .timer3 =       dn_send_ptp_hello,
 135},
 136{
 137        .type =         ARPHRD_LOOPBACK, /* Loopback interface - always last */
 138        .mode =         DN_DEV_BCAST,
 139        .state =        DN_DEV_S_RU,
 140        .t2 =           1,
 141        .t3 =           10,
 142        .name =         "loopback",
 143        .timer3 =       dn_send_brd_hello,
 144}
 145};
 146
 147#define DN_DEV_LIST_SIZE ARRAY_SIZE(dn_dev_list)
 148
 149#define DN_DEV_PARMS_OFFSET(x) offsetof(struct dn_dev_parms, x)
 150
 151#ifdef CONFIG_SYSCTL
 152
 153static int min_t2[] = { 1 };
 154static int max_t2[] = { 60 }; /* No max specified, but this seems sensible */
 155static int min_t3[] = { 1 };
 156static int max_t3[] = { 8191 }; /* Must fit in 16 bits when multiplied by BCT3MULT or T3MULT */
 157
 158static int min_priority[1];
 159static int max_priority[] = { 127 }; /* From DECnet spec */
 160
 161static int dn_forwarding_proc(ctl_table *, int,
 162                        void __user *, size_t *, loff_t *);
 163static struct dn_dev_sysctl_table {
 164        struct ctl_table_header *sysctl_header;
 165        ctl_table dn_dev_vars[5];
 166} dn_dev_sysctl = {
 167        NULL,
 168        {
 169        {
 170                .procname = "forwarding",
 171                .data = (void *)DN_DEV_PARMS_OFFSET(forwarding),
 172                .maxlen = sizeof(int),
 173                .mode = 0644,
 174                .proc_handler = dn_forwarding_proc,
 175        },
 176        {
 177                .procname = "priority",
 178                .data = (void *)DN_DEV_PARMS_OFFSET(priority),
 179                .maxlen = sizeof(int),
 180                .mode = 0644,
 181                .proc_handler = proc_dointvec_minmax,
 182                .extra1 = &min_priority,
 183                .extra2 = &max_priority
 184        },
 185        {
 186                .procname = "t2",
 187                .data = (void *)DN_DEV_PARMS_OFFSET(t2),
 188                .maxlen = sizeof(int),
 189                .mode = 0644,
 190                .proc_handler = proc_dointvec_minmax,
 191                .extra1 = &min_t2,
 192                .extra2 = &max_t2
 193        },
 194        {
 195                .procname = "t3",
 196                .data = (void *)DN_DEV_PARMS_OFFSET(t3),
 197                .maxlen = sizeof(int),
 198                .mode = 0644,
 199                .proc_handler = proc_dointvec_minmax,
 200                .extra1 = &min_t3,
 201                .extra2 = &max_t3
 202        },
 203        {0}
 204        },
 205};
 206
 207static void dn_dev_sysctl_register(struct net_device *dev, struct dn_dev_parms *parms)
 208{
 209        struct dn_dev_sysctl_table *t;
 210        int i;
 211
 212        char path[sizeof("net/decnet/conf/") + IFNAMSIZ];
 213
 214        t = kmemdup(&dn_dev_sysctl, sizeof(*t), GFP_KERNEL);
 215        if (t == NULL)
 216                return;
 217
 218        for(i = 0; i < ARRAY_SIZE(t->dn_dev_vars) - 1; i++) {
 219                long offset = (long)t->dn_dev_vars[i].data;
 220                t->dn_dev_vars[i].data = ((char *)parms) + offset;
 221        }
 222
 223        snprintf(path, sizeof(path), "net/decnet/conf/%s",
 224                dev? dev->name : parms->name);
 225
 226        t->dn_dev_vars[0].extra1 = (void *)dev;
 227
 228        t->sysctl_header = register_net_sysctl(&init_net, path, t->dn_dev_vars);
 229        if (t->sysctl_header == NULL)
 230                kfree(t);
 231        else
 232                parms->sysctl = t;
 233}
 234
 235static void dn_dev_sysctl_unregister(struct dn_dev_parms *parms)
 236{
 237        if (parms->sysctl) {
 238                struct dn_dev_sysctl_table *t = parms->sysctl;
 239                parms->sysctl = NULL;
 240                unregister_net_sysctl_table(t->sysctl_header);
 241                kfree(t);
 242        }
 243}
 244
 245static int dn_forwarding_proc(ctl_table *table, int write,
 246                                void __user *buffer,
 247                                size_t *lenp, loff_t *ppos)
 248{
 249#ifdef CONFIG_DECNET_ROUTER
 250        struct net_device *dev = table->extra1;
 251        struct dn_dev *dn_db;
 252        int err;
 253        int tmp, old;
 254
 255        if (table->extra1 == NULL)
 256                return -EINVAL;
 257
 258        dn_db = rcu_dereference_raw(dev->dn_ptr);
 259        old = dn_db->parms.forwarding;
 260
 261        err = proc_dointvec(table, write, buffer, lenp, ppos);
 262
 263        if ((err >= 0) && write) {
 264                if (dn_db->parms.forwarding < 0)
 265                        dn_db->parms.forwarding = 0;
 266                if (dn_db->parms.forwarding > 2)
 267                        dn_db->parms.forwarding = 2;
 268                /*
 269                 * What an ugly hack this is... its works, just. It
 270                 * would be nice if sysctl/proc were just that little
 271                 * bit more flexible so I don't have to write a special
 272                 * routine, or suffer hacks like this - SJW
 273                 */
 274                tmp = dn_db->parms.forwarding;
 275                dn_db->parms.forwarding = old;
 276                if (dn_db->parms.down)
 277                        dn_db->parms.down(dev);
 278                dn_db->parms.forwarding = tmp;
 279                if (dn_db->parms.up)
 280                        dn_db->parms.up(dev);
 281        }
 282
 283        return err;
 284#else
 285        return -EINVAL;
 286#endif
 287}
 288
 289#else /* CONFIG_SYSCTL */
 290static void dn_dev_sysctl_unregister(struct dn_dev_parms *parms)
 291{
 292}
 293static void dn_dev_sysctl_register(struct net_device *dev, struct dn_dev_parms *parms)
 294{
 295}
 296
 297#endif /* CONFIG_SYSCTL */
 298
 299static inline __u16 mtu2blksize(struct net_device *dev)
 300{
 301        u32 blksize = dev->mtu;
 302        if (blksize > 0xffff)
 303                blksize = 0xffff;
 304
 305        if (dev->type == ARPHRD_ETHER ||
 306            dev->type == ARPHRD_PPP ||
 307            dev->type == ARPHRD_IPGRE ||
 308            dev->type == ARPHRD_LOOPBACK)
 309                blksize -= 2;
 310
 311        return (__u16)blksize;
 312}
 313
 314static struct dn_ifaddr *dn_dev_alloc_ifa(void)
 315{
 316        struct dn_ifaddr *ifa;
 317
 318        ifa = kzalloc(sizeof(*ifa), GFP_KERNEL);
 319
 320        return ifa;
 321}
 322
 323static void dn_dev_free_ifa(struct dn_ifaddr *ifa)
 324{
 325        kfree_rcu(ifa, rcu);
 326}
 327
 328static void dn_dev_del_ifa(struct dn_dev *dn_db, struct dn_ifaddr __rcu **ifap, int destroy)
 329{
 330        struct dn_ifaddr *ifa1 = rtnl_dereference(*ifap);
 331        unsigned char mac_addr[6];
 332        struct net_device *dev = dn_db->dev;
 333
 334        ASSERT_RTNL();
 335
 336        *ifap = ifa1->ifa_next;
 337
 338        if (dn_db->dev->type == ARPHRD_ETHER) {
 339                if (ifa1->ifa_local != dn_eth2dn(dev->dev_addr)) {
 340                        dn_dn2eth(mac_addr, ifa1->ifa_local);
 341                        dev_mc_del(dev, mac_addr);
 342                }
 343        }
 344
 345        dn_ifaddr_notify(RTM_DELADDR, ifa1);
 346        blocking_notifier_call_chain(&dnaddr_chain, NETDEV_DOWN, ifa1);
 347        if (destroy) {
 348                dn_dev_free_ifa(ifa1);
 349
 350                if (dn_db->ifa_list == NULL)
 351                        dn_dev_delete(dn_db->dev);
 352        }
 353}
 354
 355static int dn_dev_insert_ifa(struct dn_dev *dn_db, struct dn_ifaddr *ifa)
 356{
 357        struct net_device *dev = dn_db->dev;
 358        struct dn_ifaddr *ifa1;
 359        unsigned char mac_addr[6];
 360
 361        ASSERT_RTNL();
 362
 363        /* Check for duplicates */
 364        for (ifa1 = rtnl_dereference(dn_db->ifa_list);
 365             ifa1 != NULL;
 366             ifa1 = rtnl_dereference(ifa1->ifa_next)) {
 367                if (ifa1->ifa_local == ifa->ifa_local)
 368                        return -EEXIST;
 369        }
 370
 371        if (dev->type == ARPHRD_ETHER) {
 372                if (ifa->ifa_local != dn_eth2dn(dev->dev_addr)) {
 373                        dn_dn2eth(mac_addr, ifa->ifa_local);
 374                        dev_mc_add(dev, mac_addr);
 375                }
 376        }
 377
 378        ifa->ifa_next = dn_db->ifa_list;
 379        rcu_assign_pointer(dn_db->ifa_list, ifa);
 380
 381        dn_ifaddr_notify(RTM_NEWADDR, ifa);
 382        blocking_notifier_call_chain(&dnaddr_chain, NETDEV_UP, ifa);
 383
 384        return 0;
 385}
 386
 387static int dn_dev_set_ifa(struct net_device *dev, struct dn_ifaddr *ifa)
 388{
 389        struct dn_dev *dn_db = rtnl_dereference(dev->dn_ptr);
 390        int rv;
 391
 392        if (dn_db == NULL) {
 393                int err;
 394                dn_db = dn_dev_create(dev, &err);
 395                if (dn_db == NULL)
 396                        return err;
 397        }
 398
 399        ifa->ifa_dev = dn_db;
 400
 401        if (dev->flags & IFF_LOOPBACK)
 402                ifa->ifa_scope = RT_SCOPE_HOST;
 403
 404        rv = dn_dev_insert_ifa(dn_db, ifa);
 405        if (rv)
 406                dn_dev_free_ifa(ifa);
 407        return rv;
 408}
 409
 410
 411int dn_dev_ioctl(unsigned int cmd, void __user *arg)
 412{
 413        char buffer[DN_IFREQ_SIZE];
 414        struct ifreq *ifr = (struct ifreq *)buffer;
 415        struct sockaddr_dn *sdn = (struct sockaddr_dn *)&ifr->ifr_addr;
 416        struct dn_dev *dn_db;
 417        struct net_device *dev;
 418        struct dn_ifaddr *ifa = NULL;
 419        struct dn_ifaddr __rcu **ifap = NULL;
 420        int ret = 0;
 421
 422        if (copy_from_user(ifr, arg, DN_IFREQ_SIZE))
 423                return -EFAULT;
 424        ifr->ifr_name[IFNAMSIZ-1] = 0;
 425
 426        dev_load(&init_net, ifr->ifr_name);
 427
 428        switch (cmd) {
 429        case SIOCGIFADDR:
 430                break;
 431        case SIOCSIFADDR:
 432                if (!capable(CAP_NET_ADMIN))
 433                        return -EACCES;
 434                if (sdn->sdn_family != AF_DECnet)
 435                        return -EINVAL;
 436                break;
 437        default:
 438                return -EINVAL;
 439        }
 440
 441        rtnl_lock();
 442
 443        if ((dev = __dev_get_by_name(&init_net, ifr->ifr_name)) == NULL) {
 444                ret = -ENODEV;
 445                goto done;
 446        }
 447
 448        if ((dn_db = rtnl_dereference(dev->dn_ptr)) != NULL) {
 449                for (ifap = &dn_db->ifa_list;
 450                     (ifa = rtnl_dereference(*ifap)) != NULL;
 451                     ifap = &ifa->ifa_next)
 452                        if (strcmp(ifr->ifr_name, ifa->ifa_label) == 0)
 453                                break;
 454        }
 455
 456        if (ifa == NULL && cmd != SIOCSIFADDR) {
 457                ret = -EADDRNOTAVAIL;
 458                goto done;
 459        }
 460
 461        switch (cmd) {
 462        case SIOCGIFADDR:
 463                *((__le16 *)sdn->sdn_nodeaddr) = ifa->ifa_local;
 464                goto rarok;
 465
 466        case SIOCSIFADDR:
 467                if (!ifa) {
 468                        if ((ifa = dn_dev_alloc_ifa()) == NULL) {
 469                                ret = -ENOBUFS;
 470                                break;
 471                        }
 472                        memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
 473                } else {
 474                        if (ifa->ifa_local == dn_saddr2dn(sdn))
 475                                break;
 476                        dn_dev_del_ifa(dn_db, ifap, 0);
 477                }
 478
 479                ifa->ifa_local = ifa->ifa_address = dn_saddr2dn(sdn);
 480
 481                ret = dn_dev_set_ifa(dev, ifa);
 482        }
 483done:
 484        rtnl_unlock();
 485
 486        return ret;
 487rarok:
 488        if (copy_to_user(arg, ifr, DN_IFREQ_SIZE))
 489                ret = -EFAULT;
 490        goto done;
 491}
 492
 493struct net_device *dn_dev_get_default(void)
 494{
 495        struct net_device *dev;
 496
 497        spin_lock(&dndev_lock);
 498        dev = decnet_default_device;
 499        if (dev) {
 500                if (dev->dn_ptr)
 501                        dev_hold(dev);
 502                else
 503                        dev = NULL;
 504        }
 505        spin_unlock(&dndev_lock);
 506
 507        return dev;
 508}
 509
 510int dn_dev_set_default(struct net_device *dev, int force)
 511{
 512        struct net_device *old = NULL;
 513        int rv = -EBUSY;
 514        if (!dev->dn_ptr)
 515                return -ENODEV;
 516
 517        spin_lock(&dndev_lock);
 518        if (force || decnet_default_device == NULL) {
 519                old = decnet_default_device;
 520                decnet_default_device = dev;
 521                rv = 0;
 522        }
 523        spin_unlock(&dndev_lock);
 524
 525        if (old)
 526                dev_put(old);
 527        return rv;
 528}
 529
 530static void dn_dev_check_default(struct net_device *dev)
 531{
 532        spin_lock(&dndev_lock);
 533        if (dev == decnet_default_device) {
 534                decnet_default_device = NULL;
 535        } else {
 536                dev = NULL;
 537        }
 538        spin_unlock(&dndev_lock);
 539
 540        if (dev)
 541                dev_put(dev);
 542}
 543
 544/*
 545 * Called with RTNL
 546 */
 547static struct dn_dev *dn_dev_by_index(int ifindex)
 548{
 549        struct net_device *dev;
 550        struct dn_dev *dn_dev = NULL;
 551
 552        dev = __dev_get_by_index(&init_net, ifindex);
 553        if (dev)
 554                dn_dev = rtnl_dereference(dev->dn_ptr);
 555
 556        return dn_dev;
 557}
 558
 559static const struct nla_policy dn_ifa_policy[IFA_MAX+1] = {
 560        [IFA_ADDRESS]           = { .type = NLA_U16 },
 561        [IFA_LOCAL]             = { .type = NLA_U16 },
 562        [IFA_LABEL]             = { .type = NLA_STRING,
 563                                    .len = IFNAMSIZ - 1 },
 564};
 565
 566static int dn_nl_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
 567{
 568        struct net *net = sock_net(skb->sk);
 569        struct nlattr *tb[IFA_MAX+1];
 570        struct dn_dev *dn_db;
 571        struct ifaddrmsg *ifm;
 572        struct dn_ifaddr *ifa;
 573        struct dn_ifaddr __rcu **ifap;
 574        int err = -EINVAL;
 575
 576        if (!net_eq(net, &init_net))
 577                goto errout;
 578
 579        err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, dn_ifa_policy);
 580        if (err < 0)
 581                goto errout;
 582
 583        err = -ENODEV;
 584        ifm = nlmsg_data(nlh);
 585        if ((dn_db = dn_dev_by_index(ifm->ifa_index)) == NULL)
 586                goto errout;
 587
 588        err = -EADDRNOTAVAIL;
 589        for (ifap = &dn_db->ifa_list;
 590             (ifa = rtnl_dereference(*ifap)) != NULL;
 591             ifap = &ifa->ifa_next) {
 592                if (tb[IFA_LOCAL] &&
 593                    nla_memcmp(tb[IFA_LOCAL], &ifa->ifa_local, 2))
 594                        continue;
 595
 596                if (tb[IFA_LABEL] && nla_strcmp(tb[IFA_LABEL], ifa->ifa_label))
 597                        continue;
 598
 599                dn_dev_del_ifa(dn_db, ifap, 1);
 600                return 0;
 601        }
 602
 603errout:
 604        return err;
 605}
 606
 607static int dn_nl_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
 608{
 609        struct net *net = sock_net(skb->sk);
 610        struct nlattr *tb[IFA_MAX+1];
 611        struct net_device *dev;
 612        struct dn_dev *dn_db;
 613        struct ifaddrmsg *ifm;
 614        struct dn_ifaddr *ifa;
 615        int err;
 616
 617        if (!net_eq(net, &init_net))
 618                return -EINVAL;
 619
 620        err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, dn_ifa_policy);
 621        if (err < 0)
 622                return err;
 623
 624        if (tb[IFA_LOCAL] == NULL)
 625                return -EINVAL;
 626
 627        ifm = nlmsg_data(nlh);
 628        if ((dev = __dev_get_by_index(&init_net, ifm->ifa_index)) == NULL)
 629                return -ENODEV;
 630
 631        if ((dn_db = rtnl_dereference(dev->dn_ptr)) == NULL) {
 632                dn_db = dn_dev_create(dev, &err);
 633                if (!dn_db)
 634                        return err;
 635        }
 636
 637        if ((ifa = dn_dev_alloc_ifa()) == NULL)
 638                return -ENOBUFS;
 639
 640        if (tb[IFA_ADDRESS] == NULL)
 641                tb[IFA_ADDRESS] = tb[IFA_LOCAL];
 642
 643        ifa->ifa_local = nla_get_le16(tb[IFA_LOCAL]);
 644        ifa->ifa_address = nla_get_le16(tb[IFA_ADDRESS]);
 645        ifa->ifa_flags = ifm->ifa_flags;
 646        ifa->ifa_scope = ifm->ifa_scope;
 647        ifa->ifa_dev = dn_db;
 648
 649        if (tb[IFA_LABEL])
 650                nla_strlcpy(ifa->ifa_label, tb[IFA_LABEL], IFNAMSIZ);
 651        else
 652                memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
 653
 654        err = dn_dev_insert_ifa(dn_db, ifa);
 655        if (err)
 656                dn_dev_free_ifa(ifa);
 657
 658        return err;
 659}
 660
 661static inline size_t dn_ifaddr_nlmsg_size(void)
 662{
 663        return NLMSG_ALIGN(sizeof(struct ifaddrmsg))
 664               + nla_total_size(IFNAMSIZ) /* IFA_LABEL */
 665               + nla_total_size(2) /* IFA_ADDRESS */
 666               + nla_total_size(2); /* IFA_LOCAL */
 667}
 668
 669static int dn_nl_fill_ifaddr(struct sk_buff *skb, struct dn_ifaddr *ifa,
 670                             u32 portid, u32 seq, int event, unsigned int flags)
 671{
 672        struct ifaddrmsg *ifm;
 673        struct nlmsghdr *nlh;
 674
 675        nlh = nlmsg_put(skb, portid, seq, event, sizeof(*ifm), flags);
 676        if (nlh == NULL)
 677                return -EMSGSIZE;
 678
 679        ifm = nlmsg_data(nlh);
 680        ifm->ifa_family = AF_DECnet;
 681        ifm->ifa_prefixlen = 16;
 682        ifm->ifa_flags = ifa->ifa_flags | IFA_F_PERMANENT;
 683        ifm->ifa_scope = ifa->ifa_scope;
 684        ifm->ifa_index = ifa->ifa_dev->dev->ifindex;
 685
 686        if ((ifa->ifa_address &&
 687             nla_put_le16(skb, IFA_ADDRESS, ifa->ifa_address)) ||
 688            (ifa->ifa_local &&
 689             nla_put_le16(skb, IFA_LOCAL, ifa->ifa_local)) ||
 690            (ifa->ifa_label[0] &&
 691             nla_put_string(skb, IFA_LABEL, ifa->ifa_label)))
 692                goto nla_put_failure;
 693        return nlmsg_end(skb, nlh);
 694
 695nla_put_failure:
 696        nlmsg_cancel(skb, nlh);
 697        return -EMSGSIZE;
 698}
 699
 700static void dn_ifaddr_notify(int event, struct dn_ifaddr *ifa)
 701{
 702        struct sk_buff *skb;
 703        int err = -ENOBUFS;
 704
 705        skb = alloc_skb(dn_ifaddr_nlmsg_size(), GFP_KERNEL);
 706        if (skb == NULL)
 707                goto errout;
 708
 709        err = dn_nl_fill_ifaddr(skb, ifa, 0, 0, event, 0);
 710        if (err < 0) {
 711                /* -EMSGSIZE implies BUG in dn_ifaddr_nlmsg_size() */
 712                WARN_ON(err == -EMSGSIZE);
 713                kfree_skb(skb);
 714                goto errout;
 715        }
 716        rtnl_notify(skb, &init_net, 0, RTNLGRP_DECnet_IFADDR, NULL, GFP_KERNEL);
 717        return;
 718errout:
 719        if (err < 0)
 720                rtnl_set_sk_err(&init_net, RTNLGRP_DECnet_IFADDR, err);
 721}
 722
 723static int dn_nl_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
 724{
 725        struct net *net = sock_net(skb->sk);
 726        int idx, dn_idx = 0, skip_ndevs, skip_naddr;
 727        struct net_device *dev;
 728        struct dn_dev *dn_db;
 729        struct dn_ifaddr *ifa;
 730
 731        if (!net_eq(net, &init_net))
 732                return 0;
 733
 734        skip_ndevs = cb->args[0];
 735        skip_naddr = cb->args[1];
 736
 737        idx = 0;
 738        rcu_read_lock();
 739        for_each_netdev_rcu(&init_net, dev) {
 740                if (idx < skip_ndevs)
 741                        goto cont;
 742                else if (idx > skip_ndevs) {
 743                        /* Only skip over addresses for first dev dumped
 744                         * in this iteration (idx == skip_ndevs) */
 745                        skip_naddr = 0;
 746                }
 747
 748                if ((dn_db = rcu_dereference(dev->dn_ptr)) == NULL)
 749                        goto cont;
 750
 751                for (ifa = rcu_dereference(dn_db->ifa_list), dn_idx = 0; ifa;
 752                     ifa = rcu_dereference(ifa->ifa_next), dn_idx++) {
 753                        if (dn_idx < skip_naddr)
 754                                continue;
 755
 756                        if (dn_nl_fill_ifaddr(skb, ifa, NETLINK_CB(cb->skb).portid,
 757                                              cb->nlh->nlmsg_seq, RTM_NEWADDR,
 758                                              NLM_F_MULTI) < 0)
 759                                goto done;
 760                }
 761cont:
 762                idx++;
 763        }
 764done:
 765        rcu_read_unlock();
 766        cb->args[0] = idx;
 767        cb->args[1] = dn_idx;
 768
 769        return skb->len;
 770}
 771
 772static int dn_dev_get_first(struct net_device *dev, __le16 *addr)
 773{
 774        struct dn_dev *dn_db;
 775        struct dn_ifaddr *ifa;
 776        int rv = -ENODEV;
 777
 778        rcu_read_lock();
 779        dn_db = rcu_dereference(dev->dn_ptr);
 780        if (dn_db == NULL)
 781                goto out;
 782
 783        ifa = rcu_dereference(dn_db->ifa_list);
 784        if (ifa != NULL) {
 785                *addr = ifa->ifa_local;
 786                rv = 0;
 787        }
 788out:
 789        rcu_read_unlock();
 790        return rv;
 791}
 792
 793/*
 794 * Find a default address to bind to.
 795 *
 796 * This is one of those areas where the initial VMS concepts don't really
 797 * map onto the Linux concepts, and since we introduced multiple addresses
 798 * per interface we have to cope with slightly odd ways of finding out what
 799 * "our address" really is. Mostly it's not a problem; for this we just guess
 800 * a sensible default. Eventually the routing code will take care of all the
 801 * nasties for us I hope.
 802 */
 803int dn_dev_bind_default(__le16 *addr)
 804{
 805        struct net_device *dev;
 806        int rv;
 807        dev = dn_dev_get_default();
 808last_chance:
 809        if (dev) {
 810                rv = dn_dev_get_first(dev, addr);
 811                dev_put(dev);
 812                if (rv == 0 || dev == init_net.loopback_dev)
 813                        return rv;
 814        }
 815        dev = init_net.loopback_dev;
 816        dev_hold(dev);
 817        goto last_chance;
 818}
 819
 820static void dn_send_endnode_hello(struct net_device *dev, struct dn_ifaddr *ifa)
 821{
 822        struct endnode_hello_message *msg;
 823        struct sk_buff *skb = NULL;
 824        __le16 *pktlen;
 825        struct dn_dev *dn_db = rcu_dereference_raw(dev->dn_ptr);
 826
 827        if ((skb = dn_alloc_skb(NULL, sizeof(*msg), GFP_ATOMIC)) == NULL)
 828                return;
 829
 830        skb->dev = dev;
 831
 832        msg = (struct endnode_hello_message *)skb_put(skb,sizeof(*msg));
 833
 834        msg->msgflg  = 0x0D;
 835        memcpy(msg->tiver, dn_eco_version, 3);
 836        dn_dn2eth(msg->id, ifa->ifa_local);
 837        msg->iinfo   = DN_RT_INFO_ENDN;
 838        msg->blksize = cpu_to_le16(mtu2blksize(dev));
 839        msg->area    = 0x00;
 840        memset(msg->seed, 0, 8);
 841        memcpy(msg->neighbor, dn_hiord, ETH_ALEN);
 842
 843        if (dn_db->router) {
 844                struct dn_neigh *dn = (struct dn_neigh *)dn_db->router;
 845                dn_dn2eth(msg->neighbor, dn->addr);
 846        }
 847
 848        msg->timer   = cpu_to_le16((unsigned short)dn_db->parms.t3);
 849        msg->mpd     = 0x00;
 850        msg->datalen = 0x02;
 851        memset(msg->data, 0xAA, 2);
 852
 853        pktlen = (__le16 *)skb_push(skb,2);
 854        *pktlen = cpu_to_le16(skb->len - 2);
 855
 856        skb_reset_network_header(skb);
 857
 858        dn_rt_finish_output(skb, dn_rt_all_rt_mcast, msg->id);
 859}
 860
 861
 862#define DRDELAY (5 * HZ)
 863
 864static int dn_am_i_a_router(struct dn_neigh *dn, struct dn_dev *dn_db, struct dn_ifaddr *ifa)
 865{
 866        /* First check time since device went up */
 867        if ((jiffies - dn_db->uptime) < DRDELAY)
 868                return 0;
 869
 870        /* If there is no router, then yes... */
 871        if (!dn_db->router)
 872                return 1;
 873
 874        /* otherwise only if we have a higher priority or.. */
 875        if (dn->priority < dn_db->parms.priority)
 876                return 1;
 877
 878        /* if we have equal priority and a higher node number */
 879        if (dn->priority != dn_db->parms.priority)
 880                return 0;
 881
 882        if (le16_to_cpu(dn->addr) < le16_to_cpu(ifa->ifa_local))
 883                return 1;
 884
 885        return 0;
 886}
 887
 888static void dn_send_router_hello(struct net_device *dev, struct dn_ifaddr *ifa)
 889{
 890        int n;
 891        struct dn_dev *dn_db = rcu_dereference_raw(dev->dn_ptr);
 892        struct dn_neigh *dn = (struct dn_neigh *)dn_db->router;
 893        struct sk_buff *skb;
 894        size_t size;
 895        unsigned char *ptr;
 896        unsigned char *i1, *i2;
 897        __le16 *pktlen;
 898        char *src;
 899
 900        if (mtu2blksize(dev) < (26 + 7))
 901                return;
 902
 903        n = mtu2blksize(dev) - 26;
 904        n /= 7;
 905
 906        if (n > 32)
 907                n = 32;
 908
 909        size = 2 + 26 + 7 * n;
 910
 911        if ((skb = dn_alloc_skb(NULL, size, GFP_ATOMIC)) == NULL)
 912                return;
 913
 914        skb->dev = dev;
 915        ptr = skb_put(skb, size);
 916
 917        *ptr++ = DN_RT_PKT_CNTL | DN_RT_PKT_ERTH;
 918        *ptr++ = 2; /* ECO */
 919        *ptr++ = 0;
 920        *ptr++ = 0;
 921        dn_dn2eth(ptr, ifa->ifa_local);
 922        src = ptr;
 923        ptr += ETH_ALEN;
 924        *ptr++ = dn_db->parms.forwarding == 1 ?
 925                        DN_RT_INFO_L1RT : DN_RT_INFO_L2RT;
 926        *((__le16 *)ptr) = cpu_to_le16(mtu2blksize(dev));
 927        ptr += 2;
 928        *ptr++ = dn_db->parms.priority; /* Priority */
 929        *ptr++ = 0; /* Area: Reserved */
 930        *((__le16 *)ptr) = cpu_to_le16((unsigned short)dn_db->parms.t3);
 931        ptr += 2;
 932        *ptr++ = 0; /* MPD: Reserved */
 933        i1 = ptr++;
 934        memset(ptr, 0, 7); /* Name: Reserved */
 935        ptr += 7;
 936        i2 = ptr++;
 937
 938        n = dn_neigh_elist(dev, ptr, n);
 939
 940        *i2 = 7 * n;
 941        *i1 = 8 + *i2;
 942
 943        skb_trim(skb, (27 + *i2));
 944
 945        pktlen = (__le16 *)skb_push(skb, 2);
 946        *pktlen = cpu_to_le16(skb->len - 2);
 947
 948        skb_reset_network_header(skb);
 949
 950        if (dn_am_i_a_router(dn, dn_db, ifa)) {
 951                struct sk_buff *skb2 = skb_copy(skb, GFP_ATOMIC);
 952                if (skb2) {
 953                        dn_rt_finish_output(skb2, dn_rt_all_end_mcast, src);
 954                }
 955        }
 956
 957        dn_rt_finish_output(skb, dn_rt_all_rt_mcast, src);
 958}
 959
 960static void dn_send_brd_hello(struct net_device *dev, struct dn_ifaddr *ifa)
 961{
 962        struct dn_dev *dn_db = rcu_dereference_raw(dev->dn_ptr);
 963
 964        if (dn_db->parms.forwarding == 0)
 965                dn_send_endnode_hello(dev, ifa);
 966        else
 967                dn_send_router_hello(dev, ifa);
 968}
 969
 970static void dn_send_ptp_hello(struct net_device *dev, struct dn_ifaddr *ifa)
 971{
 972        int tdlen = 16;
 973        int size = dev->hard_header_len + 2 + 4 + tdlen;
 974        struct sk_buff *skb = dn_alloc_skb(NULL, size, GFP_ATOMIC);
 975        int i;
 976        unsigned char *ptr;
 977        char src[ETH_ALEN];
 978
 979        if (skb == NULL)
 980                return ;
dn_dbdec1
/* Ar3uter" class="sref">38t/decnet/dn_dev.c#L943" id="L943f="+code=__le16" class="sref">__le16 *)        int size = dev->,     9           return 1;
 915        ptr = hard_header_ze,  884
 8859/a>        return 0;
 917        * 886}
 930        *((__le16(ptr, if="+code=sk_buff" cl id="L962" clas" class="name="L887"> 887
 931        ifa)
e=hard_header_len" class="sref">hard_header_len + 2 + 4 +  889{
n;
 932lt; dn->hard_header_l32lt; skb == dn_ptr);
 25"> 931        router;
skb;
 921        dn_dn2eth(ptr, ifa->size;
 957        dn_rt_finish_output(skb, dn_rt_all_rt_mcast, ptr;
i2;
pktlen;
 9_upe=skb" class="sref> 9_up href="+code=dn_send_ptp_hello" class="sref">dn_send_ptp_hello(struct skb == src;
src;
10ss/decnet/dn_dev.c#L962" id="L962" class="line" name="L962"> 962        struct dn_dev *dn_db = rcu_dereference_raw(/pre>t/dn_dev.c#L889" id="L889" cla10s1="line"10sclass="sref">n;
10st/decnet/dn_dev.c#L981" id="L981" cl10s2="line"10s"sref">dn_ptr);
10st/decnet/dn_dev.c#L882" id="L882" class="line" name="L964"> 964        if (dn_db->parms.router;
dn_send_router_helloa>(skb2, skb;
10st/decnet/dn_dev.c#L966" id="L966" class="line" n10s5="line"10sss="sref">size;
10st/decnet/dn_dev.c#L965" id="L965" clanc, <_adde=neighbor" clasnc, <_add"+code=dn_send_router_hello" class="sref">dn_send_router_helloa>(skb, , ptr;
10st/decnet/dn_dev.c#L956" id="L956" cl10s7="line"10slass="sref">i2;
10st/decnet/dn_dev.c#L957" id="L95="+code=jiffies" class="sref">jiffies -  972, pktlen;
src;
10st/decnet/dn_dev.c#L885" id="L885" class="line" name="101s="line"10 class="sref">n;
10 c/decnet/dn_dev.c#L886" id="L886" cla10 1="line"10name="L910"> 910
10 t/decnet/dn_dev.c#L981" id="L981" cl1012="line"10ass="sref">NULL)
10 2/decnet/dn_dev.c#L970" id="L970" c> 9_dowde=tiver" class="sre 9_dowd href="+code=dn_send_ptp_hello" class="sref">dn_send_ptp_hello(struct skb == 10 3/decnet/dn_dev.c#L889" id="L889" cla1014="line"10name="L913"> 913
10 t/decnet/dn_dev.c#L974" id="L974" class="line" name="L962"> 962        struct dn_dev *dn_db = rcu_dereference_raw(/dn_dev.c#L889" id="L889" cla1015="line"10lass="sref">dev;
10 t/decnet/dn_dev.c#L905" id="L905" cl10 6="line"10ss="sref">size);
10 t/decnet/dn_dev.c#L906" id="L906" class="line" name="L964"> 964        if (dn_db->parms. 916
10 t/decnet/dn_dev.c#L967" id="L967" clanc, <_def="+code=ifa" clanc, <_def"+code=dn_send_router_hello" class="sref">dn_send_router_helloa>(skb2, DN_RT_PKT_ERTH;
DN>10 t/decnet/dn_dev.c#L966" id="L966" class="line" n1019="line"10nt">/* ECO */
10 9/decnet/dn_dev.c#L967" id="L967" clanc, <_def="+code=ifa" clanc, <_def"+code=dn_send_router_hello" class="sref">dn_send_router_helloa>(skb, , ptr++ = 0;
10sr/decnet/dn_dev.c#L886" id="L886" cla1021="line"10sref">ptr++ = 0;
10st/decnet/dn_dev.c#L981" id="L981" cl1022="line"10ref">ifa_local);
10s2/decnet/dn_dev.c#L970" id="L970" canc,  dn_send_ptp_hello(struct ptr;
10st/decnet/dn_dev.c#L963" id="L963" cl10s4="line"10"sref">ETH_ALEN;
10s4/decnet/dn_dev.c#L970" id="L970" canc,  skb ==  == 1 ?
10st/decnet/dn_dev.c#L865" id="L865" cla10s6="line"10DN_RT_INFO_L2RT;
10s6/decnet/dn_dev.c#L974" id="L974" cllo" class="sref">dn_send_ptp_hello(struct dn_neigh *dn_send_ptp_hello(s/a>        *((, dev));
10s7/decnet/dn_dev.c#L974" id="L974" class="line" name="L962"> 962        struct ptr += 2;
10s8/decnet/dn_dev.c#L974" id="L974" clasef="+code=dev" class="sref">dev, struct , 
10st/decnet/dn_dev.c#L969" id="L969" cl103s="line"10: Reserved */
10: /decnet/dn_dev.c#L957" id=">dn_read="srkb" class="sref">dn_read="srk hrefsrt_all_rt_mcast, t3);
10:t/decnet/dn_dev.c#L921" id="L921ef="+code=dn_dev" class="sref">dn_dev *dn_db = rcu_dereference_raw(/dn_dev.c#L889" id="L889" cla1032="line"10"sref">ptr += 2;
10:t/decnet/dn_dev.c#L882" id="L882" class="line" name="L964"> 964        if ( 928        *ptr++ = dn_db->utput" class="srt2                if (
10:t/decnet/dn_dev.c#L95ev.c#L906" id="L906" class="line" name="L964"> 964        if (dn_db-&g  ptr++;
10:t/decnet/dn_dev.c#L9555555555las.c#L906" id="L906="+code=dn_ifaddr" class=sref">dn_dev *dn_db =  964        if (/dn_dev.c#L889" id="L889" cla1035="line"10: Reserved */
10:t/decnet/dn_dev.c#L925" id="L/dn_dev.c#L921" id="="+code=dn_ifaddr" class=rt_all_rt_mcast, ptr += 7;
10:t/decnet/dn_dev.c#L875" id="L/dn_dev.c#L921" id="="+code=dn_ifaddr" class=sref">dn_dev *dn_db = (ptr, ptr++;
10:t/decnet/dn_dev.c#L96net/dn_dev.c#L95ev.c!code=rcu_derefer(ptr,  937
10:t/decnet/dn_dev.c#L86n_dev.c#L875" id="L/dn_dev.c#L921" id="" class="line" name="L964"> 964        if (dn_db-&g  dn_send_router_hello(dev, n);
10:9/decnet/dn_dev.c#L9666666666net/dn_dev.c#L886" id="L886" cla104s="line"10name="L939"> 939
10na/decnet/dn_dev.c#L96net/dn_dev.c#L886" id="L886" cla1041="line"10 class="sref">n;
10nt/decnet/dn_dev.c#L95#L882" id="L882" class="line" name="L964"> 964        if ( 928        *ptr++ = dn_db->dev, i2;
10nt/decnet/dn_d}dev.c               if ( 942
10nt/decnet/dn_dev.c#L95ode=rcu_derefere class="line" name="L964"> 964        if ( 928        *ptr++ = dn_db->utput" class="srt2lass="sref">dev, i2));
10nt/decnet/dn_dnet/dn_dev.c#L886" id="L886" cla1045="line"10name="L944"> 944
10nt/decnet/dn_dev.c#L945" id=">dn_read=un"srkb" class="sref">dn_read=un"srk hrefsrt_all_rt_mcast, skb, 2);
len - 2);
10n7/decnet/dn_dev.c#L886" id="L886" cla1048="line"10name="L947"> 947
10nt/decnet/dn_dev.c#L978" id="L978" cl1049="line"10ass="sref">skb);
10n9/decnet/dn_dev.c#L970" id="L970" canc,  dn_send_ptp_hello(struct  949
10na/decnet/dn_dev.c#L865" id="L865" cla1051="line"10s="sref">ifa)) {
 891        struct dn_dev *dn_db = rcu_dereference_raw(/dn_dev.c#L889" id="L889" cla1052="line"10ef">GFP_ATOMIC);
10nt/decnet/dn_dev.c#L942" id="L942" cl10n3="line"10s="sref">skb2) {
 964        if (dn_db-&g utput" class="srt2L906"> 928        *ptr++ = dn_db->src);
10nt/decnet/dn_dev.c#L95#L906" id="L906" class="line" name="L964"> 964        if (dn_db-&g utput" class="srt2L"> 928        *ptr++ = dn_db->dev,                 }
>10nt/decnet/dn_dev.c#L905" id="L905" cl1056="line"105"> 955        }
>10nt/decnet/dn_dev.c#L936" id="" caass="line" name="L964"> 964        if (dn_db-&gdata>( 956
10nt/decnet/dn_dev.c#L957" id="L95="+code=jiffies" class="sref">jiffies - dn_db-&gfun_tiode=tiver" class=fun_tiodL"> 928        *src);
10nt/decnet/dn_dev.c#L948" id="L95="+code=jiffies" class="sref">jiffies - dn_db-&gexpiref="+code=dn_db" expirefL"> 928       jiffief="+code=dn_db" jiffiefL+.c#L906" id="L906" class="line" name="L964"> 964        if (dn_db-&g utput" class="srt2L"> 940       HZtput" class="srHZ="sref">/dn_dev.c#L889" id="L889" cla1059="line"10ame="L958"> 958}
10nt/decnet/dn_dev.c#L969" id="L969" cl106s="line"10name="L959"> 959
10na/decnet/dn_dev.c#L948" id="adda  jiffies - /dn_dev.c#L889" id="L889" cla1061="line"10lass="sref">ifa)
10n1/decnet/dn_dev.c#L886" id="L886" cla1062="line"10ame="L961"> 961{
10nt/decnet/dn_dev.c#L942" id="L942" cl1063="line"10="sref">dn_ptr);
 891        struct  8n4d_ptp_hello("L891"> 8n4d_p_hello" class="sref">dn_send_ptp_hello(struct  9_uet_device" classerreef">/dn_dev.c#err id="L978" cl1054="line"10ass="sref">s6c);
ifa6      }
 975        int dn_se"L891">ss="sref">dn_db-"L891">ss="sode=net_device" classup href="+code=dp*n = 
 962        struct ptr);
s658}
 932lt; dn->hard_hDN_DEV_LIST_SIZEref">dn->DN_DEV_LIST_SIZE, skb == pt7959
(struct size = (struct s7fa)
ptr{
ptr);
ETH_A7c);
/dn_dev.c#err id=cla-ss="line" name=ENODEVeef">/dn_dev.c#ENODEV, ptrdn->DN_DEV_LIST_SIZE, s7      }
skb == ptr
pkt);
/dn_dev.c#err id=cla-ss="line" name=ENOBUFSeef">/dn_dev.c#ENOBUFS ptr}
 964        if (dn_se> 962        struct size, GFP_ATOMIC)) == N108959
skb == ptr)
ifa_loc861{
dn_dbdec1
skb2 =memc"s="L95="+code=jiffies" class="sref">jiffies - dn_db-&g utput"a href="+code=dev"p href="+code=dp*dn_se> 962<>ss="sref">dn_db-"L891">ss="sode=*i);
38t/decnet/dn_devETH_A8c);
/dn_dev.c#code"98ign_poasshre_raw" class="sref">rcu_dereference_raw(/dn_dev.c#L889" id=(dn, ijiffies - dn_neigh *8      }
jiffies - /dn_dev.c#L889" id="L889" cla1061="line"10lass="sref">8956
pkt);
jiffies - jiffiesL+.c#L906" id="L906" clL889" cla1061="line"10lass="sref">858}
9959
jiffies - dn_db-"+codess="siffief="+code=dn_db" j"+codess="s_f="+c964        "+codess="s_f="+ce_raw" class="sref">rcu_dereference_raw(<, ="+code=jiffies" class="+codetabld_ptp_hello("L8"+codetabld id="L889" cla1061="line"10lass="sref">9fa)
jiffies - dn_db-"+codess="siffihref="+code10:7="line"10ss="sref">pt961{
dn_db-RCU_INIT_POINTERe_raw" class="sref">rcu_dereference_raw(/dn_dev.c#L889" id=(GFP_ATOMIC)) == 9r);
r" class="sref">dn, i);
skb == ptr 955 
 964        if (dn_db-&g utput" class="srt2_up href="+code=dptp_hehref="+code10:7="line"10ss="sref">pt9c);
 964        if (dn_db-&g utput" class="srt2_up href="+code=dptp_heet_device" class="srt_all_rt_mcast, pt958}
dn, dn_db-"+codess="siffih href="+c1028="line"10"sref">ptr<1src;
<1 10ss=>10ss/decnet/dn_dev1c#L9610hid="L/dn_dev.c#L921"L95="+code=jiffies" clascu_dereference_raw(/dn_dev.c#L889" id=ef="+code=dn_db" jclass="sref">skb == ptr<1">n;
<1 10scl>10st/decnet/dn_dev1c#L9810882" id="L882" class========="line" name="L9kfred_ptp_hello(kfrede_raw" class="sref">r" class="sref">dn, i<1tr);
<1 10s"s>10st/decnet/dn_dev1c#L8810.c#L932" id="L932" cl" class=ass="lif=HELO" class="class="sref">skb == ptr<1ter;
<1 10s=">10st/decnet/dn_dev1c#L951de=rcu_dereferenc, <_aass="line" name="L955"> 955 <1skb;
<1 10sas>10st/decnet/dn_dev1c#L9610.c#L886" id="L886" cla1045="line"10name="L944"1ize;
<1 10sss>10st/decnet/dn_dev1c#L9610 id="L905" cl1056="line"105"> 9551ptr;
<1 10sas>10st/decnet/dn_dev1c#L9510 id="" canc,  rcu_dereference_raw(<, ="+code=jiffies" class=> 964        if (dn_db-&g utput"i<1t7r;
<1 9ref="99t/decnet/dn_dev<1c#L9510 id="L947" clatlen" cla9s="sref">pkt<1len;
<1 10s=">10st/decnet/dn_dev1c#L9710 id="L95="+code=jiffies" class="=msg" canc,  len<1src;
<1 10sas>10st/decnet/dn_dev1c#L8810 id="L969" cl106s="line"10name="L959"1">n;
<1 10 cl>10 c/decnet/dn_dev1c#L8811 id="L940" class="line" name=erreef">/dn_dev.c#err id=clane" name="101s="line"10 class="sre1 910
<1 10nam>10 t/decnet/dn_dev1c#L9811882" id="L882ass="lif=HELO" class="lass="rt_all_rt_mcast, ptr<1ULL)
<1 10ass>10 2/decnet/dn_dev1c#L971" id="L886" cla1045="line"10name="L944"1 return;
<1 10   >10 3/decnet/dn_dev1c#L8811 id="L963" cl10s4="line"10"sref">ETH_1 913
<1 10nam>10 t/decnet/dn_dev1c#L9711 id="L944" class="line" name="L944">711ze;
<1 10las>10 t/decnet/dn_dev1c#L901" id="10 tcomment">/*711tr;
<1 10ss=>10 t/decnet/dn_dev1c#L901" id="10 tcomment"> * This processes a ef="+c up event. We only start ptp_span"L944" class="line" name="L944">7117r;
<1 10nam>10 t/decnet/dn_dev1c#L961" id="10 tcomment"> * the loopback ef="+c A_F_SEether" n ef="+cs with correctp_span"L944" class="line" name="L944">711en;
<1 10>DN>10 t/decnet/dn_dev1c#L961" id="10 tcomment"> * MAC ef="esses autom1" cally. Others must be startedp_span"L944" class="line" name="L944">711rc;
<1 10nt">10 9/decnet/dn_dev1c#L961" id="10 tcomment"> * specif cally.p_span"L944" class="line" name="L944">71>++ = 0;
<1 10sre>10sr/decnet/dn_dev1c#L881" id="10 tcomment"> *p_span"L944" class="line" name="L944">71>910
<1 10sre>10st/decnet/dn_dev1c#L981" id="10 tcomment"> * FIXME: How should we configure the loopback ef="ess ? If we could dispensl="span"L944" class="line" name="L944">71>LL)
<1 10ref>10s2/decnet/dn_dev1c#L971" id="10 tcomment"> * with using ine" n_ef="ess here and+codeautobind, it will be one less th"+codspan"L944" class="line" name="L944">71>return;
<1 10las>10st/decnet/dn_dev1c#L961" id="10 tcomment"> * codeusers to worry about hreting up.p_span"L944" class="line" name="L944">71>913
<1 10"sr>10s4/decnet/dn_dev1c#L971" id="10 tcomment"> */p_span"L944" class="line" name="L944">71>ze;
<1 10orw>10st/decnet/dn_dev1c#L8612 id="L905" cl1056="line"105"> 95512RT;
<1 10DN_>10s6/decnet/dn_dev1c#L971" id="anc,  dn_send_ptp_hello(struct ));
<1 10ss=>10s7/decnet/dn_dev1c#L971" id="ef="+code10:7="line"10ss="sref">p1a> += 2;
<1 10"sr>10s8/decnet/dn_dev1c#L971" id="L974" clasef="+code=dev" class="sref">dev, struct , 
<1 10* P>10st/decnet/dn_dev1c#L96129id="L95="+code=jiffies" cla930"> 930        *((dev, struct ef="+code
<1 10: R>10: /decnet/dn_dev1c#L951" id=">dn_readass="line" name="L9maybePrifaulf">n =  891        struct dn_dev *dn_db = dn_dbrcu_dereference_raw(/dn_dev.c#L889" id=a href="+c1047="line"10"sref">len<1a> += 2;
<1 10"sr>10:t/decnet/dn_dev1c#L8813 id="L942" cl1063="line"10="sref">dn_1/
<1 10: R>10:t/decnet/dn_dev1c#L951v.c#L906" id="ass=="line" name="L96lass="sref">size = (struct dn_db-ARPHRD_ETHER>, size = (struct dn_db-ARPHRD_LOOPBACKode=*dn_1/913
<1 10ss=>10:t/decnet/dn_dev1c#L9515555555las.c#L906" id=ass="l href="+c1047="line"10"sref">len<1aze;
<1 10: R>10:t/decnet/dn_dev1c#L9213 id="L905" cl1056="line"105"> 9551a> += 7;
<1 10"sr>10:t/decnet/dn_dev1c#L871" id="L/dn_dev10 tcomment">/*71r++;
<1 10ss=>10:t/decnet/dn_dev1c#L9613 id="10 tcomment"> L940" cla Need to ensure that loopback ef="+c has a e> *< attached to itp_span"L944" class="line" name="L944">71 937
<1 10nam>10:t/decnet/dn_dev1c#L8613 id="10 tcomment"> L940" cla to f="+w  8n4dion of "+codbours against it, even though it mcodtp_span"L944" class="line" name="L944">71 
<1 10cla>10:9/decnet/dn_dev1c#L9613 id="10 tcomment"> L940" cla not have a ref=" ef="ess of its own. Mcodt as well do the s/dn codp_span"L944" class="line" name="L944">71 939
<1 10nam>10na/decnet/dn_dev1c#L9614 id="10 tcomment"> L940" cla f="eautoconfigured asshrfa+cs.p_span"L944" class="line" name="L944">71">n;
<1 10 cl>10nt/decnet/dn_dev1c#L9514 id="10 tcomment"> L940" cla/p_span"L944" class="line" name="L944">71>i2;
<1 10cla>10nt/decnet/dn_d}d1v.c  1            ifa>(<"line" name="L964"> 964        if (GFP_ATOMIC)) == p1 942
<1 10nam>10nt/decnet/dn_dev1c#L951de=rcu_derefere class=ass="line" name="L9erreef">/dn_dev.c#err id= href="+c1047="line"10"sref">len<12));
<1 10ass>10nt/decnet/dn_dne1/dn_d14906" id="L906" class="line" name="L964"> 964        if ( 8n4d_ptp_hello("L891"> 8n4d_p_hel" class="sref">rcu_dereference_raw(<, ="+code=jiffies" claerreef">/dn_dev.c#err id=" href="+c1047="line"10"sref">len<12ze;
<1 10nam>10nt/decnet/dn_dev1c#L9414 id="L/dn_dev.c#L921"a>(<"line" name="L964"> 964        if (GFP_ATOMIC)) == len<12> += 7;
<1 10="s>10nt/decnet/dn_dev1c#L9314 id="L/dn_dev.c#L921"906" id=ass="l href="+c1047="line"10"sref">len<1a> - 2);
<1 10"sr>10n7/decnet/dn_dev1c#L8814782" id="L882L886" cla1045="line"10name="L944"1 947
<1 10nam>10nt/decnet/dn_dev1c#L971" id="L978" cl1049="line"10ass="sref">1kb);
<1 10ass>10n9/decnet/dn_dev1c#L9714 id="L979" class="line" name="L96lass="sref">size = (struct dn_db-ARPHRD_ETHER>, p1 949
<1 10nam>10na/decnet/dn_dev1c#L8615hc#L906" id="L906" class="line" name="L9memcmup href="+code=dmemcmue_raw" class="sref">rcu_dereference_raw(f">dev, struct <1">f">d id=()) {
<1 10s=">10nt/decnet/dn_dev1c#L8915882" id="L882" class=========ass="l href="+c1047="line"10"sref">len<1IC);
<1 10ef">10nt/decnet/dn_dev1c#L9415.c#L932" id="L932" clf="+code=msg  dev, struct ef="+codercu_dereference_raw(f">dev, struct <1">f">d id=" href="+c1047="line"10"sref">len<12) {
<1 10s=">10nt/decnet/dn_dev1c#L9015e=rcu_derefere class="line" name="L9maybePrifaulf">n = pk1rc);
<1 10ass>10nt/decnet/dn_dev1c#L9515.c#L886" id="L886" cla1045="line"10name="L944"1       }
<1 10/a>>10nt/decnet/dn_dev1c#L901" id="L905" cl1056="line"105"> 9551       }
<1 105">>10nt/decnet/dn_dev1c#L931" id="" caass=ass="line" name="L9f">dev, struct ef="+code - 2);
<1 10nam>10nt/decnet/dn_dev1c#L9515t/dn_dev.c#L95ev.c!coass="l href="+c1047="line"10"sref">len<1I947
<1 10ass>10nt/decnet/dn_dev1c#L9415 id="L978" cl1049="line"10ass="sref">1958}
<1 10ame>10nt/decnet/dn_dev1c#L9615 id="L979" class=="line" name="L9s=sref">dn_dev *f="+c_s=sref">dn_dev"L891">f="+c_s=se_rawGFP_ATOMIC" class="sref">GFP_ATOMIC)) == N11 959
<1 10nam>10na/decnet/dn_dev1c#L9416hid="L/dn_dev.c#L921"ass="l href="+c1047="line"10"sref">len<1ifa)
<1 10las>10n1/decnet/dn_dev1c#L8816 id="L981" cl1022="line"10ref">ifa_lo1961{
<1 10ame>10nt/decnet/dn_dev1c#L9416" class="sref">dn_dbdec1
ptr, ifa->ptr, dev, struct ef="+cod href="+c1047="line"10"sref">len<1i) {
<1 10="s>10n3/decnet/dn_ev.1#L891163 class="sref">dn_dbdec1
ptr, ptr, (struct dn->RT_SCOPE_UNIVERSE+cod href="+c1047="line"10"sref">len<1i      }
<1 href="net/decnet/dn_dev<1 hr9116 id="L957" class="line" namestrc"sref">skb2 =strc"se_raw" class="sref">" class="sref">ptr, (struct dn_dev"L891">hrefs=sp_hel" class="sref">rcu_dereference_raw(<, " class="sref">" class="sref">ptr, <"L889" cla1061="line"10lass="sref"1 947
<1 href="net/decnet/dn_dev<1 hr911  id="L978" cl1049="line"10ass="sref">1658}
<1 href="net/decnet/dn_dev<1 hr911 666666net/dn_10 tcomment">/*717959
<1 href="net/decnet/dn_dev<1 hr><17 id="10 tcomment"> L940" cla Autom1g cally hre the rifaulf ef="+c to the first autom1" cally717fa)
<1 href="net/decnet/dn_dev<1 hr><17 id="10 tcomment"> L940" cla configured ether" n card as the system.p_span"L944" class="line" name="L944">71761{
<1 href="net/decnet/dn_dev<1 hr><17 id="10 tcomment"> L940" cla/p_span"L944" class="line" name="L944">717r);
<1 href="net/decnet/dn_dev<1 hr><17 id="L906" class="line" name="L9maybePrifaulf">n = p17c);
<1 href="net/decnet/dn_dev<1 hr><17906" id="L906" class="line" name="L961">holadd"+code=dn_send_roholap_hel" class="sref">rcu_dereference_raw(<"L889" cla1061="line"10lass="sref"17      }
<1 href="net/decnet/dn_dev<1 hr><17 id="L/dn_dev.c#L921"a>(<"line" name="L964">1">hrefrifaulf">n = 1">hrefrifaulfp_hel" class="sref">rcu_dereference_raw(<, 0*dn_17      }
<1 href="net/decnet/dn_dev<1 hr><1  id="L/dn_dev.c#L921"" class="line" name="L961">puf">n = pufp_hel" class="sref">rcu_dereference_raw(<"L889" cla1061="line"10lass="sref"17956
<1 href="net/decnet/dn_dev<1 hr><17782" id="L882L886" cla1045="line"10name="L944"1 c);
<1 href="net/decnet/dn_dev<1 hr><1  id="L886" cla1045="line"10name="L944"1 58}
<1 href="net/decnet/dn_dev<1 hr><17 id="L969" cl106s="line"10name="L959"18959
<1 href="net/decnet/dn_dev<1 hr><1 hid="L970" canc,  dele4dp_hello" class="sref">dn_send_ptp_hello(struct )
<1 href="net/decnet/dn_dev<1 hr><1  id="ef="+code10:7="line"10ss="sref">p1861{
<1 href="net/decnet/dn_dev<1 hr><1 " class="srefass="line" name="L891"> 891        struct dn_dev *dn_db = dn_dbrcu_dereference_raw(/dn_dev.c#L889" i(<"L889" cla1061="line"10lass="sref"1 r);
<1"sref">38t/decnet/dn_dev<1"sr><1  id="L963" cl10s4="line"10"sref">ETH_18c);
<1 9ref="98t/decnet/dn_dev<1 9r><1  id="L921" cla>(<"line" name="L964"> 964        if (GFP_ATOMIC)) == len<1       }
<1 9ref="98t/decnet/dn_dev<1 9r><18 id="L/dn_dev.c#L921"ass="l href="+c1047="line"10"sref">len<18      }
<1 9ref="98t/decnet/dn_dev<1 9r><18 id="L956" cl10s7="line"10slass="sref18956
<1 9ref="98t/decnet/dn_dev<1 9r><18 id="L95="+code=jiffies" claselsk_buffsy,  jiffies - /dn_dev.c#L889" id="L889" cla1061="line"10lass="sref"18c);
<1 9ref="98t/decnet/dn_dev<1 9r><1  id="L95="+code=jiffies" class="=msgysctl_unregis       if (jiffies - dn_db-&g utput"i<1858}
<1 9ref="98t/decnet/dn_dev<1 9r><189id="L95="+code=jiffies" cla"L891"> heckfrifaulf">n = 1"> heckfrifaulfp_hel" class="sref">rcu_dereference_raw(<"L889" cla1061="line"10lass="sref"19959
<1 9ref="99t/decnet/dn_dev<1 9r><1 9id="L95="+code=jiffies" cla"+codeif 9_dowd href="+code"+codeif 9_de_raw="+code=jiffies" class="+codetabld_ptp_hello("L8"+codetabld id=()
<1 9ref="9et/decnet/dn_dfo<1 9r><19 id="L981" cl1022="line"10ref">ifa_lo1961{
<1 9ref="99t/decnet/dn_dev<1 9r><19           ifa>(<"line" name="L964"> 964        if (dn_db-&g utput" class="srt2 9_dowd href="+code 9_de_rahhref="+c1047="line"10"sref">len<19r);
<1 9ref="99t/decnet/dn_dev<1 9r><1 e=rcu_derefere class="line" name="L964"> 964        if (dn_db-&g utput" class="srt2 9_dowd href="+code 9_de_ral" class="sref">rcu_dereference_raw(<"L889" cla1061="line"10lass="sref"19c);
<1 9ref="9et/decnet/dn_dev<1 9r><19 id="L944" class="line" name="L944">719      }
<1 9ref="99t/decnet/dn_dev<1 9r><19 id="L957" class="line" name=cu_dereference_raw(/dn_dev.c#L889" id=ef="+code=dn_db" jclass="sref">skb == ptr<1       }
<1 9ref="99t/decnet/dn_dev<1 9r><1  id="L956" cl10s7="line"10slass="sref19956
<1 9ref="99t/decnet/dn_dev<1 9r><19 id="L95="+code=jiffies" cla"+codess="s_releasllo(struct dn, dn_db-"+codess="siffih href="+c1028="line"10"srss="sref19c);
<1 9ref="99t/decnet/dn_dev<1 9r><19 id="L95="+code=jiffies" cla"+codeif 9_dowd href="+code"+codeif 9_de_raw="+code=jiffies" class="+codetabld_ptp_hello("L8"+codetabld id=(}
<1 9ref="99t/decnet/dn_dev<1 9r><19 id="L969" cl106s="line"10name="L959"2src;
<2 10ss=>10ss/decnet/dn_dev2c#L9620hid="L/dn_deva>(<"line" name="L964"> 964        if (/dn_dev.c#coushre_rahhref="+c1047="line"10"sref">len<2">n;
<2 10scl>10st/decnet/dn_dev2c#L9820882" id="L882" class=de=jiffies" cla"+codereleasllo(struct  964        if (/dn_dev.c#coushre_rahL889" cla1061="line"10lass="sref"2tr);
<2 10s"s>10st/decnet/dn_dev2c#L8820           ifa>(<"line" name="L964"> 964        if (/dn_dev.c#sehre_rahhref="+c1047="line"10"sref">len<2"3);
<2 9ref="99t/decnet/dn_dev<2c#L952de=rcu_dereferenc, <_ade=jiffies" cla"+codereleasllo(struct  964        if (/dn_dev.c#sehre_rahL889" cla1061="line"10lass="sref"2t4);
<2 9ref="9et/decnet/dn_dev<2c#L9620 id="L944" class="line" name="L944">72ize;
<2 10sss>10st/decnet/dn_dev2c#L9620 id="L957" class="line" namekfred_ptp_hello(kfrede_raw" class="sref">r" class="sref">dn, i<2ptr;
<2 10sas>10st/decnet/dn_dev2c#L9520 id="L886" cla1045="line"10name="L944"2t7r;
<2 9ref="99t/decnet/dn_dev<2c#L9520 id="L947" clatlen" cla9s="sref">pkt<2len;
<2 10s=">10st/decnet/dn_dev2c#L9720 id="anc,  dn_send_ptp_hello(struct ;
<2 10sas>10st/decnet/dn_dev2c#L8820 id="ef="+code10:7="line"10ss="sref">p2">n;
<2 10 cl>10 c/decnet/dn_dev2c#L8821 id="L940" class="line" name="L891"> 891        struct dn_dev *dn_db = dn_dbrcu_dereference_raw(/dn_dev.c#L889" ihri<2 910
<2 10nam>10 t/decnet/dn_dev2c#L9821 id="L891" class="line" name="L891"> 8ref">dev, struct , )
<2 10ass>10 2/decnet/dn_dev2c#L9721 id="L942" cl1063="line"10="sref">dn_2 return;
<2 10   >10 3/decnet/dn_dev2c#L8821 id="L906" class="line" name="L964"> 964        if (GFP_ATOMIC)) == len<2 913
<2 10nam>10 t/decnet/dn_dev2c#L9721555555las.c#L906" id=ass="l href="+c1047="line"10"sref">len<21ze;
<2 10las>10 t/decnet/dn_dev2c#L9021 id="L905" cl1056="line"105"> 95521tr;
<2 10ss=>10 t/decnet/dn_dev2c#L9021 id="L/dn_devwhiles=="line" name="L9s=sref">dn_dev *dn_db = dn_dbr4"> 964        if (n = GFP_ATOMIC)) == p217r;
<2 10nam>10 t/decnet/dn_dev2c#L9621t/dn_dev.c#L95ev.c!co dn_dev"L891">delfs=se_raw" class="sref">r4"> 964        if ( 964        if (n = len<21en;
<2 10>DN>10 t/decnet/dn_dev2c#L9621dev.c#L875" id="L/dn_ dn_dev"L891">fredfs=se_raw" class="sref">" class="sref">ptr, <"L889" cla1061="line"10lass="sref"21rc;
<2 10nt">10 9/decnet/dn_dev2c#L96219id="L95="+coL886" cla1045="line"10name="L944"2>++ = 0;
<2 10sre>10sr/decnet/dn_dev2c#L882" id="886" cla1045="line"10name="L944"2>910
<2 10sre>10st/decnet/dn_dev2c#L9822 id="L891" cl dele4dp_hela href="+code=dncu_dereference_raw(<"L889" cla1061="line"10lass="sref"2>LL)
<2 10ref>10s2/decnet/dn_dev2c#L9722 id="L886" cla1045="line"10name="L944"2>return;
<2 10las>10st/decnet/dn_dev2c#L9622 id="L963" cl10s4="line"10"sref">ETH_2>913
<2 10"sr>10s4/decnet/dn_dev2c#L972" id="anc,  n = 1">=ni cpkfp_hello" class="sref">dn_sesk_buff">n =         sk  len<2>ze;
<2 10orw>10st/decnet/dn_dev2c#L8622 id="ef="+code10:7="line"10ss="sref">p22RT;
<2 10DN_>10s6/decnet/dn_dev2c#L9722 id="L886" cla1045="line"10name="L944"2v));
<2 10ss=>10s7/decnet/dn_dev2c#L9722 id="L947" clatlen" cla9s="sref">pkt<2a> += 2;
<2 10"sr>10s8/decnet/dn_dev2c#L9722 id="anc,  n = 1">vericpkfp_hello" class="sref">dn_sesk_buff">n =         sk  len<2>rc;
<2 10* P>10st/decnet/dn_dev2c#L9622 id="ef="+code10:7="line"10ss="sref">p2/
<2 10: R>10: /decnet/dn_dev2c#L952" id="L886" cla1045="line"10name="L944"2t3);
<2 10las>10:t/decnet/dn_dev2c#L9223 id="L981" cl1022="line"10ref">ifa_lo2a> += 2;
<2 10"sr>10:t/decnet/dn_dev2c#L8823 id="anc,  n = 1">hellop_hello" class="sref">dn_sesk_buff">n =         sk  len<2/
<2 10: R>10:t/decnet/dn_dev2c#L952v.c#L9ef="+code10:7="line"10ss="sref">p2/913
<2 10ss=>10:t/decnet/dn_dev2c#L952555555L886" cla1045="line"10name="L944"2tze;
<2 10: R>10:t/decnet/dn_dev2c#L9223 id="L905" cl1056="line"105"> 9552a> += 7;
<2 10"sr>10:t/decnet/dn_dev2c#L8723 id="anc,  n = len<2/));
<2 10ss=>10:t/decnet/dn_dev2c#L9623 id="ef="+code10:7="line"10ss="sref">p2 937
<2 10nam>10:t/decnet/dn_dev2c#L8623 id="L974" clasef="+code=dev" classnd_ptp_hello(struct 
<2 10cla>10:9/decnet/dn_dev2c#L9623 id="L969" cl106s="line"10name="L959"2 939
<2 10nam>10na/decnet/dn_dev2c#L96249id="L95="+code=jiffies" cla=tnl_locka> = n;
<2 10 cl>10nt/decnet/dn_dev2c#L9524 id="L891" cl ptr += 2;
<2 10cla>10nt/decnet/dn_d}d2v.c  2            ifL891" cl 
<2 10nam>10nt/decnet/dn_dev2c#L95243 class="sref">dn_dbdec1
 = 
<2 10ass>10nt/decnet/dn_dne2/dn_d24 id="L944" class="line" name="L944">722ze;
<2 10nam>10nt/decnet/dn_dev2c#L9424 id="L886" cla1045="line"10name="L944"22> += 7;
<2 10="s>10nt/decnet/dn_dev2c#L9324 id="L956" cl10s7="line"10slass="sref2a> - 2);
<2 10"sr>10n7/decnet/dn_dev2c#L8824782" anc,  len<2 947
<2 10nam>10nt/decnet/dn_dev2c#L972" id="ef="+code10:7="line"10ss="sref">p2kb);
<2 10ass>10n9/decnet/dn_dev2c#L9724 id="L979" clasef="+code=dev" classnd_ptp_hello(struct 
<2 10nam>10na/decnet/dn_dev2c#L8625 id="886" cla1045="line"10name="L944"2)) {
<2 10s=">10nt/decnet/dn_dev2c#L8925 id="L891" cl );
<2len<1IC);
<1 10ef">102c#L942{en<1IC);
<1<  r4"> 964 href="+cod2=dn_se2dde_raw" class="sr2f">rc2_dereference_raw(
<1 10nam>10nt/decnet/dn_dev1c#L971" id= href="+c1047="line"ref">len<1line" dev1c#L971" id=IFF_UP="+c1047="line"IFF_UP  20nt/decnet/dn_dev1c#L90152=rcu_25L964"> 964       "sref">ptr;
<1 10orw>10st/decnet/dn_d889" cla1061="line"10lass="sref"2"> += 2;
<2 10cla>10nt/decnet/dn_d}d2v.c  > =  9551       }
<1 105">>10nt/2ecnet2dn_devd="L906" class=ass="lif=HELO" cla21;
<2 10"sre - 2);
<1 10nam>10nt/decnet/d2_dev1c#L9525t/dn_dev.c#L95ev.c!coass2"l hr2f="+c1f (n  href="+co2e=b" class"L891">f="+c_s=2ref">2n_devr4"> 964 MIC)) 2= 10st/decnet/dn_devbla hing_notifiL9_chain10sss>10shel"L889" cla1061="line"1dn.c#L_chaina>;
<1 10orw>10st.c#L_chain);
<1 10ef">102c#n_dev2c#L8823 id=nnc,  (<"L889" cla1061="line"10lass="_dev1c#L9426hid="L/dn_dev.c#L921"ass2"l hr26e4d_ptp_hello("L891">dele4dp_hela href">ptr, LL)
<#L891163 c2ass="sref">dn_dbdec1
n   = (struct 2lasss26sesk_buff">n = /dn_dev.c#bla hing_notifiL9_chain1sg  ;
<1 10orw>10st.c#L_chain);
<1 10ef">102c#n_dev2c#L8823 id=nnc,  (<"L889" cla1061="line"10lass="_5"> 955(struct d2_dev"L891">hrefs=sp_h2l" cl2ss="sref">rcu_dereference_raw(<, "2class="sre2">" class="sref">ptr,2<"L882" cla1#ifdef;
<1 10ef">102c#CONFIG_PROC_L947" clatlen" clCONFIG_PROC_L9="sref">rcu_dereference_raw(<, "2"L978" cl1249="line"10ass="sref">1652}27 cla1045="licla1061="line"10lass="sf"2IC);
<2lass=net/df (10st/decneis_;
<2 1ev<2c#L9520 id="L947" clatlen" cla9s="sref">pkt<2len;
<2 10s=">10st/decnet/dn_dev2c#L9720 id="anc,   27tp_hello(struct <27 id=272net/dn_dev1c#L8811 id="L940" classa>        struct dn_dev *dn_db = dn_d/a>(<"L889" cla1061="line"10lass="L944" clas2="line" name="L944">717612/a>{
21 hrefd="L906" class=ass="lif=HELO" cla2);
<1 2ref="net/decnet/dn_dev<1 2r><1727#L95243 class="sref">dn_dbdec1
<17902" id="L906" class="line" 2ame="2961">h045="line"10L8820 id="ef="+code1L889"q_pan"La>;
<1 10orw>10st/decn9"q_pan"Lv2c#L9223 id="L981" cl1022=""q_fi="sref19c);
<""q_fi="<2 10"sr>10:t/decnet/deqsref19c);
<""q);
<1 10ef">102c#loff_La>;
<1 10orw>10loff_L<2 10"sr>10:t/decnet/po7="line"10"sref">os1">hrefrifa2lf">n27 cla1045="lin="+code ode=msd__acquirt/decnet/dn_dev 955nrcu_de2eference_raw(<"L889" 2la10627"+c1047="linef (10st/decneidn_d/a>(<"L889" cla1061="line"10lass="Llass="sre2n_dev<1 hr><17782" id="L822L88627"+c1047="line"10"sref">len<2 947
<2 10nam>10nt/decnet/dn_dev2c#L972" id="ef="+code10:7="line"10ss="sref">p2kb);
<2 10ass>10n9/decnet/dn_dev2c#1 href="ne2/decnet/dn_dev<1 hr><1  i2="L8828tp_hello(struct del24dp_hello" class="sref">d2_send28 cla1061="line"10lass="sref"2cu10sad9
<2 10nam>10na/dcu10sad9e_raw(<"L889" cla1061="line"10lass="device" cl2ss="snet/dn_dev.c#L978" i2="L97288ref">dev, struct dn_db10:t/decnet/po7="line"10"sref">os/dn_dev.c#L889" i2<"L8828L964"> 964        if ();
<2 10ass>10n9/decnet/dn_dev2c#1 hr><17902<1  id="L921" cla>(<"line2 name28ode10:7="line"10ss="sref">p2/913
)) 2= 10st/decneidn_df="+c1047="line"10"sref">len<12) 2dev<1 9r><28 id="L/dn_dev.c#L921"ass2"l hr2f="+c1047="line"10"sref">len = );
<2len<1IC);
<1 10ef">102c#L942{en<1IC);
<1<  r4"> 964 e="+elsk_b2ffsy, e_raw="+code=jiffie2" cla28db" class="sref">dn_db102c#L942{en<1IC);
<1<  _up href="+code=dptp_heet_continuec1047="line"10"sref">len<12) 2="+code=ji2fies" cla"L891"> heckfrif2ulf">29tp_hello(struct 10st/decneidn_d}on_def"+cod3e10:7="lineT_TO42ss="+codetabld_ptp_hello<2a>("L2dn_dfo<27 id=raw="+code=jiffie2" cla28/a>_up hren_dev.c#L9net/dn_dev<1 9r><19      2    i2a>(<"line" namline"10lass="L944" clas2="line" nalass="line2 name="L964"> 964    2   if2(dn2db-&g 2tput" class="srt2 9_d2wd hr2f="+code 9_de_L882" class========="line" name="L9kfred_ptp_hello(kfrede_raw" class="sref">r"21 9ref="992/decnet/dn_dev<1 9r><19 i2="L9529 hrsk_buff+code=dn_ifaddr" classk 964(len<2>ze;
<2 10orw>10st/decnet/dasl="L95="2code=jiffies" class="+cod2tabld2ptp_hebdec1
<17902" id="L906" clanexline" 2ame="2961">h045="linnexl8820 id="ef="+code1L889"q_pan"La>;
<1 10orw>10st/decn9"q_pan"Lv2c#L9223 id="L981" cl1022=""q_fi="sref19c<17902" idnet/dn_dev<1 hr>t/decnet/dn_dev<1 hr912 10"sr>10:t/decnet/deqsref19c);
<""q);
<1 10ef">102c#loff_La>;
<1 10orw>10loff_L<2 10"sr>10:t/decn9 id="L95=2+code=jiffies" cla"+codei2 9_do29ericpkf">n = 1">vericpkfp3iffies" cl3ss="+codetabld_ptp_hello<3a>("L30a href="+code=net_device" class="sn1 hr><17782" id="L822L88627"+c1047="line"10"sref">len<2 947
<2 10nam>10nt/decnet/dn_dev2c#L972" id="ef="+code13cl106s="li3e"10name="L959"2src;
32 10s30">len<2>rc;
<2 10* P>10st/decnet/3L9820882" 3d="L882" class=de=jiffies3 cla"3codereleasllo<++a>);
<""q);
<1 10ef">102c#loff_La>;
<19      3);
<23091">dele4dp_hela href">ptr, 
<2 10nam>10nt/decf="+c1047="line"10net/dn_dev<1 hr>t/decnet/dn_dev2c#L972" id="ef="+code13c5c#L952de3rput" class="srt2 9_d3     3 if (t/decf="+c1029="line"10*v.c#L889" i2<"L8828L964"> 964        if (10loff_L<2 10"sr>10:t/dec3d="L944" c3ass="line" name="L944">723ze;
<1 1ecnet/dn_ev.1#L891163 c947
<2 10nam>10nt/decf="+c1047="line"1027"+c1047=_entrssscopllo(st27"+c1047=_entrsref">len = 3="L957" cl3ss="line" namekfred_ptp_h3llo(kfrede_raw" class="sref">r" class="s3ef">dn3 len = );
<2len<1IC);
<1 10ef">1023n_dev2c#L9320 id="anc,  dn_db103 class="sr3f">dn_send_ptp_hello(3truct31ef">dn_dev *_up h3ef">dn_dev3/a> *len<2>rc;
<2 10* P>10st/decnet/3code=i2" c3ass="sref">i<2 910
<2310nam31n_dfo)
<1 href2"net/decnet/dn_dev<1 hr><27 id=raw="+code=jiffie2" cla28/a>_up h3ass="line"3name="L891"> 8ref">dev(<"line" namline"10lass="L944" clas2="line" n3942" cl1063="line"10="sref">dn_2 ret3rn;
<3ef">ptr<1ULL)
<1 10ass>10 2/decnet3"L964"> 963        if (r"3f="+c1047=3line"10"sref">len<2 913
<2 31 hrsk_buff+code=dn_ifaddr" classk 964<3 = dn_dbr" class="s3dn_dev3L891">delfs=se_raw" class3"sref31tp_hebdec1
<17902" id="L906" classo152=rcu_25L964"> 964;
<1 10orw>10st/decn9"q_pan"Lv2c#L9223 id="L981" cl1022=""q_fi="sref19c<17902" idnet/dn_dev<1 hr>t/dect/decneis_;
<2 1ev<2c
<1 10ef">103 _dev2c#L9321en;
<2 10>DN>10 t/d3cnet/310s8/decnet/dn_dev1c#L971" id="4  L964">1">hrefrifa24  Lcla1045="lin="+code ode=msd__acquirt/decnet/dn_devdn_dev"L8913>fred32de=mshello">n  href="+co2e=b" clas3tr, <"3889" cla1061="line"10lass3"sref321rc;
<2 10nt">10 9/decnesend28 cldev1c#L9515.c#L886" i2end28 cldev1c#1="line"10lass="sref"2cu10sad9
<2 13045="line"30name="L944"2>910
<2 30sre>30st/decnet/dn_dev2c#L9822 id="L891" cl 3a  ("3891">dele4dp_hela href="+code=dncu_der3ference_ra3(<"L889" cla1061="lin3"10la3s="srebdec1
<17902" id="L/a>
2asev.c#L921"ass="l "L/a>
2ase1="licharn1 hr><17902" id10name="L944"1 947
<1 1n_dev 963 id="anc,  n = 1">=ni cpkfp3hello" cla3s="sref">dn_sesk_buff">n<3a> = 32skb;
<1 1switchde_ra2="+code=jif10name="L944"1 947
<1 1n/a>);
<2len<1IC);
<1 10ef">1023a>        3k  len<12  n1 hr><17902" idDN_DEV_BCASTme="L944"1 947:>);
<2len<1IC);
<1 10ef">1023an_dev322 id="ef="+code10:7="lin3"10ss32ref">r4"> 964 e="L882" cl44">717fa"B"et/dn_de"10lass="sref"2cu10sad9
<2 130_dev2c#L93 id="anc,  :>);
<2len<1IC);
<1 10ef">1023hello" cla3s="sref">dn_sesk_buff">n<3a> = 33ef">dn_dev *717fa"U"et/dn_de"10lass="sref"2cu10sad9
<2 13a>        3k    n1 hr><17902" idDN_DEV_MPOINTme="L944"1 947:>);
<2len<1IC);
<1 10ef">1023h45="line"322 id="ef="+code10:7="lin3"10ss33n_dfo)
44">717fa"M"et/dn_de"10lass="sref"2cu10sad9
<2 13a  (<"line" namline"10lass="L944" clas2="line" n3hello" cla3s="sref">dn_sesk_buff">n<3a> = 33f">ptr<1ULL)
<1 10ass>10 2/decnet3a>        3k  717fa"?"et/dn_de"10lass="sref"2cu10sad9
<2 13aello" cla32v.c#L9ef="+code10:7="lin3"10ss33 hrsk_buff+code=dn_ifaddr" classk 964<3t/dn_dev2c3L9223 id="L905" cl1056="l3ne"1033(kfrede_raw" class="sref">r" class="s3/dn_dev2c#38723 id="anc,  nrcu_de2efe 964 964;
<1 10orw>10st/decn9"q_pan"Lv2c#L9223 id="L981" cl1022=""q_fi="sref19c<17902" idnet/dn_dev<1 hr>t/dect/decneis_;
<2 1ev<2c
<1 10ef">103:7="line"13ss="sref">p2 937
<2 13nam>133ericpkf">n = 1">vericpkfp3ef="+code=3ev" classnd_ptp_hello3struc34+codetabld id=( 964        if (10loff_L<2 10"sr>10:t/dec32 10cla>1039/decnet/dn_dev2c#L9623 i3="L9634>10ss/decnet/dn_dev2c#L9620hid="L/dnecn9putL964">1">hrefrifecn9putLcla1045="lin="+code 1" cl1022=""q_fi="sref19c717fa"NL96dev2cF>
<1 T1v2cT="sr1 T3v2cT="sr3 BlkSize Pri Sdece DevTa>
ev2cRlen<2 Peer\n"et/dn_dne"10lass="sref"2cu10sad9
<2 132c#L9524 i3="L891" cl n = 1">vericpkfp3e   += 2;
<2 10cl3>10nt30cla>10nt/decnet/dn_d}=net_device" class="sn1 hr><17782" id="L822L88627"+c1047="line"10"sref">len<2 947
<2 10nam>10nt/decf="+c1047="line"10net/dn_dev<1 hr>t/decnet/dn_dev2c#L972" id="ef="+code13"+code=dnc3_dereference_raw(<"L839" cl3"+code10:7="line"10ss=charn1 hr><17902" idf">lecne10ef">102c#loff_">lecnecode[1 hr><17902" idDN_ASCBUF_L"L8828L964"> 964        3cnet/dn_dev2c#L95243 clas3="sre3mcast" class=> 8n4d_ptcharn1 hr><17902" id>len<2ecne10ef">102c#loff>len<2ecnecode[1 hr><17902" idDN_ASCBUF_L"L8828L964"> 964;
<2 10sas>10st/decnet/dn_dev2c#L8end">len<21ze;
<2 10las>10end">len<21zedn_db 891        struct r" class="s3net/dn_dev3c#L9324 id="L956" cl10s7=3line"34r4"> 964        if (717fa"%-8s %1s    i%04ui%04ui i%04lui%04lu"et/dn_dde_raw" class="sref">r" class="s3n7="line"13#L8824782" anc,  717fa"i i%04hu   i%03di%02x   i%-10s %-7s %-7s\n"et/dn_d,de_raw" class="sref">r" class="s3:7="line"13ss="sref">p2kb);
<2 13ass>13="L96lass="sref">size<964        if ();
2" id="L822L8862a names ?if ();
2" id="L822L8862a names :cl44">717fa"???"et/dn_d,de_raw" class="sref">r" class="s3: 10cla>103ev" classnd_ptp_hello3struc3cu_dereference_raw(
2asev.c#L921"ass="l "L/a>
2ase1="lis="line"10name="L949"2src;
<2 10sas>10stlass="sref">dn_db-&g utput" class="srt2 9_dowd href="+codm+coutput" class="sm+costruc,de_raw" class="sref">r" class="s3:c#L9524 i3a/decnet/dn_dev2c#L8625 i3="8863dn_send" hiora id=(<4)))))))))))))))))0,)0,de_raw" class="sref">r" class="s3:  );
<1<  r4"> 964 hre(;
<2 10sas>10stlass="sref">dn_db-&g utput" class="srt2 9_dowd href="+cod 31 9ref="98t/dect3p__dcde_raw" class="sref">r" class="s3:+code=dnc3="line"IFF_UP  2       if (dn_dbr" class="s3:>        3s="sref"2"> += 2;
<2 10cl3>10nt35cast" class=> 8n4d_pt(-&g utput" class="srt2 9_dowd href="+codp=ioritssscopllo(stp=ioritsp__dcde_raw" class="sref">r" class="s3:ello" cla30s25 9r>-&g utput" class="srt2 9_dowd href="+codbdec
<1 10orw>10st/dedec
p__dcuhel"L889" cla106L949"2src;
<2 10sas>10stlass="sref">dn_db-&g utput" class="srt2 9_dowd href="+cod>);
2" id="L822L8862a namescde_raw" class="sref">r" class="s3:n_dne2/dn3_dereference_raw(<"L839" cl35ref">r4"> 964    (len<2">n< ?if (dn_db*>dn_db1">hrefrifa2le16 cl105)f (len<2">ndn_dbrimary_kessscopllo(stp=imary_kess>10scn1 hr><17902" id>len<2ecne10ef">102c#loff>len<2ecnecode) :cl44">717fa""et/dn_d,de_raw" class="sref">r" class="s3:et/dn_dev30nt/2ecnet2dn_devd="L906"3class35r4"> 964        i(c1047="line"10"sref">len<2 ?if (dn_db*>dn_db1">hrefrifa2le16 cl105)f (c1047="line"10"sref">len<2lass="sref">dn_dbrimary_kessscopllo(stp=imary_kess>10scn1 hr><17902" idf">lecne10ef">102c#loff_">lecnecode) :cl44">717fa""et/dn_dct  - 23;
<1 35_dev2c#L9621dev.c#L875" id="L/dn_ f="3c_s=2ref">2n_devev.c#L875" id="L/dn_ (<"L839" cl36061="line"10lass="device" cl2ss="snet3_dev.c#L923"ass2"l hr26e4d_ptp_hello3/a>("3891">dbdec1
rcu_de2efe 96410:t 964n = 1">vericpkfp3f="+code=i3a" cl2ssef=26cla1061="lin3"10la36_e"1="snet/dn_dowd href="+codbde"line" 2ame="2961e"10L8820 /decnet/dn_dev2c#L 964h045="line"10L8820,de_raw" class="sref">r" class="s310:7=n_dev3c#L8823 id=nnc,  h045="linnexl8820,de_raw" class="sref">r" class="s31ello" cla3uct 2lasss26sesk_buff">n<3a> = 3a hrsk_buff+co_dowd href="+codbdo152=rcu_25L964">sso18820  /decnet/dn_dev2c#L 964 964r" class="s31n_dne2/dn3#L8823 id=nnc,  (<"L839" cl367hrsk_buff+co_dowd href="+codbhow52=rcu_25L964">show8820  /decnet/dn_dev2c#L 964 964r" class="s31et/dn_dev3md i2="L8826n_devd="L906"3class3ass="l}t rcu3deref36t/decnet/dn_dev2c#L8623 id="L974" cla3clatlen" c3CONFIG_PROC_L9="sref">rcu3deref3rence_rawf">nrcu_de2efe 96410loff_L<2 10"sr>10:t/dec3n_dev2c#L9320 id="anc,  10 3comm2nt"> 27tp_hello(3truct3;
<1 10orw>10st/d"q_pan"L)) == 10:t 964dn_d/a>(<"L839" cl31061="line"10lass="L944" clas2="line" n3me="L944">317612/a>{
21 hrefd="L906"3class3ass="lif=HELO" cla2);
<1 2ref="net3decnet/dn_3ev<1 2r><1727#L95243 clas3="sre3">dn_dbdec1
10:t"q_p9operec1onsL96larcu_de2efe 96410:t 964n = 1">vericpkfp3et/po7="li3e"10"sref">osr" class="s3="lRCUdecn3t/dn_devr" class="s3=et/dn_dev3line2 name27,  r" class="s3=" cl1017=3s>10st/decneidn_d/a>(<"L839" cl31061="line"10l_dowd href="+codllsee#L9515.c#L886" illsee#8820 /decnet/dn_dev2c#L clalsee#L9515.c#L886" i clalsee#8820,de_raw" class="sref">r" class="s3:7="line"13ss="sref">p2kb);
<2 13ass>1380msef="+cs_of_dowd href="+codr8a>(<"line" name="L964      /decnet/dn_dev2c#L clar8a>(<"line" name="L96 clar8a>(<"8820,de_raw" class="sref">r" class="s3:_dev2c#L93<1  i2="L8828tp_hello3struc3 dev717fa/* "L882" cla1#if */et/dn_dde_raw" class="sref">r" class="s37="line"103sref">os);
<1 2ref="net3"10"sref"S3Q_START_TOKENb);
<2 13ass>138>dn_dbdec1
nrcu_de2efe(3"line2 name28ode10:7="lin3"10ss3"sref"dowd href="+codm+cu_p9param_arrassscopllo(stm+cu_p9param_arras8820 c#L9223 id="L98cn1 hr><17902" idine" name="L9kfred_ptp_hell, 0444ct 1 hr><17902" idMODULE_PARM_DESC name="L9kfred_MODULE_PARM_DESC8820 c#L9223 id="L98717fa"The DECn_d u_deess of this machdf=: ar8 ,n+co"et/dn_dct d2_dev3c#L942{en<3IC);
<1<  <17902" id_" cla964">1">hrefrifa2 claL96larcu_de2efe 9641">hrefrif 964 += 7;
<2 10="s>10nt/de3ef="+code=3ptp_heet_continuec1047="l3ne"1039de=mshello">n  href="+co2e=b" clas3"L891"> he3kfrif2ulf">29tp_hello3struc3 rcu_de2efe1023"lineT_TO43ss="+codetabld_ptp_hello<3a>("L3dn_dfodn_dbrint#L9515.c#L886" i>rint#8820 c#L9223 id="L98KERN_ERRL9515.c#L886" iKERN_ERRL96la<44">717fa"DECn_d: Ar8  must9be9between 0 and 63"et/dn_dct r4"> 964 hredev2c#L8821 id="L906" class="line" name3lass="line3 name="L964"> 964    3   if39_e"1="snet/dnline"10lass="L944" clas2="line" n3db-&g 3tput" class="srt2 9_d3wd hr399/decnet/dn_dev2c#1 hr><17902<1  id="31 9ref="993/decnet/dn_dev<1 9r><19 i3="L95396a href="+cod=(rcu_de2efe1023"sdi0sas>13="+code=dev" class="sref"3/dn_d39ref">r4"> 964        if (rint#L9515.c#L886" i>rint#8820 c#L9223 id="L98KERN_ERRL9515.c#L886" iKERN_ERRL96la<44">717fa"DECn_d: N"L9 must9be9between 0 and 1023"et/dn_dct r4"> 964 e="L882" t len<12) 2="+code=ji2fies" cl4cl106s="li4e"10name="L959"2src;
42 10s401rc;
<2 10nt">10 9/decnet+code_u_deesslass="is_;
<2 10scode_u_deess    /decnet/dn_dev2c#Lcpu_to_le16964">1">hrefrifcpu_to_le168820 a href="+code=dnrcu_de2efe<19      4);
<240ecnet/dn_d}d2v.c  2          964 964    4ies" 40ss="lif=HELO" cla2);
<1 2ref="net4c5c#L952de4rput" class="srt2 9_d4     4 if ("L8new"L8dellen<12) 2dev<1 9r>"L8dump hre/e_raw" class="sref">"L8dump hre/e_hell, hel"L889" cla10ine" name="L9kfred_ptp_hellct d2_dev4n_dev2c#L9420 id="anc,  10st/dproclockafops_cr8 c
8820 len = 717fa"0scode__de"et/dn_d,+c1029="line"10*v_IRUGO> = 10:t 964dn_send_ptp_hello(4truct41ref">len<12) 2="+code=ji2fies" cl4ef">dn_dev4/a> *lenraw(<, "2class="sre2">" cSYSCT" name="L9kfred_e2">" cSYSCT"ef">len<12) 2="+code=ji2fies" cl4e9820882" 4ass="sref">i<2 910
<2410nam41n_dfo);
<2len<1IC);
<1 10ef">1024ass="line"4name="L891"> 8ref">devr4"> 964 href">nrcu_de2eference_raw(<"L889" 2la10627"+c1047="linef (dn_2 ret4rn;
<41_e"1="snet/dn_dev.
<1fore_ra2="+code=jiffies" class="+2odeta2/de0nt/decnet/dn_dev1fies" class="+2odeta2/als= /decnet/dn_dev1DN_DEV_LIST_SIZE47="line"10"sreDN_DEV_LIST_SIZE889" t/decnet/dn_dev1fies" class="+2odeta2++="L944"22> += 7;
<2 10="s>10nt/de4"L964"> 964        if ( 8n4d_pt(len<2 913
<2 41skb;
<1 1ev.c#L875" id="L/dn_ dn_db717fa/* "L882" SYSCT" */et/dn_dde_raw" class="sref">r" class="s4dn_dev4L891">delfs=se_raw" class4"sref41tp_heev.c#L875" id="L/dn_ ;
<2 10>DN>10 t/d4cnet/41t/decnet/dn_dev2c#L8623 id="L974" cla4+code=msfr4dfs=sref">dn_dev"L8914>fred42de=msa =tn1 hr><17902" id_"exla964">1">hrefrifa2exlaL96larcu_de2efe 964 964 += 7;
<2 10="s>10nt/de4tr, <"4889" cla1061="line"10lass4"sref42sd9_dowd href="+con_dev<1 hr2<17 id="<4045="line"40name="L944"2>910
<2 40sre>40st/deraw(<, "2class="sre2">" cSYSCT" name="L9kfred_e2">" cSYSCT"ef">len<12) 2="+code=ji2fies" cl4a  ("423_dfo);
<2len<1IC);
<1 10ef">1024ference_ra4(<"L889" cla1061="lin4"10la42_e"1="snet/dn_dev.
<1f">nrcu_de2eference_raw(<"L889" 2la10627"+c1047="linef ( 964 id="anc,   8n4d_ptfore_ra2="+code=jiffies" class="+2odeta2/de0nt/decnet/dn_dev1fies" class="+2odeta2/als= /decnet/dn_dev1DN_DEV_LIST_SIZE47="line"10"sreDN_DEV_LIST_SIZE889" t/decnet/dn_dev1fies" class="+2odeta2++="L944"22> += 7;
<2 10="s>10nt/de4hello" cla4s="sref">dn_sesk_buff">n<4a> = 42nt/decnet/dn_dev1c#L9(len<12#endifcl44">717fa/* "L882" SYSCT" */et/dn_dde_raw" class="sref">r" class="s40_dev2c#L94 id="anc,  dn_sesk_buff">n<4a> = 4310st/dproclockaremov
8820 len = 717fa"0scode__de"et/dn_dct len<2>rc;
<2 10* P>10st/decnet/4h45="line"422 id="ef="+code10:7="lin4"10ss43n_dfo102c#loff 964dn_sesk_buff">n<4a> = 43f">pt


dnfoo/dn_> The original LXR software by th n1 hr><179http://sourceforge. claprojects/lxn_>LXR communitsp__dc this experimental version by 1 hr><179mailto:lxn@_seux.no">lxn@_seux.nop__d.
dnsubfoo/dn_> lxn._seux.no kindly hot/dd by 1 hr><179http://www.redpill-_sepro.no">Redpill Lsepro ASp__dc provider of Lseux