root/net/atm/clip.c

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

DEFINITIONS

This source file includes following definitions.
  1. to_atmarpd
  2. link_vcc
  3. unlink_clip_vcc
  4. neigh_check_cb
  5. idle_timer_check
  6. clip_arp_rcv
  7. clip_push
  8. clip_pop
  9. clip_neigh_solicit
  10. clip_neigh_error
  11. clip_constructor
  12. clip_encap
  13. clip_start_xmit
  14. clip_mkip
  15. clip_setentry
  16. clip_setup
  17. clip_create
  18. clip_device_event
  19. clip_inet_event
  20. atmarpd_close
  21. atm_init_atmarp
  22. clip_ioctl
  23. svc_addr
  24. atmarp_info
  25. clip_seq_next_vcc
  26. clip_seq_vcc_walk
  27. clip_seq_sub_iter
  28. clip_seq_start
  29. clip_seq_show
  30. atm_clip_init
  31. atm_clip_exit_noproc
  32. atm_clip_exit

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /* net/atm/clip.c - RFC1577 Classical IP over ATM */
   3 
   4 /* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
   5 
   6 #define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__
   7 
   8 #include <linux/string.h>
   9 #include <linux/errno.h>
  10 #include <linux/kernel.h> /* for UINT_MAX */
  11 #include <linux/module.h>
  12 #include <linux/init.h>
  13 #include <linux/netdevice.h>
  14 #include <linux/skbuff.h>
  15 #include <linux/wait.h>
  16 #include <linux/timer.h>
  17 #include <linux/if_arp.h> /* for some manifest constants */
  18 #include <linux/notifier.h>
  19 #include <linux/atm.h>
  20 #include <linux/atmdev.h>
  21 #include <linux/atmclip.h>
  22 #include <linux/atmarp.h>
  23 #include <linux/capability.h>
  24 #include <linux/ip.h> /* for net/route.h */
  25 #include <linux/in.h> /* for struct sockaddr_in */
  26 #include <linux/if.h> /* for IFF_UP */
  27 #include <linux/inetdevice.h>
  28 #include <linux/bitops.h>
  29 #include <linux/poison.h>
  30 #include <linux/proc_fs.h>
  31 #include <linux/seq_file.h>
  32 #include <linux/rcupdate.h>
  33 #include <linux/jhash.h>
  34 #include <linux/slab.h>
  35 #include <net/route.h> /* for struct rtable and routing */
  36 #include <net/icmp.h> /* icmp_send */
  37 #include <net/arp.h>
  38 #include <linux/param.h> /* for HZ */
  39 #include <linux/uaccess.h>
  40 #include <asm/byteorder.h> /* for htons etc. */
  41 #include <linux/atomic.h>
  42 
  43 #include "common.h"
  44 #include "resources.h"
  45 #include <net/atmclip.h>
  46 
  47 static struct net_device *clip_devs;
  48 static struct atm_vcc *atmarpd;
  49 static struct timer_list idle_timer;
  50 static const struct neigh_ops clip_neigh_ops;
  51 
  52 static int to_atmarpd(enum atmarp_ctrl_type type, int itf, __be32 ip)
  53 {
  54         struct sock *sk;
  55         struct atmarp_ctrl *ctrl;
  56         struct sk_buff *skb;
  57 
  58         pr_debug("(%d)\n", type);
  59         if (!atmarpd)
  60                 return -EUNATCH;
  61         skb = alloc_skb(sizeof(struct atmarp_ctrl), GFP_ATOMIC);
  62         if (!skb)
  63                 return -ENOMEM;
  64         ctrl = skb_put(skb, sizeof(struct atmarp_ctrl));
  65         ctrl->type = type;
  66         ctrl->itf_num = itf;
  67         ctrl->ip = ip;
  68         atm_force_charge(atmarpd, skb->truesize);
  69 
  70         sk = sk_atm(atmarpd);
  71         skb_queue_tail(&sk->sk_receive_queue, skb);
  72         sk->sk_data_ready(sk);
  73         return 0;
  74 }
  75 
  76 static void link_vcc(struct clip_vcc *clip_vcc, struct atmarp_entry *entry)
  77 {
  78         pr_debug("%p to entry %p (neigh %p)\n", clip_vcc, entry, entry->neigh);
  79         clip_vcc->entry = entry;
  80         clip_vcc->xoff = 0;     /* @@@ may overrun buffer by one packet */
  81         clip_vcc->next = entry->vccs;
  82         entry->vccs = clip_vcc;
  83         entry->neigh->used = jiffies;
  84 }
  85 
  86 static void unlink_clip_vcc(struct clip_vcc *clip_vcc)
  87 {
  88         struct atmarp_entry *entry = clip_vcc->entry;
  89         struct clip_vcc **walk;
  90 
  91         if (!entry) {
  92                 pr_err("!clip_vcc->entry (clip_vcc %p)\n", clip_vcc);
  93                 return;
  94         }
  95         netif_tx_lock_bh(entry->neigh->dev);    /* block clip_start_xmit() */
  96         entry->neigh->used = jiffies;
  97         for (walk = &entry->vccs; *walk; walk = &(*walk)->next)
  98                 if (*walk == clip_vcc) {
  99                         int error;
 100 
 101                         *walk = clip_vcc->next; /* atomic */
 102                         clip_vcc->entry = NULL;
 103                         if (clip_vcc->xoff)
 104                                 netif_wake_queue(entry->neigh->dev);
 105                         if (entry->vccs)
 106                                 goto out;
 107                         entry->expires = jiffies - 1;
 108                         /* force resolution or expiration */
 109                         error = neigh_update(entry->neigh, NULL, NUD_NONE,
 110                                              NEIGH_UPDATE_F_ADMIN, 0);
 111                         if (error)
 112                                 pr_err("neigh_update failed with %d\n", error);
 113                         goto out;
 114                 }
 115         pr_err("ATMARP: failed (entry %p, vcc 0x%p)\n", entry, clip_vcc);
 116 out:
 117         netif_tx_unlock_bh(entry->neigh->dev);
 118 }
 119 
 120 /* The neighbour entry n->lock is held. */
 121 static int neigh_check_cb(struct neighbour *n)
 122 {
 123         struct atmarp_entry *entry = neighbour_priv(n);
 124         struct clip_vcc *cv;
 125 
 126         if (n->ops != &clip_neigh_ops)
 127                 return 0;
 128         for (cv = entry->vccs; cv; cv = cv->next) {
 129                 unsigned long exp = cv->last_use + cv->idle_timeout;
 130 
 131                 if (cv->idle_timeout && time_after(jiffies, exp)) {
 132                         pr_debug("releasing vcc %p->%p of entry %p\n",
 133                                  cv, cv->vcc, entry);
 134                         vcc_release_async(cv->vcc, -ETIMEDOUT);
 135                 }
 136         }
 137 
 138         if (entry->vccs || time_before(jiffies, entry->expires))
 139                 return 0;
 140 
 141         if (refcount_read(&n->refcnt) > 1) {
 142                 struct sk_buff *skb;
 143 
 144                 pr_debug("destruction postponed with ref %d\n",
 145                          refcount_read(&n->refcnt));
 146 
 147                 while ((skb = skb_dequeue(&n->arp_queue)) != NULL)
 148                         dev_kfree_skb(skb);
 149 
 150                 return 0;
 151         }
 152 
 153         pr_debug("expired neigh %p\n", n);
 154         return 1;
 155 }
 156 
 157 static void idle_timer_check(struct timer_list *unused)
 158 {
 159         write_lock(&arp_tbl.lock);
 160         __neigh_for_each_release(&arp_tbl, neigh_check_cb);
 161         mod_timer(&idle_timer, jiffies + CLIP_CHECK_INTERVAL * HZ);
 162         write_unlock(&arp_tbl.lock);
 163 }
 164 
 165 static int clip_arp_rcv(struct sk_buff *skb)
 166 {
 167         struct atm_vcc *vcc;
 168 
 169         pr_debug("\n");
 170         vcc = ATM_SKB(skb)->vcc;
 171         if (!vcc || !atm_charge(vcc, skb->truesize)) {
 172                 dev_kfree_skb_any(skb);
 173                 return 0;
 174         }
 175         pr_debug("pushing to %p\n", vcc);
 176         pr_debug("using %p\n", CLIP_VCC(vcc)->old_push);
 177         CLIP_VCC(vcc)->old_push(vcc, skb);
 178         return 0;
 179 }
 180 
 181 static const unsigned char llc_oui[] = {
 182         0xaa,   /* DSAP: non-ISO */
 183         0xaa,   /* SSAP: non-ISO */
 184         0x03,   /* Ctrl: Unnumbered Information Command PDU */
 185         0x00,   /* OUI: EtherType */
 186         0x00,
 187         0x00
 188 };
 189 
 190 static void clip_push(struct atm_vcc *vcc, struct sk_buff *skb)
 191 {
 192         struct clip_vcc *clip_vcc = CLIP_VCC(vcc);
 193 
 194         pr_debug("\n");
 195 
 196         if (!clip_devs) {
 197                 atm_return(vcc, skb->truesize);
 198                 kfree_skb(skb);
 199                 return;
 200         }
 201 
 202         if (!skb) {
 203                 pr_debug("removing VCC %p\n", clip_vcc);
 204                 if (clip_vcc->entry)
 205                         unlink_clip_vcc(clip_vcc);
 206                 clip_vcc->old_push(vcc, NULL);  /* pass on the bad news */
 207                 kfree(clip_vcc);
 208                 return;
 209         }
 210         atm_return(vcc, skb->truesize);
 211         skb->dev = clip_vcc->entry ? clip_vcc->entry->neigh->dev : clip_devs;
 212         /* clip_vcc->entry == NULL if we don't have an IP address yet */
 213         if (!skb->dev) {
 214                 dev_kfree_skb_any(skb);
 215                 return;
 216         }
 217         ATM_SKB(skb)->vcc = vcc;
 218         skb_reset_mac_header(skb);
 219         if (!clip_vcc->encap ||
 220             skb->len < RFC1483LLC_LEN ||
 221             memcmp(skb->data, llc_oui, sizeof(llc_oui)))
 222                 skb->protocol = htons(ETH_P_IP);
 223         else {
 224                 skb->protocol = ((__be16 *)skb->data)[3];
 225                 skb_pull(skb, RFC1483LLC_LEN);
 226                 if (skb->protocol == htons(ETH_P_ARP)) {
 227                         skb->dev->stats.rx_packets++;
 228                         skb->dev->stats.rx_bytes += skb->len;
 229                         clip_arp_rcv(skb);
 230                         return;
 231                 }
 232         }
 233         clip_vcc->last_use = jiffies;
 234         skb->dev->stats.rx_packets++;
 235         skb->dev->stats.rx_bytes += skb->len;
 236         memset(ATM_SKB(skb), 0, sizeof(struct atm_skb_data));
 237         netif_rx(skb);
 238 }
 239 
 240 /*
 241  * Note: these spinlocks _must_not_ block on non-SMP. The only goal is that
 242  * clip_pop is atomic with respect to the critical section in clip_start_xmit.
 243  */
 244 
 245 static void clip_pop(struct atm_vcc *vcc, struct sk_buff *skb)
 246 {
 247         struct clip_vcc *clip_vcc = CLIP_VCC(vcc);
 248         struct net_device *dev = skb->dev;
 249         int old;
 250         unsigned long flags;
 251 
 252         pr_debug("(vcc %p)\n", vcc);
 253         clip_vcc->old_pop(vcc, skb);
 254         /* skb->dev == NULL in outbound ARP packets */
 255         if (!dev)
 256                 return;
 257         spin_lock_irqsave(&PRIV(dev)->xoff_lock, flags);
 258         if (atm_may_send(vcc, 0)) {
 259                 old = xchg(&clip_vcc->xoff, 0);
 260                 if (old)
 261                         netif_wake_queue(dev);
 262         }
 263         spin_unlock_irqrestore(&PRIV(dev)->xoff_lock, flags);
 264 }
 265 
 266 static void clip_neigh_solicit(struct neighbour *neigh, struct sk_buff *skb)
 267 {
 268         __be32 *ip = (__be32 *) neigh->primary_key;
 269 
 270         pr_debug("(neigh %p, skb %p)\n", neigh, skb);
 271         to_atmarpd(act_need, PRIV(neigh->dev)->number, *ip);
 272 }
 273 
 274 static void clip_neigh_error(struct neighbour *neigh, struct sk_buff *skb)
 275 {
 276 #ifndef CONFIG_ATM_CLIP_NO_ICMP
 277         icmp_send(skb, ICMP_DEST_UNREACH, ICMP_HOST_UNREACH, 0);
 278 #endif
 279         kfree_skb(skb);
 280 }
 281 
 282 static const struct neigh_ops clip_neigh_ops = {
 283         .family =               AF_INET,
 284         .solicit =              clip_neigh_solicit,
 285         .error_report =         clip_neigh_error,
 286         .output =               neigh_direct_output,
 287         .connected_output =     neigh_direct_output,
 288 };
 289 
 290 static int clip_constructor(struct net_device *dev, struct neighbour *neigh)
 291 {
 292         struct atmarp_entry *entry = neighbour_priv(neigh);
 293 
 294         if (neigh->tbl->family != AF_INET)
 295                 return -EINVAL;
 296 
 297         if (neigh->type != RTN_UNICAST)
 298                 return -EINVAL;
 299 
 300         neigh->nud_state = NUD_NONE;
 301         neigh->ops = &clip_neigh_ops;
 302         neigh->output = neigh->ops->output;
 303         entry->neigh = neigh;
 304         entry->vccs = NULL;
 305         entry->expires = jiffies - 1;
 306 
 307         return 0;
 308 }
 309 
 310 /* @@@ copy bh locking from arp.c -- need to bh-enable atm code before */
 311 
 312 /*
 313  * We play with the resolve flag: 0 and 1 have the usual meaning, but -1 means
 314  * to allocate the neighbour entry but not to ask atmarpd for resolution. Also,
 315  * don't increment the usage count. This is used to create entries in
 316  * clip_setentry.
 317  */
 318 
 319 static int clip_encap(struct atm_vcc *vcc, int mode)
 320 {
 321         if (!CLIP_VCC(vcc))
 322                 return -EBADFD;
 323 
 324         CLIP_VCC(vcc)->encap = mode;
 325         return 0;
 326 }
 327 
 328 static netdev_tx_t clip_start_xmit(struct sk_buff *skb,
 329                                    struct net_device *dev)
 330 {
 331         struct clip_priv *clip_priv = PRIV(dev);
 332         struct dst_entry *dst = skb_dst(skb);
 333         struct atmarp_entry *entry;
 334         struct neighbour *n;
 335         struct atm_vcc *vcc;
 336         struct rtable *rt;
 337         __be32 *daddr;
 338         int old;
 339         unsigned long flags;
 340 
 341         pr_debug("(skb %p)\n", skb);
 342         if (!dst) {
 343                 pr_err("skb_dst(skb) == NULL\n");
 344                 dev_kfree_skb(skb);
 345                 dev->stats.tx_dropped++;
 346                 return NETDEV_TX_OK;
 347         }
 348         rt = (struct rtable *) dst;
 349         if (rt->rt_gw_family == AF_INET)
 350                 daddr = &rt->rt_gw4;
 351         else
 352                 daddr = &ip_hdr(skb)->daddr;
 353         n = dst_neigh_lookup(dst, daddr);
 354         if (!n) {
 355                 pr_err("NO NEIGHBOUR !\n");
 356                 dev_kfree_skb(skb);
 357                 dev->stats.tx_dropped++;
 358                 return NETDEV_TX_OK;
 359         }
 360         entry = neighbour_priv(n);
 361         if (!entry->vccs) {
 362                 if (time_after(jiffies, entry->expires)) {
 363                         /* should be resolved */
 364                         entry->expires = jiffies + ATMARP_RETRY_DELAY * HZ;
 365                         to_atmarpd(act_need, PRIV(dev)->number, *((__be32 *)n->primary_key));
 366                 }
 367                 if (entry->neigh->arp_queue.qlen < ATMARP_MAX_UNRES_PACKETS)
 368                         skb_queue_tail(&entry->neigh->arp_queue, skb);
 369                 else {
 370                         dev_kfree_skb(skb);
 371                         dev->stats.tx_dropped++;
 372                 }
 373                 goto out_release_neigh;
 374         }
 375         pr_debug("neigh %p, vccs %p\n", entry, entry->vccs);
 376         ATM_SKB(skb)->vcc = vcc = entry->vccs->vcc;
 377         pr_debug("using neighbour %p, vcc %p\n", n, vcc);
 378         if (entry->vccs->encap) {
 379                 void *here;
 380 
 381                 here = skb_push(skb, RFC1483LLC_LEN);
 382                 memcpy(here, llc_oui, sizeof(llc_oui));
 383                 ((__be16 *) here)[3] = skb->protocol;
 384         }
 385         atm_account_tx(vcc, skb);
 386         entry->vccs->last_use = jiffies;
 387         pr_debug("atm_skb(%p)->vcc(%p)->dev(%p)\n", skb, vcc, vcc->dev);
 388         old = xchg(&entry->vccs->xoff, 1);      /* assume XOFF ... */
 389         if (old) {
 390                 pr_warn("XOFF->XOFF transition\n");
 391                 goto out_release_neigh;
 392         }
 393         dev->stats.tx_packets++;
 394         dev->stats.tx_bytes += skb->len;
 395         vcc->send(vcc, skb);
 396         if (atm_may_send(vcc, 0)) {
 397                 entry->vccs->xoff = 0;
 398                 goto out_release_neigh;
 399         }
 400         spin_lock_irqsave(&clip_priv->xoff_lock, flags);
 401         netif_stop_queue(dev);  /* XOFF -> throttle immediately */
 402         barrier();
 403         if (!entry->vccs->xoff)
 404                 netif_start_queue(dev);
 405         /* Oh, we just raced with clip_pop. netif_start_queue should be
 406            good enough, because nothing should really be asleep because
 407            of the brief netif_stop_queue. If this isn't true or if it
 408            changes, use netif_wake_queue instead. */
 409         spin_unlock_irqrestore(&clip_priv->xoff_lock, flags);
 410 out_release_neigh:
 411         neigh_release(n);
 412         return NETDEV_TX_OK;
 413 }
 414 
 415 static int clip_mkip(struct atm_vcc *vcc, int timeout)
 416 {
 417         struct clip_vcc *clip_vcc;
 418 
 419         if (!vcc->push)
 420                 return -EBADFD;
 421         clip_vcc = kmalloc(sizeof(struct clip_vcc), GFP_KERNEL);
 422         if (!clip_vcc)
 423                 return -ENOMEM;
 424         pr_debug("%p vcc %p\n", clip_vcc, vcc);
 425         clip_vcc->vcc = vcc;
 426         vcc->user_back = clip_vcc;
 427         set_bit(ATM_VF_IS_CLIP, &vcc->flags);
 428         clip_vcc->entry = NULL;
 429         clip_vcc->xoff = 0;
 430         clip_vcc->encap = 1;
 431         clip_vcc->last_use = jiffies;
 432         clip_vcc->idle_timeout = timeout * HZ;
 433         clip_vcc->old_push = vcc->push;
 434         clip_vcc->old_pop = vcc->pop;
 435         vcc->push = clip_push;
 436         vcc->pop = clip_pop;
 437 
 438         /* re-process everything received between connection setup and MKIP */
 439         vcc_process_recv_queue(vcc);
 440 
 441         return 0;
 442 }
 443 
 444 static int clip_setentry(struct atm_vcc *vcc, __be32 ip)
 445 {
 446         struct neighbour *neigh;
 447         struct atmarp_entry *entry;
 448         int error;
 449         struct clip_vcc *clip_vcc;
 450         struct rtable *rt;
 451 
 452         if (vcc->push != clip_push) {
 453                 pr_warn("non-CLIP VCC\n");
 454                 return -EBADF;
 455         }
 456         clip_vcc = CLIP_VCC(vcc);
 457         if (!ip) {
 458                 if (!clip_vcc->entry) {
 459                         pr_err("hiding hidden ATMARP entry\n");
 460                         return 0;
 461                 }
 462                 pr_debug("remove\n");
 463                 unlink_clip_vcc(clip_vcc);
 464                 return 0;
 465         }
 466         rt = ip_route_output(&init_net, ip, 0, 1, 0);
 467         if (IS_ERR(rt))
 468                 return PTR_ERR(rt);
 469         neigh = __neigh_lookup(&arp_tbl, &ip, rt->dst.dev, 1);
 470         ip_rt_put(rt);
 471         if (!neigh)
 472                 return -ENOMEM;
 473         entry = neighbour_priv(neigh);
 474         if (entry != clip_vcc->entry) {
 475                 if (!clip_vcc->entry)
 476                         pr_debug("add\n");
 477                 else {
 478                         pr_debug("update\n");
 479                         unlink_clip_vcc(clip_vcc);
 480                 }
 481                 link_vcc(clip_vcc, entry);
 482         }
 483         error = neigh_update(neigh, llc_oui, NUD_PERMANENT,
 484                              NEIGH_UPDATE_F_OVERRIDE | NEIGH_UPDATE_F_ADMIN, 0);
 485         neigh_release(neigh);
 486         return error;
 487 }
 488 
 489 static const struct net_device_ops clip_netdev_ops = {
 490         .ndo_start_xmit         = clip_start_xmit,
 491         .ndo_neigh_construct    = clip_constructor,
 492 };
 493 
 494 static void clip_setup(struct net_device *dev)
 495 {
 496         dev->netdev_ops = &clip_netdev_ops;
 497         dev->type = ARPHRD_ATM;
 498         dev->neigh_priv_len = sizeof(struct atmarp_entry);
 499         dev->hard_header_len = RFC1483LLC_LEN;
 500         dev->mtu = RFC1626_MTU;
 501         dev->tx_queue_len = 100;        /* "normal" queue (packets) */
 502         /* When using a "real" qdisc, the qdisc determines the queue */
 503         /* length. tx_queue_len is only used for the default case, */
 504         /* without any more elaborate queuing. 100 is a reasonable */
 505         /* compromise between decent burst-tolerance and protection */
 506         /* against memory hogs. */
 507         netif_keep_dst(dev);
 508 }
 509 
 510 static int clip_create(int number)
 511 {
 512         struct net_device *dev;
 513         struct clip_priv *clip_priv;
 514         int error;
 515 
 516         if (number != -1) {
 517                 for (dev = clip_devs; dev; dev = PRIV(dev)->next)
 518                         if (PRIV(dev)->number == number)
 519                                 return -EEXIST;
 520         } else {
 521                 number = 0;
 522                 for (dev = clip_devs; dev; dev = PRIV(dev)->next)
 523                         if (PRIV(dev)->number >= number)
 524                                 number = PRIV(dev)->number + 1;
 525         }
 526         dev = alloc_netdev(sizeof(struct clip_priv), "", NET_NAME_UNKNOWN,
 527                            clip_setup);
 528         if (!dev)
 529                 return -ENOMEM;
 530         clip_priv = PRIV(dev);
 531         sprintf(dev->name, "atm%d", number);
 532         spin_lock_init(&clip_priv->xoff_lock);
 533         clip_priv->number = number;
 534         error = register_netdev(dev);
 535         if (error) {
 536                 free_netdev(dev);
 537                 return error;
 538         }
 539         clip_priv->next = clip_devs;
 540         clip_devs = dev;
 541         pr_debug("registered (net:%s)\n", dev->name);
 542         return number;
 543 }
 544 
 545 static int clip_device_event(struct notifier_block *this, unsigned long event,
 546                              void *ptr)
 547 {
 548         struct net_device *dev = netdev_notifier_info_to_dev(ptr);
 549 
 550         if (!net_eq(dev_net(dev), &init_net))
 551                 return NOTIFY_DONE;
 552 
 553         if (event == NETDEV_UNREGISTER)
 554                 return NOTIFY_DONE;
 555 
 556         /* ignore non-CLIP devices */
 557         if (dev->type != ARPHRD_ATM || dev->netdev_ops != &clip_netdev_ops)
 558                 return NOTIFY_DONE;
 559 
 560         switch (event) {
 561         case NETDEV_UP:
 562                 pr_debug("NETDEV_UP\n");
 563                 to_atmarpd(act_up, PRIV(dev)->number, 0);
 564                 break;
 565         case NETDEV_GOING_DOWN:
 566                 pr_debug("NETDEV_DOWN\n");
 567                 to_atmarpd(act_down, PRIV(dev)->number, 0);
 568                 break;
 569         case NETDEV_CHANGE:
 570         case NETDEV_CHANGEMTU:
 571                 pr_debug("NETDEV_CHANGE*\n");
 572                 to_atmarpd(act_change, PRIV(dev)->number, 0);
 573                 break;
 574         }
 575         return NOTIFY_DONE;
 576 }
 577 
 578 static int clip_inet_event(struct notifier_block *this, unsigned long event,
 579                            void *ifa)
 580 {
 581         struct in_device *in_dev;
 582         struct netdev_notifier_info info;
 583 
 584         in_dev = ((struct in_ifaddr *)ifa)->ifa_dev;
 585         /*
 586          * Transitions are of the down-change-up type, so it's sufficient to
 587          * handle the change on up.
 588          */
 589         if (event != NETDEV_UP)
 590                 return NOTIFY_DONE;
 591         netdev_notifier_info_init(&info, in_dev->dev);
 592         return clip_device_event(this, NETDEV_CHANGE, &info);
 593 }
 594 
 595 static struct notifier_block clip_dev_notifier = {
 596         .notifier_call = clip_device_event,
 597 };
 598 
 599 
 600 
 601 static struct notifier_block clip_inet_notifier = {
 602         .notifier_call = clip_inet_event,
 603 };
 604 
 605 
 606 
 607 static void atmarpd_close(struct atm_vcc *vcc)
 608 {
 609         pr_debug("\n");
 610 
 611         rtnl_lock();
 612         atmarpd = NULL;
 613         skb_queue_purge(&sk_atm(vcc)->sk_receive_queue);
 614         rtnl_unlock();
 615 
 616         pr_debug("(done)\n");
 617         module_put(THIS_MODULE);
 618 }
 619 
 620 static const struct atmdev_ops atmarpd_dev_ops = {
 621         .close = atmarpd_close
 622 };
 623 
 624 
 625 static struct atm_dev atmarpd_dev = {
 626         .ops =                  &atmarpd_dev_ops,
 627         .type =                 "arpd",
 628         .number =               999,
 629         .lock =                 __SPIN_LOCK_UNLOCKED(atmarpd_dev.lock)
 630 };
 631 
 632 
 633 static int atm_init_atmarp(struct atm_vcc *vcc)
 634 {
 635         rtnl_lock();
 636         if (atmarpd) {
 637                 rtnl_unlock();
 638                 return -EADDRINUSE;
 639         }
 640 
 641         mod_timer(&idle_timer, jiffies + CLIP_CHECK_INTERVAL * HZ);
 642 
 643         atmarpd = vcc;
 644         set_bit(ATM_VF_META, &vcc->flags);
 645         set_bit(ATM_VF_READY, &vcc->flags);
 646             /* allow replies and avoid getting closed if signaling dies */
 647         vcc->dev = &atmarpd_dev;
 648         vcc_insert_socket(sk_atm(vcc));
 649         vcc->push = NULL;
 650         vcc->pop = NULL; /* crash */
 651         vcc->push_oam = NULL; /* crash */
 652         rtnl_unlock();
 653         return 0;
 654 }
 655 
 656 static int clip_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 657 {
 658         struct atm_vcc *vcc = ATM_SD(sock);
 659         int err = 0;
 660 
 661         switch (cmd) {
 662         case SIOCMKCLIP:
 663         case ATMARPD_CTRL:
 664         case ATMARP_MKIP:
 665         case ATMARP_SETENTRY:
 666         case ATMARP_ENCAP:
 667                 if (!capable(CAP_NET_ADMIN))
 668                         return -EPERM;
 669                 break;
 670         default:
 671                 return -ENOIOCTLCMD;
 672         }
 673 
 674         switch (cmd) {
 675         case SIOCMKCLIP:
 676                 err = clip_create(arg);
 677                 break;
 678         case ATMARPD_CTRL:
 679                 err = atm_init_atmarp(vcc);
 680                 if (!err) {
 681                         sock->state = SS_CONNECTED;
 682                         __module_get(THIS_MODULE);
 683                 }
 684                 break;
 685         case ATMARP_MKIP:
 686                 err = clip_mkip(vcc, arg);
 687                 break;
 688         case ATMARP_SETENTRY:
 689                 err = clip_setentry(vcc, (__force __be32)arg);
 690                 break;
 691         case ATMARP_ENCAP:
 692                 err = clip_encap(vcc, arg);
 693                 break;
 694         }
 695         return err;
 696 }
 697 
 698 static struct atm_ioctl clip_ioctl_ops = {
 699         .owner = THIS_MODULE,
 700         .ioctl = clip_ioctl,
 701 };
 702 
 703 #ifdef CONFIG_PROC_FS
 704 
 705 static void svc_addr(struct seq_file *seq, struct sockaddr_atmsvc *addr)
 706 {
 707         static int code[] = { 1, 2, 10, 6, 1, 0 };
 708         static int e164[] = { 1, 8, 4, 6, 1, 0 };
 709 
 710         if (*addr->sas_addr.pub) {
 711                 seq_printf(seq, "%s", addr->sas_addr.pub);
 712                 if (*addr->sas_addr.prv)
 713                         seq_putc(seq, '+');
 714         } else if (!*addr->sas_addr.prv) {
 715                 seq_printf(seq, "%s", "(none)");
 716                 return;
 717         }
 718         if (*addr->sas_addr.prv) {
 719                 unsigned char *prv = addr->sas_addr.prv;
 720                 int *fields;
 721                 int i, j;
 722 
 723                 fields = *prv == ATM_AFI_E164 ? e164 : code;
 724                 for (i = 0; fields[i]; i++) {
 725                         for (j = fields[i]; j; j--)
 726                                 seq_printf(seq, "%02X", *prv++);
 727                         if (fields[i + 1])
 728                                 seq_putc(seq, '.');
 729                 }
 730         }
 731 }
 732 
 733 /* This means the neighbour entry has no attached VCC objects. */
 734 #define SEQ_NO_VCC_TOKEN        ((void *) 2)
 735 
 736 static void atmarp_info(struct seq_file *seq, struct neighbour *n,
 737                         struct atmarp_entry *entry, struct clip_vcc *clip_vcc)
 738 {
 739         struct net_device *dev = n->dev;
 740         unsigned long exp;
 741         char buf[17];
 742         int svc, llc, off;
 743 
 744         svc = ((clip_vcc == SEQ_NO_VCC_TOKEN) ||
 745                (sk_atm(clip_vcc->vcc)->sk_family == AF_ATMSVC));
 746 
 747         llc = ((clip_vcc == SEQ_NO_VCC_TOKEN) || clip_vcc->encap);
 748 
 749         if (clip_vcc == SEQ_NO_VCC_TOKEN)
 750                 exp = entry->neigh->used;
 751         else
 752                 exp = clip_vcc->last_use;
 753 
 754         exp = (jiffies - exp) / HZ;
 755 
 756         seq_printf(seq, "%-6s%-4s%-4s%5ld ",
 757                    dev->name, svc ? "SVC" : "PVC", llc ? "LLC" : "NULL", exp);
 758 
 759         off = scnprintf(buf, sizeof(buf) - 1, "%pI4", n->primary_key);
 760         while (off < 16)
 761                 buf[off++] = ' ';
 762         buf[off] = '\0';
 763         seq_printf(seq, "%s", buf);
 764 
 765         if (clip_vcc == SEQ_NO_VCC_TOKEN) {
 766                 if (time_before(jiffies, entry->expires))
 767                         seq_printf(seq, "(resolving)\n");
 768                 else
 769                         seq_printf(seq, "(expired, ref %d)\n",
 770                                    refcount_read(&entry->neigh->refcnt));
 771         } else if (!svc) {
 772                 seq_printf(seq, "%d.%d.%d\n",
 773                            clip_vcc->vcc->dev->number,
 774                            clip_vcc->vcc->vpi, clip_vcc->vcc->vci);
 775         } else {
 776                 svc_addr(seq, &clip_vcc->vcc->remote);
 777                 seq_putc(seq, '\n');
 778         }
 779 }
 780 
 781 struct clip_seq_state {
 782         /* This member must be first. */
 783         struct neigh_seq_state ns;
 784 
 785         /* Local to clip specific iteration. */
 786         struct clip_vcc *vcc;
 787 };
 788 
 789 static struct clip_vcc *clip_seq_next_vcc(struct atmarp_entry *e,
 790                                           struct clip_vcc *curr)
 791 {
 792         if (!curr) {
 793                 curr = e->vccs;
 794                 if (!curr)
 795                         return SEQ_NO_VCC_TOKEN;
 796                 return curr;
 797         }
 798         if (curr == SEQ_NO_VCC_TOKEN)
 799                 return NULL;
 800 
 801         curr = curr->next;
 802 
 803         return curr;
 804 }
 805 
 806 static void *clip_seq_vcc_walk(struct clip_seq_state *state,
 807                                struct atmarp_entry *e, loff_t * pos)
 808 {
 809         struct clip_vcc *vcc = state->vcc;
 810 
 811         vcc = clip_seq_next_vcc(e, vcc);
 812         if (vcc && pos != NULL) {
 813                 while (*pos) {
 814                         vcc = clip_seq_next_vcc(e, vcc);
 815                         if (!vcc)
 816                                 break;
 817                         --(*pos);
 818                 }
 819         }
 820         state->vcc = vcc;
 821 
 822         return vcc;
 823 }
 824 
 825 static void *clip_seq_sub_iter(struct neigh_seq_state *_state,
 826                                struct neighbour *n, loff_t * pos)
 827 {
 828         struct clip_seq_state *state = (struct clip_seq_state *)_state;
 829 
 830         if (n->dev->type != ARPHRD_ATM)
 831                 return NULL;
 832 
 833         return clip_seq_vcc_walk(state, neighbour_priv(n), pos);
 834 }
 835 
 836 static void *clip_seq_start(struct seq_file *seq, loff_t * pos)
 837 {
 838         struct clip_seq_state *state = seq->private;
 839         state->ns.neigh_sub_iter = clip_seq_sub_iter;
 840         return neigh_seq_start(seq, pos, &arp_tbl, NEIGH_SEQ_NEIGH_ONLY);
 841 }
 842 
 843 static int clip_seq_show(struct seq_file *seq, void *v)
 844 {
 845         static char atm_arp_banner[] =
 846             "IPitf TypeEncp Idle IP address      ATM address\n";
 847 
 848         if (v == SEQ_START_TOKEN) {
 849                 seq_puts(seq, atm_arp_banner);
 850         } else {
 851                 struct clip_seq_state *state = seq->private;
 852                 struct clip_vcc *vcc = state->vcc;
 853                 struct neighbour *n = v;
 854 
 855                 atmarp_info(seq, n, neighbour_priv(n), vcc);
 856         }
 857         return 0;
 858 }
 859 
 860 static const struct seq_operations arp_seq_ops = {
 861         .start  = clip_seq_start,
 862         .next   = neigh_seq_next,
 863         .stop   = neigh_seq_stop,
 864         .show   = clip_seq_show,
 865 };
 866 #endif
 867 
 868 static void atm_clip_exit_noproc(void);
 869 
 870 static int __init atm_clip_init(void)
 871 {
 872         register_atm_ioctl(&clip_ioctl_ops);
 873         register_netdevice_notifier(&clip_dev_notifier);
 874         register_inetaddr_notifier(&clip_inet_notifier);
 875 
 876         timer_setup(&idle_timer, idle_timer_check, 0);
 877 
 878 #ifdef CONFIG_PROC_FS
 879         {
 880                 struct proc_dir_entry *p;
 881 
 882                 p = proc_create_net("arp", 0444, atm_proc_root, &arp_seq_ops,
 883                                 sizeof(struct clip_seq_state));
 884                 if (!p) {
 885                         pr_err("Unable to initialize /proc/net/atm/arp\n");
 886                         atm_clip_exit_noproc();
 887                         return -ENOMEM;
 888                 }
 889         }
 890 #endif
 891 
 892         return 0;
 893 }
 894 
 895 static void atm_clip_exit_noproc(void)
 896 {
 897         struct net_device *dev, *next;
 898 
 899         unregister_inetaddr_notifier(&clip_inet_notifier);
 900         unregister_netdevice_notifier(&clip_dev_notifier);
 901 
 902         deregister_atm_ioctl(&clip_ioctl_ops);
 903 
 904         /* First, stop the idle timer, so it stops banging
 905          * on the table.
 906          */
 907         del_timer_sync(&idle_timer);
 908 
 909         dev = clip_devs;
 910         while (dev) {
 911                 next = PRIV(dev)->next;
 912                 unregister_netdev(dev);
 913                 free_netdev(dev);
 914                 dev = next;
 915         }
 916 }
 917 
 918 static void __exit atm_clip_exit(void)
 919 {
 920         remove_proc_entry("arp", atm_proc_root);
 921 
 922         atm_clip_exit_noproc();
 923 }
 924 
 925 module_init(atm_clip_init);
 926 module_exit(atm_clip_exit);
 927 MODULE_AUTHOR("Werner Almesberger");
 928 MODULE_DESCRIPTION("Classical/IP over ATM interface");
 929 MODULE_LICENSE("GPL");

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