root/net/decnet/dn_dev.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. dn_dev_sysctl_register
  2. dn_dev_sysctl_unregister
  3. dn_forwarding_proc
  4. dn_dev_sysctl_unregister
  5. dn_dev_sysctl_register
  6. mtu2blksize
  7. dn_dev_alloc_ifa
  8. dn_dev_free_ifa
  9. dn_dev_del_ifa
  10. dn_dev_insert_ifa
  11. dn_dev_set_ifa
  12. dn_dev_ioctl
  13. dn_dev_get_default
  14. dn_dev_set_default
  15. dn_dev_check_default
  16. dn_dev_by_index
  17. dn_nl_deladdr
  18. dn_nl_newaddr
  19. dn_ifaddr_nlmsg_size
  20. dn_nl_fill_ifaddr
  21. dn_ifaddr_notify
  22. dn_nl_dump_ifaddr
  23. dn_dev_get_first
  24. dn_dev_bind_default
  25. dn_send_endnode_hello
  26. dn_am_i_a_router
  27. dn_send_router_hello
  28. dn_send_brd_hello
  29. dn_send_ptp_hello
  30. dn_eth_up
  31. dn_eth_down
  32. dn_dev_timer_func
  33. dn_dev_set_timer
  34. dn_dev_create
  35. dn_dev_up
  36. dn_dev_delete
  37. dn_dev_down
  38. dn_dev_init_pkt
  39. dn_dev_veri_pkt
  40. dn_dev_hello
  41. dn_dev_devices_off
  42. dn_dev_devices_on
  43. register_dnaddr_notifier
  44. unregister_dnaddr_notifier
  45. is_dn_dev
  46. dn_dev_seq_start
  47. dn_dev_seq_next
  48. dn_dev_seq_stop
  49. dn_type2asc
  50. dn_dev_seq_show
  51. dn_dev_init
  52. dn_dev_cleanup

   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  * DECnet       An implementation of the DECnet protocol suite for the LINUX
   4  *              operating system.  DECnet is implemented using the  BSD Socket
   5  *              interface as the means of communication with the user level.
   6  *
   7  *              DECnet Device Layer
   8  *
   9  * Authors:     Steve Whitehouse <SteveW@ACM.org>
  10  *              Eduardo Marcelo Serrat <emserrat@geocities.com>
  11  *
  12  * Changes:
  13  *          Steve Whitehouse : Devices now see incoming frames so they
  14  *                             can mark on who it came from.
  15  *          Steve Whitehouse : Fixed bug in creating neighbours. Each neighbour
  16  *                             can now have a device specific setup func.
  17  *          Steve Whitehouse : Added /proc/sys/net/decnet/conf/<dev>/
  18  *          Steve Whitehouse : Fixed bug which sometimes killed timer
  19  *          Steve Whitehouse : Multiple ifaddr support
  20  *          Steve Whitehouse : SIOCGIFCONF is now a compile time option
  21  *          Steve Whitehouse : /proc/sys/net/decnet/conf/<sys>/forwarding
  22  *          Steve Whitehouse : Removed timer1 - it's a user space issue now
  23  *         Patrick Caulfield : Fixed router hello message format
  24  *          Steve Whitehouse : Got rid of constant sizes for blksize for
  25  *                             devices. All mtu based now.
  26  */
  27 
  28 #include <linux/capability.h>
  29 #include <linux/module.h>
  30 #include <linux/moduleparam.h>
  31 #include <linux/init.h>
  32 #include <linux/net.h>
  33 #include <linux/netdevice.h>
  34 #include <linux/proc_fs.h>
  35 #include <linux/seq_file.h>
  36 #include <linux/timer.h>
  37 #include <linux/string.h>
  38 #include <linux/if_addr.h>
  39 #include <linux/if_arp.h>
  40 #include <linux/if_ether.h>
  41 #include <linux/skbuff.h>
  42 #include <linux/sysctl.h>
  43 #include <linux/notifier.h>
  44 #include <linux/slab.h>
  45 #include <linux/jiffies.h>
  46 #include <linux/uaccess.h>
  47 #include <net/net_namespace.h>
  48 #include <net/neighbour.h>
  49 #include <net/dst.h>
  50 #include <net/flow.h>
  51 #include <net/fib_rules.h>
  52 #include <net/netlink.h>
  53 #include <net/dn.h>
  54 #include <net/dn_dev.h>
  55 #include <net/dn_route.h>
  56 #include <net/dn_neigh.h>
  57 #include <net/dn_fib.h>
  58 
  59 #define DN_IFREQ_SIZE (offsetof(struct ifreq, ifr_ifru) + sizeof(struct sockaddr_dn))
  60 
  61 static char dn_rt_all_end_mcast[ETH_ALEN] = {0xAB,0x00,0x00,0x04,0x00,0x00};
  62 static char dn_rt_all_rt_mcast[ETH_ALEN]  = {0xAB,0x00,0x00,0x03,0x00,0x00};
  63 static char dn_hiord[ETH_ALEN]            = {0xAA,0x00,0x04,0x00,0x00,0x00};
  64 static unsigned char dn_eco_version[3]    = {0x02,0x00,0x00};
  65 
  66 extern struct neigh_table dn_neigh_table;
  67 
  68 /*
  69  * decnet_address is kept in network order.
  70  */
  71 __le16 decnet_address = 0;
  72 
  73 static DEFINE_SPINLOCK(dndev_lock);
  74 static struct net_device *decnet_default_device;
  75 static BLOCKING_NOTIFIER_HEAD(dnaddr_chain);
  76 
  77 static struct dn_dev *dn_dev_create(struct net_device *dev, int *err);
  78 static void dn_dev_delete(struct net_device *dev);
  79 static void dn_ifaddr_notify(int event, struct dn_ifaddr *ifa);
  80 
  81 static int dn_eth_up(struct net_device *);
  82 static void dn_eth_down(struct net_device *);
  83 static void dn_send_brd_hello(struct net_device *dev, struct dn_ifaddr *ifa);
  84 static void dn_send_ptp_hello(struct net_device *dev, struct dn_ifaddr *ifa);
  85 
  86 static struct dn_dev_parms dn_dev_list[] =  {
  87 {
  88         .type =         ARPHRD_ETHER, /* Ethernet */
  89         .mode =         DN_DEV_BCAST,
  90         .state =        DN_DEV_S_RU,
  91         .t2 =           1,
  92         .t3 =           10,
  93         .name =         "ethernet",
  94         .up =           dn_eth_up,
  95         .down =         dn_eth_down,
  96         .timer3 =       dn_send_brd_hello,
  97 },
  98 {
  99         .type =         ARPHRD_IPGRE, /* DECnet tunneled over GRE in IP */
 100         .mode =         DN_DEV_BCAST,
 101         .state =        DN_DEV_S_RU,
 102         .t2 =           1,
 103         .t3 =           10,
 104         .name =         "ipgre",
 105         .timer3 =       dn_send_brd_hello,
 106 },
 107 #if 0
 108 {
 109         .type =         ARPHRD_X25, /* Bog standard X.25 */
 110         .mode =         DN_DEV_UCAST,
 111         .state =        DN_DEV_S_DS,
 112         .t2 =           1,
 113         .t3 =           120,
 114         .name =         "x25",
 115         .timer3 =       dn_send_ptp_hello,
 116 },
 117 #endif
 118 #if 0
 119 {
 120         .type =         ARPHRD_PPP, /* DECnet over PPP */
 121         .mode =         DN_DEV_BCAST,
 122         .state =        DN_DEV_S_RU,
 123         .t2 =           1,
 124         .t3 =           10,
 125         .name =         "ppp",
 126         .timer3 =       dn_send_brd_hello,
 127 },
 128 #endif
 129 {
 130         .type =         ARPHRD_DDCMP, /* DECnet over DDCMP */
 131         .mode =         DN_DEV_UCAST,
 132         .state =        DN_DEV_S_DS,
 133         .t2 =           1,
 134         .t3 =           120,
 135         .name =         "ddcmp",
 136         .timer3 =       dn_send_ptp_hello,
 137 },
 138 {
 139         .type =         ARPHRD_LOOPBACK, /* Loopback interface - always last */
 140         .mode =         DN_DEV_BCAST,
 141         .state =        DN_DEV_S_RU,
 142         .t2 =           1,
 143         .t3 =           10,
 144         .name =         "loopback",
 145         .timer3 =       dn_send_brd_hello,
 146 }
 147 };
 148 
 149 #define DN_DEV_LIST_SIZE ARRAY_SIZE(dn_dev_list)
 150 
 151 #define DN_DEV_PARMS_OFFSET(x) offsetof(struct dn_dev_parms, x)
 152 
 153 #ifdef CONFIG_SYSCTL
 154 
 155 static int min_t2[] = { 1 };
 156 static int max_t2[] = { 60 }; /* No max specified, but this seems sensible */
 157 static int min_t3[] = { 1 };
 158 static int max_t3[] = { 8191 }; /* Must fit in 16 bits when multiplied by BCT3MULT or T3MULT */
 159 
 160 static int min_priority[1];
 161 static int max_priority[] = { 127 }; /* From DECnet spec */
 162 
 163 static int dn_forwarding_proc(struct ctl_table *, int,
 164                         void __user *, size_t *, loff_t *);
 165 static struct dn_dev_sysctl_table {
 166         struct ctl_table_header *sysctl_header;
 167         struct ctl_table dn_dev_vars[5];
 168 } dn_dev_sysctl = {
 169         NULL,
 170         {
 171         {
 172                 .procname = "forwarding",
 173                 .data = (void *)DN_DEV_PARMS_OFFSET(forwarding),
 174                 .maxlen = sizeof(int),
 175                 .mode = 0644,
 176                 .proc_handler = dn_forwarding_proc,
 177         },
 178         {
 179                 .procname = "priority",
 180                 .data = (void *)DN_DEV_PARMS_OFFSET(priority),
 181                 .maxlen = sizeof(int),
 182                 .mode = 0644,
 183                 .proc_handler = proc_dointvec_minmax,
 184                 .extra1 = &min_priority,
 185                 .extra2 = &max_priority
 186         },
 187         {
 188                 .procname = "t2",
 189                 .data = (void *)DN_DEV_PARMS_OFFSET(t2),
 190                 .maxlen = sizeof(int),
 191                 .mode = 0644,
 192                 .proc_handler = proc_dointvec_minmax,
 193                 .extra1 = &min_t2,
 194                 .extra2 = &max_t2
 195         },
 196         {
 197                 .procname = "t3",
 198                 .data = (void *)DN_DEV_PARMS_OFFSET(t3),
 199                 .maxlen = sizeof(int),
 200                 .mode = 0644,
 201                 .proc_handler = proc_dointvec_minmax,
 202                 .extra1 = &min_t3,
 203                 .extra2 = &max_t3
 204         },
 205         { }
 206         },
 207 };
 208 
 209 static void dn_dev_sysctl_register(struct net_device *dev, struct dn_dev_parms *parms)
 210 {
 211         struct dn_dev_sysctl_table *t;
 212         int i;
 213 
 214         char path[sizeof("net/decnet/conf/") + IFNAMSIZ];
 215 
 216         t = kmemdup(&dn_dev_sysctl, sizeof(*t), GFP_KERNEL);
 217         if (t == NULL)
 218                 return;
 219 
 220         for(i = 0; i < ARRAY_SIZE(t->dn_dev_vars) - 1; i++) {
 221                 long offset = (long)t->dn_dev_vars[i].data;
 222                 t->dn_dev_vars[i].data = ((char *)parms) + offset;
 223         }
 224 
 225         snprintf(path, sizeof(path), "net/decnet/conf/%s",
 226                 dev? dev->name : parms->name);
 227 
 228         t->dn_dev_vars[0].extra1 = (void *)dev;
 229 
 230         t->sysctl_header = register_net_sysctl(&init_net, path, t->dn_dev_vars);
 231         if (t->sysctl_header == NULL)
 232                 kfree(t);
 233         else
 234                 parms->sysctl = t;
 235 }
 236 
 237 static void dn_dev_sysctl_unregister(struct dn_dev_parms *parms)
 238 {
 239         if (parms->sysctl) {
 240                 struct dn_dev_sysctl_table *t = parms->sysctl;
 241                 parms->sysctl = NULL;
 242                 unregister_net_sysctl_table(t->sysctl_header);
 243                 kfree(t);
 244         }
 245 }
 246 
 247 static int dn_forwarding_proc(struct ctl_table *table, int write,
 248                                 void __user *buffer,
 249                                 size_t *lenp, loff_t *ppos)
 250 {
 251 #ifdef CONFIG_DECNET_ROUTER
 252         struct net_device *dev = table->extra1;
 253         struct dn_dev *dn_db;
 254         int err;
 255         int tmp, old;
 256 
 257         if (table->extra1 == NULL)
 258                 return -EINVAL;
 259 
 260         dn_db = rcu_dereference_raw(dev->dn_ptr);
 261         old = dn_db->parms.forwarding;
 262 
 263         err = proc_dointvec(table, write, buffer, lenp, ppos);
 264 
 265         if ((err >= 0) && write) {
 266                 if (dn_db->parms.forwarding < 0)
 267                         dn_db->parms.forwarding = 0;
 268                 if (dn_db->parms.forwarding > 2)
 269                         dn_db->parms.forwarding = 2;
 270                 /*
 271                  * What an ugly hack this is... its works, just. It
 272                  * would be nice if sysctl/proc were just that little
 273                  * bit more flexible so I don't have to write a special
 274                  * routine, or suffer hacks like this - SJW
 275                  */
 276                 tmp = dn_db->parms.forwarding;
 277                 dn_db->parms.forwarding = old;
 278                 if (dn_db->parms.down)
 279                         dn_db->parms.down(dev);
 280                 dn_db->parms.forwarding = tmp;
 281                 if (dn_db->parms.up)
 282                         dn_db->parms.up(dev);
 283         }
 284 
 285         return err;
 286 #else
 287         return -EINVAL;
 288 #endif
 289 }
 290 
 291 #else /* CONFIG_SYSCTL */
 292 static void dn_dev_sysctl_unregister(struct dn_dev_parms *parms)
 293 {
 294 }
 295 static void dn_dev_sysctl_register(struct net_device *dev, struct dn_dev_parms *parms)
 296 {
 297 }
 298 
 299 #endif /* CONFIG_SYSCTL */
 300 
 301 static inline __u16 mtu2blksize(struct net_device *dev)
 302 {
 303         u32 blksize = dev->mtu;
 304         if (blksize > 0xffff)
 305                 blksize = 0xffff;
 306 
 307         if (dev->type == ARPHRD_ETHER ||
 308             dev->type == ARPHRD_PPP ||
 309             dev->type == ARPHRD_IPGRE ||
 310             dev->type == ARPHRD_LOOPBACK)
 311                 blksize -= 2;
 312 
 313         return (__u16)blksize;
 314 }
 315 
 316 static struct dn_ifaddr *dn_dev_alloc_ifa(void)
 317 {
 318         struct dn_ifaddr *ifa;
 319 
 320         ifa = kzalloc(sizeof(*ifa), GFP_KERNEL);
 321 
 322         return ifa;
 323 }
 324 
 325 static void dn_dev_free_ifa(struct dn_ifaddr *ifa)
 326 {
 327         kfree_rcu(ifa, rcu);
 328 }
 329 
 330 static void dn_dev_del_ifa(struct dn_dev *dn_db, struct dn_ifaddr __rcu **ifap, int destroy)
 331 {
 332         struct dn_ifaddr *ifa1 = rtnl_dereference(*ifap);
 333         unsigned char mac_addr[6];
 334         struct net_device *dev = dn_db->dev;
 335 
 336         ASSERT_RTNL();
 337 
 338         *ifap = ifa1->ifa_next;
 339 
 340         if (dn_db->dev->type == ARPHRD_ETHER) {
 341                 if (ifa1->ifa_local != dn_eth2dn(dev->dev_addr)) {
 342                         dn_dn2eth(mac_addr, ifa1->ifa_local);
 343                         dev_mc_del(dev, mac_addr);
 344                 }
 345         }
 346 
 347         dn_ifaddr_notify(RTM_DELADDR, ifa1);
 348         blocking_notifier_call_chain(&dnaddr_chain, NETDEV_DOWN, ifa1);
 349         if (destroy) {
 350                 dn_dev_free_ifa(ifa1);
 351 
 352                 if (dn_db->ifa_list == NULL)
 353                         dn_dev_delete(dn_db->dev);
 354         }
 355 }
 356 
 357 static int dn_dev_insert_ifa(struct dn_dev *dn_db, struct dn_ifaddr *ifa)
 358 {
 359         struct net_device *dev = dn_db->dev;
 360         struct dn_ifaddr *ifa1;
 361         unsigned char mac_addr[6];
 362 
 363         ASSERT_RTNL();
 364 
 365         /* Check for duplicates */
 366         for (ifa1 = rtnl_dereference(dn_db->ifa_list);
 367              ifa1 != NULL;
 368              ifa1 = rtnl_dereference(ifa1->ifa_next)) {
 369                 if (ifa1->ifa_local == ifa->ifa_local)
 370                         return -EEXIST;
 371         }
 372 
 373         if (dev->type == ARPHRD_ETHER) {
 374                 if (ifa->ifa_local != dn_eth2dn(dev->dev_addr)) {
 375                         dn_dn2eth(mac_addr, ifa->ifa_local);
 376                         dev_mc_add(dev, mac_addr);
 377                 }
 378         }
 379 
 380         ifa->ifa_next = dn_db->ifa_list;
 381         rcu_assign_pointer(dn_db->ifa_list, ifa);
 382 
 383         dn_ifaddr_notify(RTM_NEWADDR, ifa);
 384         blocking_notifier_call_chain(&dnaddr_chain, NETDEV_UP, ifa);
 385 
 386         return 0;
 387 }
 388 
 389 static int dn_dev_set_ifa(struct net_device *dev, struct dn_ifaddr *ifa)
 390 {
 391         struct dn_dev *dn_db = rtnl_dereference(dev->dn_ptr);
 392         int rv;
 393 
 394         if (dn_db == NULL) {
 395                 int err;
 396                 dn_db = dn_dev_create(dev, &err);
 397                 if (dn_db == NULL)
 398                         return err;
 399         }
 400 
 401         ifa->ifa_dev = dn_db;
 402 
 403         if (dev->flags & IFF_LOOPBACK)
 404                 ifa->ifa_scope = RT_SCOPE_HOST;
 405 
 406         rv = dn_dev_insert_ifa(dn_db, ifa);
 407         if (rv)
 408                 dn_dev_free_ifa(ifa);
 409         return rv;
 410 }
 411 
 412 
 413 int dn_dev_ioctl(unsigned int cmd, void __user *arg)
 414 {
 415         char buffer[DN_IFREQ_SIZE];
 416         struct ifreq *ifr = (struct ifreq *)buffer;
 417         struct sockaddr_dn *sdn = (struct sockaddr_dn *)&ifr->ifr_addr;
 418         struct dn_dev *dn_db;
 419         struct net_device *dev;
 420         struct dn_ifaddr *ifa = NULL;
 421         struct dn_ifaddr __rcu **ifap = NULL;
 422         int ret = 0;
 423 
 424         if (copy_from_user(ifr, arg, DN_IFREQ_SIZE))
 425                 return -EFAULT;
 426         ifr->ifr_name[IFNAMSIZ-1] = 0;
 427 
 428         dev_load(&init_net, ifr->ifr_name);
 429 
 430         switch (cmd) {
 431         case SIOCGIFADDR:
 432                 break;
 433         case SIOCSIFADDR:
 434                 if (!capable(CAP_NET_ADMIN))
 435                         return -EACCES;
 436                 if (sdn->sdn_family != AF_DECnet)
 437                         return -EINVAL;
 438                 break;
 439         default:
 440                 return -EINVAL;
 441         }
 442 
 443         rtnl_lock();
 444 
 445         if ((dev = __dev_get_by_name(&init_net, ifr->ifr_name)) == NULL) {
 446                 ret = -ENODEV;
 447                 goto done;
 448         }
 449 
 450         if ((dn_db = rtnl_dereference(dev->dn_ptr)) != NULL) {
 451                 for (ifap = &dn_db->ifa_list;
 452                      (ifa = rtnl_dereference(*ifap)) != NULL;
 453                      ifap = &ifa->ifa_next)
 454                         if (strcmp(ifr->ifr_name, ifa->ifa_label) == 0)
 455                                 break;
 456         }
 457 
 458         if (ifa == NULL && cmd != SIOCSIFADDR) {
 459                 ret = -EADDRNOTAVAIL;
 460                 goto done;
 461         }
 462 
 463         switch (cmd) {
 464         case SIOCGIFADDR:
 465                 *((__le16 *)sdn->sdn_nodeaddr) = ifa->ifa_local;
 466                 goto rarok;
 467 
 468         case SIOCSIFADDR:
 469                 if (!ifa) {
 470                         if ((ifa = dn_dev_alloc_ifa()) == NULL) {
 471                                 ret = -ENOBUFS;
 472                                 break;
 473                         }
 474                         memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
 475                 } else {
 476                         if (ifa->ifa_local == dn_saddr2dn(sdn))
 477                                 break;
 478                         dn_dev_del_ifa(dn_db, ifap, 0);
 479                 }
 480 
 481                 ifa->ifa_local = ifa->ifa_address = dn_saddr2dn(sdn);
 482 
 483                 ret = dn_dev_set_ifa(dev, ifa);
 484         }
 485 done:
 486         rtnl_unlock();
 487 
 488         return ret;
 489 rarok:
 490         if (copy_to_user(arg, ifr, DN_IFREQ_SIZE))
 491                 ret = -EFAULT;
 492         goto done;
 493 }
 494 
 495 struct net_device *dn_dev_get_default(void)
 496 {
 497         struct net_device *dev;
 498 
 499         spin_lock(&dndev_lock);
 500         dev = decnet_default_device;
 501         if (dev) {
 502                 if (dev->dn_ptr)
 503                         dev_hold(dev);
 504                 else
 505                         dev = NULL;
 506         }
 507         spin_unlock(&dndev_lock);
 508 
 509         return dev;
 510 }
 511 
 512 int dn_dev_set_default(struct net_device *dev, int force)
 513 {
 514         struct net_device *old = NULL;
 515         int rv = -EBUSY;
 516         if (!dev->dn_ptr)
 517                 return -ENODEV;
 518 
 519         spin_lock(&dndev_lock);
 520         if (force || decnet_default_device == NULL) {
 521                 old = decnet_default_device;
 522                 decnet_default_device = dev;
 523                 rv = 0;
 524         }
 525         spin_unlock(&dndev_lock);
 526 
 527         if (old)
 528                 dev_put(old);
 529         return rv;
 530 }
 531 
 532 static void dn_dev_check_default(struct net_device *dev)
 533 {
 534         spin_lock(&dndev_lock);
 535         if (dev == decnet_default_device) {
 536                 decnet_default_device = NULL;
 537         } else {
 538                 dev = NULL;
 539         }
 540         spin_unlock(&dndev_lock);
 541 
 542         if (dev)
 543                 dev_put(dev);
 544 }
 545 
 546 /*
 547  * Called with RTNL
 548  */
 549 static struct dn_dev *dn_dev_by_index(int ifindex)
 550 {
 551         struct net_device *dev;
 552         struct dn_dev *dn_dev = NULL;
 553 
 554         dev = __dev_get_by_index(&init_net, ifindex);
 555         if (dev)
 556                 dn_dev = rtnl_dereference(dev->dn_ptr);
 557 
 558         return dn_dev;
 559 }
 560 
 561 static const struct nla_policy dn_ifa_policy[IFA_MAX+1] = {
 562         [IFA_ADDRESS]           = { .type = NLA_U16 },
 563         [IFA_LOCAL]             = { .type = NLA_U16 },
 564         [IFA_LABEL]             = { .type = NLA_STRING,
 565                                     .len = IFNAMSIZ - 1 },
 566         [IFA_FLAGS]             = { .type = NLA_U32 },
 567 };
 568 
 569 static int dn_nl_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh,
 570                          struct netlink_ext_ack *extack)
 571 {
 572         struct net *net = sock_net(skb->sk);
 573         struct nlattr *tb[IFA_MAX+1];
 574         struct dn_dev *dn_db;
 575         struct ifaddrmsg *ifm;
 576         struct dn_ifaddr *ifa;
 577         struct dn_ifaddr __rcu **ifap;
 578         int err = -EINVAL;
 579 
 580         if (!netlink_capable(skb, CAP_NET_ADMIN))
 581                 return -EPERM;
 582 
 583         if (!net_eq(net, &init_net))
 584                 goto errout;
 585 
 586         err = nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFA_MAX,
 587                                      dn_ifa_policy, extack);
 588         if (err < 0)
 589                 goto errout;
 590 
 591         err = -ENODEV;
 592         ifm = nlmsg_data(nlh);
 593         if ((dn_db = dn_dev_by_index(ifm->ifa_index)) == NULL)
 594                 goto errout;
 595 
 596         err = -EADDRNOTAVAIL;
 597         for (ifap = &dn_db->ifa_list;
 598              (ifa = rtnl_dereference(*ifap)) != NULL;
 599              ifap = &ifa->ifa_next) {
 600                 if (tb[IFA_LOCAL] &&
 601                     nla_memcmp(tb[IFA_LOCAL], &ifa->ifa_local, 2))
 602                         continue;
 603 
 604                 if (tb[IFA_LABEL] && nla_strcmp(tb[IFA_LABEL], ifa->ifa_label))
 605                         continue;
 606 
 607                 dn_dev_del_ifa(dn_db, ifap, 1);
 608                 return 0;
 609         }
 610 
 611 errout:
 612         return err;
 613 }
 614 
 615 static int dn_nl_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh,
 616                          struct netlink_ext_ack *extack)
 617 {
 618         struct net *net = sock_net(skb->sk);
 619         struct nlattr *tb[IFA_MAX+1];
 620         struct net_device *dev;
 621         struct dn_dev *dn_db;
 622         struct ifaddrmsg *ifm;
 623         struct dn_ifaddr *ifa;
 624         int err;
 625 
 626         if (!netlink_capable(skb, CAP_NET_ADMIN))
 627                 return -EPERM;
 628 
 629         if (!net_eq(net, &init_net))
 630                 return -EINVAL;
 631 
 632         err = nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFA_MAX,
 633                                      dn_ifa_policy, extack);
 634         if (err < 0)
 635                 return err;
 636 
 637         if (tb[IFA_LOCAL] == NULL)
 638                 return -EINVAL;
 639 
 640         ifm = nlmsg_data(nlh);
 641         if ((dev = __dev_get_by_index(&init_net, ifm->ifa_index)) == NULL)
 642                 return -ENODEV;
 643 
 644         if ((dn_db = rtnl_dereference(dev->dn_ptr)) == NULL) {
 645                 dn_db = dn_dev_create(dev, &err);
 646                 if (!dn_db)
 647                         return err;
 648         }
 649 
 650         if ((ifa = dn_dev_alloc_ifa()) == NULL)
 651                 return -ENOBUFS;
 652 
 653         if (tb[IFA_ADDRESS] == NULL)
 654                 tb[IFA_ADDRESS] = tb[IFA_LOCAL];
 655 
 656         ifa->ifa_local = nla_get_le16(tb[IFA_LOCAL]);
 657         ifa->ifa_address = nla_get_le16(tb[IFA_ADDRESS]);
 658         ifa->ifa_flags = tb[IFA_FLAGS] ? nla_get_u32(tb[IFA_FLAGS]) :
 659                                          ifm->ifa_flags;
 660         ifa->ifa_scope = ifm->ifa_scope;
 661         ifa->ifa_dev = dn_db;
 662 
 663         if (tb[IFA_LABEL])
 664                 nla_strlcpy(ifa->ifa_label, tb[IFA_LABEL], IFNAMSIZ);
 665         else
 666                 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
 667 
 668         err = dn_dev_insert_ifa(dn_db, ifa);
 669         if (err)
 670                 dn_dev_free_ifa(ifa);
 671 
 672         return err;
 673 }
 674 
 675 static inline size_t dn_ifaddr_nlmsg_size(void)
 676 {
 677         return NLMSG_ALIGN(sizeof(struct ifaddrmsg))
 678                + nla_total_size(IFNAMSIZ) /* IFA_LABEL */
 679                + nla_total_size(2) /* IFA_ADDRESS */
 680                + nla_total_size(2) /* IFA_LOCAL */
 681                + nla_total_size(4); /* IFA_FLAGS */
 682 }
 683 
 684 static int dn_nl_fill_ifaddr(struct sk_buff *skb, struct dn_ifaddr *ifa,
 685                              u32 portid, u32 seq, int event, unsigned int flags)
 686 {
 687         struct ifaddrmsg *ifm;
 688         struct nlmsghdr *nlh;
 689         u32 ifa_flags = ifa->ifa_flags | IFA_F_PERMANENT;
 690 
 691         nlh = nlmsg_put(skb, portid, seq, event, sizeof(*ifm), flags);
 692         if (nlh == NULL)
 693                 return -EMSGSIZE;
 694 
 695         ifm = nlmsg_data(nlh);
 696         ifm->ifa_family = AF_DECnet;
 697         ifm->ifa_prefixlen = 16;
 698         ifm->ifa_flags = ifa_flags;
 699         ifm->ifa_scope = ifa->ifa_scope;
 700         ifm->ifa_index = ifa->ifa_dev->dev->ifindex;
 701 
 702         if ((ifa->ifa_address &&
 703              nla_put_le16(skb, IFA_ADDRESS, ifa->ifa_address)) ||
 704             (ifa->ifa_local &&
 705              nla_put_le16(skb, IFA_LOCAL, ifa->ifa_local)) ||
 706             (ifa->ifa_label[0] &&
 707              nla_put_string(skb, IFA_LABEL, ifa->ifa_label)) ||
 708              nla_put_u32(skb, IFA_FLAGS, ifa_flags))
 709                 goto nla_put_failure;
 710         nlmsg_end(skb, nlh);
 711         return 0;
 712 
 713 nla_put_failure:
 714         nlmsg_cancel(skb, nlh);
 715         return -EMSGSIZE;
 716 }
 717 
 718 static void dn_ifaddr_notify(int event, struct dn_ifaddr *ifa)
 719 {
 720         struct sk_buff *skb;
 721         int err = -ENOBUFS;
 722 
 723         skb = alloc_skb(dn_ifaddr_nlmsg_size(), GFP_KERNEL);
 724         if (skb == NULL)
 725                 goto errout;
 726 
 727         err = dn_nl_fill_ifaddr(skb, ifa, 0, 0, event, 0);
 728         if (err < 0) {
 729                 /* -EMSGSIZE implies BUG in dn_ifaddr_nlmsg_size() */
 730                 WARN_ON(err == -EMSGSIZE);
 731                 kfree_skb(skb);
 732                 goto errout;
 733         }
 734         rtnl_notify(skb, &init_net, 0, RTNLGRP_DECnet_IFADDR, NULL, GFP_KERNEL);
 735         return;
 736 errout:
 737         if (err < 0)
 738                 rtnl_set_sk_err(&init_net, RTNLGRP_DECnet_IFADDR, err);
 739 }
 740 
 741 static int dn_nl_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
 742 {
 743         struct net *net = sock_net(skb->sk);
 744         int idx, dn_idx = 0, skip_ndevs, skip_naddr;
 745         struct net_device *dev;
 746         struct dn_dev *dn_db;
 747         struct dn_ifaddr *ifa;
 748 
 749         if (!net_eq(net, &init_net))
 750                 return 0;
 751 
 752         skip_ndevs = cb->args[0];
 753         skip_naddr = cb->args[1];
 754 
 755         idx = 0;
 756         rcu_read_lock();
 757         for_each_netdev_rcu(&init_net, dev) {
 758                 if (idx < skip_ndevs)
 759                         goto cont;
 760                 else if (idx > skip_ndevs) {
 761                         /* Only skip over addresses for first dev dumped
 762                          * in this iteration (idx == skip_ndevs) */
 763                         skip_naddr = 0;
 764                 }
 765 
 766                 if ((dn_db = rcu_dereference(dev->dn_ptr)) == NULL)
 767                         goto cont;
 768 
 769                 for (ifa = rcu_dereference(dn_db->ifa_list), dn_idx = 0; ifa;
 770                      ifa = rcu_dereference(ifa->ifa_next), dn_idx++) {
 771                         if (dn_idx < skip_naddr)
 772                                 continue;
 773 
 774                         if (dn_nl_fill_ifaddr(skb, ifa, NETLINK_CB(cb->skb).portid,
 775                                               cb->nlh->nlmsg_seq, RTM_NEWADDR,
 776                                               NLM_F_MULTI) < 0)
 777                                 goto done;
 778                 }
 779 cont:
 780                 idx++;
 781         }
 782 done:
 783         rcu_read_unlock();
 784         cb->args[0] = idx;
 785         cb->args[1] = dn_idx;
 786 
 787         return skb->len;
 788 }
 789 
 790 static int dn_dev_get_first(struct net_device *dev, __le16 *addr)
 791 {
 792         struct dn_dev *dn_db;
 793         struct dn_ifaddr *ifa;
 794         int rv = -ENODEV;
 795 
 796         rcu_read_lock();
 797         dn_db = rcu_dereference(dev->dn_ptr);
 798         if (dn_db == NULL)
 799                 goto out;
 800 
 801         ifa = rcu_dereference(dn_db->ifa_list);
 802         if (ifa != NULL) {
 803                 *addr = ifa->ifa_local;
 804                 rv = 0;
 805         }
 806 out:
 807         rcu_read_unlock();
 808         return rv;
 809 }
 810 
 811 /*
 812  * Find a default address to bind to.
 813  *
 814  * This is one of those areas where the initial VMS concepts don't really
 815  * map onto the Linux concepts, and since we introduced multiple addresses
 816  * per interface we have to cope with slightly odd ways of finding out what
 817  * "our address" really is. Mostly it's not a problem; for this we just guess
 818  * a sensible default. Eventually the routing code will take care of all the
 819  * nasties for us I hope.
 820  */
 821 int dn_dev_bind_default(__le16 *addr)
 822 {
 823         struct net_device *dev;
 824         int rv;
 825         dev = dn_dev_get_default();
 826 last_chance:
 827         if (dev) {
 828                 rv = dn_dev_get_first(dev, addr);
 829                 dev_put(dev);
 830                 if (rv == 0 || dev == init_net.loopback_dev)
 831                         return rv;
 832         }
 833         dev = init_net.loopback_dev;
 834         dev_hold(dev);
 835         goto last_chance;
 836 }
 837 
 838 static void dn_send_endnode_hello(struct net_device *dev, struct dn_ifaddr *ifa)
 839 {
 840         struct endnode_hello_message *msg;
 841         struct sk_buff *skb = NULL;
 842         __le16 *pktlen;
 843         struct dn_dev *dn_db = rcu_dereference_raw(dev->dn_ptr);
 844 
 845         if ((skb = dn_alloc_skb(NULL, sizeof(*msg), GFP_ATOMIC)) == NULL)
 846                 return;
 847 
 848         skb->dev = dev;
 849 
 850         msg = skb_put(skb, sizeof(*msg));
 851 
 852         msg->msgflg  = 0x0D;
 853         memcpy(msg->tiver, dn_eco_version, 3);
 854         dn_dn2eth(msg->id, ifa->ifa_local);
 855         msg->iinfo   = DN_RT_INFO_ENDN;
 856         msg->blksize = cpu_to_le16(mtu2blksize(dev));
 857         msg->area    = 0x00;
 858         memset(msg->seed, 0, 8);
 859         memcpy(msg->neighbor, dn_hiord, ETH_ALEN);
 860 
 861         if (dn_db->router) {
 862                 struct dn_neigh *dn = (struct dn_neigh *)dn_db->router;
 863                 dn_dn2eth(msg->neighbor, dn->addr);
 864         }
 865 
 866         msg->timer   = cpu_to_le16((unsigned short)dn_db->parms.t3);
 867         msg->mpd     = 0x00;
 868         msg->datalen = 0x02;
 869         memset(msg->data, 0xAA, 2);
 870 
 871         pktlen = skb_push(skb, 2);
 872         *pktlen = cpu_to_le16(skb->len - 2);
 873 
 874         skb_reset_network_header(skb);
 875 
 876         dn_rt_finish_output(skb, dn_rt_all_rt_mcast, msg->id);
 877 }
 878 
 879 
 880 #define DRDELAY (5 * HZ)
 881 
 882 static int dn_am_i_a_router(struct dn_neigh *dn, struct dn_dev *dn_db, struct dn_ifaddr *ifa)
 883 {
 884         /* First check time since device went up */
 885         if (time_before(jiffies, dn_db->uptime + DRDELAY))
 886                 return 0;
 887 
 888         /* If there is no router, then yes... */
 889         if (!dn_db->router)
 890                 return 1;
 891 
 892         /* otherwise only if we have a higher priority or.. */
 893         if (dn->priority < dn_db->parms.priority)
 894                 return 1;
 895 
 896         /* if we have equal priority and a higher node number */
 897         if (dn->priority != dn_db->parms.priority)
 898                 return 0;
 899 
 900         if (le16_to_cpu(dn->addr) < le16_to_cpu(ifa->ifa_local))
 901                 return 1;
 902 
 903         return 0;
 904 }
 905 
 906 static void dn_send_router_hello(struct net_device *dev, struct dn_ifaddr *ifa)
 907 {
 908         int n;
 909         struct dn_dev *dn_db = rcu_dereference_raw(dev->dn_ptr);
 910         struct dn_neigh *dn = (struct dn_neigh *)dn_db->router;
 911         struct sk_buff *skb;
 912         size_t size;
 913         unsigned char *ptr;
 914         unsigned char *i1, *i2;
 915         __le16 *pktlen;
 916         char *src;
 917 
 918         if (mtu2blksize(dev) < (26 + 7))
 919                 return;
 920 
 921         n = mtu2blksize(dev) - 26;
 922         n /= 7;
 923 
 924         if (n > 32)
 925                 n = 32;
 926 
 927         size = 2 + 26 + 7 * n;
 928 
 929         if ((skb = dn_alloc_skb(NULL, size, GFP_ATOMIC)) == NULL)
 930                 return;
 931 
 932         skb->dev = dev;
 933         ptr = skb_put(skb, size);
 934 
 935         *ptr++ = DN_RT_PKT_CNTL | DN_RT_PKT_ERTH;
 936         *ptr++ = 2; /* ECO */
 937         *ptr++ = 0;
 938         *ptr++ = 0;
 939         dn_dn2eth(ptr, ifa->ifa_local);
 940         src = ptr;
 941         ptr += ETH_ALEN;
 942         *ptr++ = dn_db->parms.forwarding == 1 ?
 943                         DN_RT_INFO_L1RT : DN_RT_INFO_L2RT;
 944         *((__le16 *)ptr) = cpu_to_le16(mtu2blksize(dev));
 945         ptr += 2;
 946         *ptr++ = dn_db->parms.priority; /* Priority */
 947         *ptr++ = 0; /* Area: Reserved */
 948         *((__le16 *)ptr) = cpu_to_le16((unsigned short)dn_db->parms.t3);
 949         ptr += 2;
 950         *ptr++ = 0; /* MPD: Reserved */
 951         i1 = ptr++;
 952         memset(ptr, 0, 7); /* Name: Reserved */
 953         ptr += 7;
 954         i2 = ptr++;
 955 
 956         n = dn_neigh_elist(dev, ptr, n);
 957 
 958         *i2 = 7 * n;
 959         *i1 = 8 + *i2;
 960 
 961         skb_trim(skb, (27 + *i2));
 962 
 963         pktlen = skb_push(skb, 2);
 964         *pktlen = cpu_to_le16(skb->len - 2);
 965 
 966         skb_reset_network_header(skb);
 967 
 968         if (dn_am_i_a_router(dn, dn_db, ifa)) {
 969                 struct sk_buff *skb2 = skb_copy(skb, GFP_ATOMIC);
 970                 if (skb2) {
 971                         dn_rt_finish_output(skb2, dn_rt_all_end_mcast, src);
 972                 }
 973         }
 974 
 975         dn_rt_finish_output(skb, dn_rt_all_rt_mcast, src);
 976 }
 977 
 978 static void dn_send_brd_hello(struct net_device *dev, struct dn_ifaddr *ifa)
 979 {
 980         struct dn_dev *dn_db = rcu_dereference_raw(dev->dn_ptr);
 981 
 982         if (dn_db->parms.forwarding == 0)
 983                 dn_send_endnode_hello(dev, ifa);
 984         else
 985                 dn_send_router_hello(dev, ifa);
 986 }
 987 
 988 static void dn_send_ptp_hello(struct net_device *dev, struct dn_ifaddr *ifa)
 989 {
 990         int tdlen = 16;
 991         int size = dev->hard_header_len + 2 + 4 + tdlen;
 992         struct sk_buff *skb = dn_alloc_skb(NULL, size, GFP_ATOMIC);
 993         int i;
 994         unsigned char *ptr;
 995         char src[ETH_ALEN];
 996 
 997         if (skb == NULL)
 998                 return ;
 999 
1000         skb->dev = dev;
1001         skb_push(skb, dev->hard_header_len);
1002         ptr = skb_put(skb, 2 + 4 + tdlen);
1003 
1004         *ptr++ = DN_RT_PKT_HELO;
1005         *((__le16 *)ptr) = ifa->ifa_local;
1006         ptr += 2;
1007         *ptr++ = tdlen;
1008 
1009         for(i = 0; i < tdlen; i++)
1010                 *ptr++ = 0252;
1011 
1012         dn_dn2eth(src, ifa->ifa_local);
1013         dn_rt_finish_output(skb, dn_rt_all_rt_mcast, src);
1014 }
1015 
1016 static int dn_eth_up(struct net_device *dev)
1017 {
1018         struct dn_dev *dn_db = rcu_dereference_raw(dev->dn_ptr);
1019 
1020         if (dn_db->parms.forwarding == 0)
1021                 dev_mc_add(dev, dn_rt_all_end_mcast);
1022         else
1023                 dev_mc_add(dev, dn_rt_all_rt_mcast);
1024 
1025         dn_db->use_long = 1;
1026 
1027         return 0;
1028 }
1029 
1030 static void dn_eth_down(struct net_device *dev)
1031 {
1032         struct dn_dev *dn_db = rcu_dereference_raw(dev->dn_ptr);
1033 
1034         if (dn_db->parms.forwarding == 0)
1035                 dev_mc_del(dev, dn_rt_all_end_mcast);
1036         else
1037                 dev_mc_del(dev, dn_rt_all_rt_mcast);
1038 }
1039 
1040 static void dn_dev_set_timer(struct net_device *dev);
1041 
1042 static void dn_dev_timer_func(struct timer_list *t)
1043 {
1044         struct dn_dev *dn_db = from_timer(dn_db, t, timer);
1045         struct net_device *dev;
1046         struct dn_ifaddr *ifa;
1047 
1048         rcu_read_lock();
1049         dev = dn_db->dev;
1050         if (dn_db->t3 <= dn_db->parms.t2) {
1051                 if (dn_db->parms.timer3) {
1052                         for (ifa = rcu_dereference(dn_db->ifa_list);
1053                              ifa;
1054                              ifa = rcu_dereference(ifa->ifa_next)) {
1055                                 if (!(ifa->ifa_flags & IFA_F_SECONDARY))
1056                                         dn_db->parms.timer3(dev, ifa);
1057                         }
1058                 }
1059                 dn_db->t3 = dn_db->parms.t3;
1060         } else {
1061                 dn_db->t3 -= dn_db->parms.t2;
1062         }
1063         rcu_read_unlock();
1064         dn_dev_set_timer(dev);
1065 }
1066 
1067 static void dn_dev_set_timer(struct net_device *dev)
1068 {
1069         struct dn_dev *dn_db = rcu_dereference_raw(dev->dn_ptr);
1070 
1071         if (dn_db->parms.t2 > dn_db->parms.t3)
1072                 dn_db->parms.t2 = dn_db->parms.t3;
1073 
1074         dn_db->timer.expires = jiffies + (dn_db->parms.t2 * HZ);
1075 
1076         add_timer(&dn_db->timer);
1077 }
1078 
1079 static struct dn_dev *dn_dev_create(struct net_device *dev, int *err)
1080 {
1081         int i;
1082         struct dn_dev_parms *p = dn_dev_list;
1083         struct dn_dev *dn_db;
1084 
1085         for(i = 0; i < DN_DEV_LIST_SIZE; i++, p++) {
1086                 if (p->type == dev->type)
1087                         break;
1088         }
1089 
1090         *err = -ENODEV;
1091         if (i == DN_DEV_LIST_SIZE)
1092                 return NULL;
1093 
1094         *err = -ENOBUFS;
1095         if ((dn_db = kzalloc(sizeof(struct dn_dev), GFP_ATOMIC)) == NULL)
1096                 return NULL;
1097 
1098         memcpy(&dn_db->parms, p, sizeof(struct dn_dev_parms));
1099 
1100         rcu_assign_pointer(dev->dn_ptr, dn_db);
1101         dn_db->dev = dev;
1102         timer_setup(&dn_db->timer, dn_dev_timer_func, 0);
1103 
1104         dn_db->uptime = jiffies;
1105 
1106         dn_db->neigh_parms = neigh_parms_alloc(dev, &dn_neigh_table);
1107         if (!dn_db->neigh_parms) {
1108                 RCU_INIT_POINTER(dev->dn_ptr, NULL);
1109                 kfree(dn_db);
1110                 return NULL;
1111         }
1112 
1113         if (dn_db->parms.up) {
1114                 if (dn_db->parms.up(dev) < 0) {
1115                         neigh_parms_release(&dn_neigh_table, dn_db->neigh_parms);
1116                         dev->dn_ptr = NULL;
1117                         kfree(dn_db);
1118                         return NULL;
1119                 }
1120         }
1121 
1122         dn_dev_sysctl_register(dev, &dn_db->parms);
1123 
1124         dn_dev_set_timer(dev);
1125 
1126         *err = 0;
1127         return dn_db;
1128 }
1129 
1130 
1131 /*
1132  * This processes a device up event. We only start up
1133  * the loopback device & ethernet devices with correct
1134  * MAC addresses automatically. Others must be started
1135  * specifically.
1136  *
1137  * FIXME: How should we configure the loopback address ? If we could dispense
1138  * with using decnet_address here and for autobind, it will be one less thing
1139  * for users to worry about setting up.
1140  */
1141 
1142 void dn_dev_up(struct net_device *dev)
1143 {
1144         struct dn_ifaddr *ifa;
1145         __le16 addr = decnet_address;
1146         int maybe_default = 0;
1147         struct dn_dev *dn_db = rtnl_dereference(dev->dn_ptr);
1148 
1149         if ((dev->type != ARPHRD_ETHER) && (dev->type != ARPHRD_LOOPBACK))
1150                 return;
1151 
1152         /*
1153          * Need to ensure that loopback device has a dn_db attached to it
1154          * to allow creation of neighbours against it, even though it might
1155          * not have a local address of its own. Might as well do the same for
1156          * all autoconfigured interfaces.
1157          */
1158         if (dn_db == NULL) {
1159                 int err;
1160                 dn_db = dn_dev_create(dev, &err);
1161                 if (dn_db == NULL)
1162                         return;
1163         }
1164 
1165         if (dev->type == ARPHRD_ETHER) {
1166                 if (memcmp(dev->dev_addr, dn_hiord, 4) != 0)
1167                         return;
1168                 addr = dn_eth2dn(dev->dev_addr);
1169                 maybe_default = 1;
1170         }
1171 
1172         if (addr == 0)
1173                 return;
1174 
1175         if ((ifa = dn_dev_alloc_ifa()) == NULL)
1176                 return;
1177 
1178         ifa->ifa_local = ifa->ifa_address = addr;
1179         ifa->ifa_flags = 0;
1180         ifa->ifa_scope = RT_SCOPE_UNIVERSE;
1181         strcpy(ifa->ifa_label, dev->name);
1182 
1183         dn_dev_set_ifa(dev, ifa);
1184 
1185         /*
1186          * Automagically set the default device to the first automatically
1187          * configured ethernet card in the system.
1188          */
1189         if (maybe_default) {
1190                 dev_hold(dev);
1191                 if (dn_dev_set_default(dev, 0))
1192                         dev_put(dev);
1193         }
1194 }
1195 
1196 static void dn_dev_delete(struct net_device *dev)
1197 {
1198         struct dn_dev *dn_db = rtnl_dereference(dev->dn_ptr);
1199 
1200         if (dn_db == NULL)
1201                 return;
1202 
1203         del_timer_sync(&dn_db->timer);
1204         dn_dev_sysctl_unregister(&dn_db->parms);
1205         dn_dev_check_default(dev);
1206         neigh_ifdown(&dn_neigh_table, dev);
1207 
1208         if (dn_db->parms.down)
1209                 dn_db->parms.down(dev);
1210 
1211         dev->dn_ptr = NULL;
1212 
1213         neigh_parms_release(&dn_neigh_table, dn_db->neigh_parms);
1214         neigh_ifdown(&dn_neigh_table, dev);
1215 
1216         if (dn_db->router)
1217                 neigh_release(dn_db->router);
1218         if (dn_db->peer)
1219                 neigh_release(dn_db->peer);
1220 
1221         kfree(dn_db);
1222 }
1223 
1224 void dn_dev_down(struct net_device *dev)
1225 {
1226         struct dn_dev *dn_db = rtnl_dereference(dev->dn_ptr);
1227         struct dn_ifaddr *ifa;
1228 
1229         if (dn_db == NULL)
1230                 return;
1231 
1232         while ((ifa = rtnl_dereference(dn_db->ifa_list)) != NULL) {
1233                 dn_dev_del_ifa(dn_db, &dn_db->ifa_list, 0);
1234                 dn_dev_free_ifa(ifa);
1235         }
1236 
1237         dn_dev_delete(dev);
1238 }
1239 
1240 void dn_dev_init_pkt(struct sk_buff *skb)
1241 {
1242 }
1243 
1244 void dn_dev_veri_pkt(struct sk_buff *skb)
1245 {
1246 }
1247 
1248 void dn_dev_hello(struct sk_buff *skb)
1249 {
1250 }
1251 
1252 void dn_dev_devices_off(void)
1253 {
1254         struct net_device *dev;
1255 
1256         rtnl_lock();
1257         for_each_netdev(&init_net, dev)
1258                 dn_dev_down(dev);
1259         rtnl_unlock();
1260 
1261 }
1262 
1263 void dn_dev_devices_on(void)
1264 {
1265         struct net_device *dev;
1266 
1267         rtnl_lock();
1268         for_each_netdev(&init_net, dev) {
1269                 if (dev->flags & IFF_UP)
1270                         dn_dev_up(dev);
1271         }
1272         rtnl_unlock();
1273 }
1274 
1275 int register_dnaddr_notifier(struct notifier_block *nb)
1276 {
1277         return blocking_notifier_chain_register(&dnaddr_chain, nb);
1278 }
1279 
1280 int unregister_dnaddr_notifier(struct notifier_block *nb)
1281 {
1282         return blocking_notifier_chain_unregister(&dnaddr_chain, nb);
1283 }
1284 
1285 #ifdef CONFIG_PROC_FS
1286 static inline int is_dn_dev(struct net_device *dev)
1287 {
1288         return dev->dn_ptr != NULL;
1289 }
1290 
1291 static void *dn_dev_seq_start(struct seq_file *seq, loff_t *pos)
1292         __acquires(RCU)
1293 {
1294         int i;
1295         struct net_device *dev;
1296 
1297         rcu_read_lock();
1298 
1299         if (*pos == 0)
1300                 return SEQ_START_TOKEN;
1301 
1302         i = 1;
1303         for_each_netdev_rcu(&init_net, dev) {
1304                 if (!is_dn_dev(dev))
1305                         continue;
1306 
1307                 if (i++ == *pos)
1308                         return dev;
1309         }
1310 
1311         return NULL;
1312 }
1313 
1314 static void *dn_dev_seq_next(struct seq_file *seq, void *v, loff_t *pos)
1315 {
1316         struct net_device *dev;
1317 
1318         ++*pos;
1319 
1320         dev = v;
1321         if (v == SEQ_START_TOKEN)
1322                 dev = net_device_entry(&init_net.dev_base_head);
1323 
1324         for_each_netdev_continue_rcu(&init_net, dev) {
1325                 if (!is_dn_dev(dev))
1326                         continue;
1327 
1328                 return dev;
1329         }
1330 
1331         return NULL;
1332 }
1333 
1334 static void dn_dev_seq_stop(struct seq_file *seq, void *v)
1335         __releases(RCU)
1336 {
1337         rcu_read_unlock();
1338 }
1339 
1340 static char *dn_type2asc(char type)
1341 {
1342         switch (type) {
1343         case DN_DEV_BCAST:
1344                 return "B";
1345         case DN_DEV_UCAST:
1346                 return "U";
1347         case DN_DEV_MPOINT:
1348                 return "M";
1349         }
1350 
1351         return "?";
1352 }
1353 
1354 static int dn_dev_seq_show(struct seq_file *seq, void *v)
1355 {
1356         if (v == SEQ_START_TOKEN)
1357                 seq_puts(seq, "Name     Flags T1   Timer1 T3   Timer3 BlkSize Pri State DevType    Router Peer\n");
1358         else {
1359                 struct net_device *dev = v;
1360                 char peer_buf[DN_ASCBUF_LEN];
1361                 char router_buf[DN_ASCBUF_LEN];
1362                 struct dn_dev *dn_db = rcu_dereference(dev->dn_ptr);
1363 
1364                 seq_printf(seq, "%-8s %1s     %04u %04u   %04lu %04lu"
1365                                 "   %04hu    %03d %02x    %-10s %-7s %-7s\n",
1366                                 dev->name,
1367                                 dn_type2asc(dn_db->parms.mode),
1368                                 0, 0,
1369                                 dn_db->t3, dn_db->parms.t3,
1370                                 mtu2blksize(dev),
1371                                 dn_db->parms.priority,
1372                                 dn_db->parms.state, dn_db->parms.name,
1373                                 dn_db->router ? dn_addr2asc(le16_to_cpu(*(__le16 *)dn_db->router->primary_key), router_buf) : "",
1374                                 dn_db->peer ? dn_addr2asc(le16_to_cpu(*(__le16 *)dn_db->peer->primary_key), peer_buf) : "");
1375         }
1376         return 0;
1377 }
1378 
1379 static const struct seq_operations dn_dev_seq_ops = {
1380         .start  = dn_dev_seq_start,
1381         .next   = dn_dev_seq_next,
1382         .stop   = dn_dev_seq_stop,
1383         .show   = dn_dev_seq_show,
1384 };
1385 #endif /* CONFIG_PROC_FS */
1386 
1387 static int addr[2];
1388 module_param_array(addr, int, NULL, 0444);
1389 MODULE_PARM_DESC(addr, "The DECnet address of this machine: area,node");
1390 
1391 void __init dn_dev_init(void)
1392 {
1393         if (addr[0] > 63 || addr[0] < 0) {
1394                 printk(KERN_ERR "DECnet: Area must be between 0 and 63");
1395                 return;
1396         }
1397 
1398         if (addr[1] > 1023 || addr[1] < 0) {
1399                 printk(KERN_ERR "DECnet: Node must be between 0 and 1023");
1400                 return;
1401         }
1402 
1403         decnet_address = cpu_to_le16((addr[0] << 10) | addr[1]);
1404 
1405         dn_dev_devices_on();
1406 
1407         rtnl_register_module(THIS_MODULE, PF_DECnet, RTM_NEWADDR,
1408                              dn_nl_newaddr, NULL, 0);
1409         rtnl_register_module(THIS_MODULE, PF_DECnet, RTM_DELADDR,
1410                              dn_nl_deladdr, NULL, 0);
1411         rtnl_register_module(THIS_MODULE, PF_DECnet, RTM_GETADDR,
1412                              NULL, dn_nl_dump_ifaddr, 0);
1413 
1414         proc_create_seq("decnet_dev", 0444, init_net.proc_net, &dn_dev_seq_ops);
1415 
1416 #ifdef CONFIG_SYSCTL
1417         {
1418                 int i;
1419                 for(i = 0; i < DN_DEV_LIST_SIZE; i++)
1420                         dn_dev_sysctl_register(NULL, &dn_dev_list[i]);
1421         }
1422 #endif /* CONFIG_SYSCTL */
1423 }
1424 
1425 void __exit dn_dev_cleanup(void)
1426 {
1427 #ifdef CONFIG_SYSCTL
1428         {
1429                 int i;
1430                 for(i = 0; i < DN_DEV_LIST_SIZE; i++)
1431                         dn_dev_sysctl_unregister(&dn_dev_list[i]);
1432         }
1433 #endif /* CONFIG_SYSCTL */
1434 
1435         remove_proc_entry("decnet_dev", init_net.proc_net);
1436 
1437         dn_dev_devices_off();
1438 }

/* [<][>][^][v][top][bottom][index][help] */