Lines Matching +full:vcc +full:- +full:p
1 // SPDX-License-Identifier: GPL-2.0-only
7 * Eric Kinzie, 2006-2007, US Naval Research Laboratory
38 16, 1, skb->data, min(NUM2PRINT, skb->len), true); in skb_debug()
70 void (*old_push)(struct atm_vcc *vcc, struct sk_buff *skb);
71 void (*old_pop)(struct atm_vcc *vcc, struct sk_buff *skb);
72 void (*old_release_cb)(struct atm_vcc *vcc);
87 struct list_head brvccs; /* one device <=> one vcc (before xmas) */
94 * their attached vcc's could be altered. It should be held for reading
96 * do read-locking under interrupting context, so write locking must block
110 return list_entry(le, struct br2684_dev, br2684_devs)->net_dev; in list_entry_brdev()
115 return (struct br2684_vcc *)(atmvcc->user_back); in BR2684_VCC()
128 switch (s->method) { in br2684_find_dev()
132 if (BRPRIV(net_dev)->number == s->spec.devnum) in br2684_find_dev()
139 if (!strncmp(net_dev->name, s->spec.ifname, IFNAMSIZ)) in br2684_find_dev()
157 pr_debug("event=%ld dev=%p\n", event, atm_dev); in atm_dev_event()
163 list_for_each_entry(brvcc, &BRPRIV(net_dev)->brvccs, brvccs) { in atm_dev_event()
164 atm_vcc = brvcc->atmvcc; in atm_dev_event()
165 if (atm_vcc && brvcc->atmvcc->dev == atm_dev) { in atm_dev_event()
167 if (atm_vcc->dev->signal == ATM_PHY_SIG_LOST) in atm_dev_event()
184 /* chained vcc->pop function. Check if we should wake the netif_queue */
185 static void br2684_pop(struct atm_vcc *vcc, struct sk_buff *skb) in br2684_pop() argument
187 struct br2684_vcc *brvcc = BR2684_VCC(vcc); in br2684_pop()
189 pr_debug("(vcc %p ; net_dev %p )\n", vcc, brvcc->device); in br2684_pop()
190 brvcc->old_pop(vcc, skb); in br2684_pop()
193 if (atomic_inc_return(&brvcc->qspace) == 1) in br2684_pop()
194 netif_wake_queue(brvcc->device); in br2684_pop()
198 * Send a packet out a particular vcc. Not to useful right now, but paves
199 * the way for multiple vcc's per itf. Returns true if we can send,
207 int minheadroom = (brvcc->encaps == e_llc) ? in br2684_xmit_vcc()
208 ((brdev->payload == p_bridged) ? in br2684_xmit_vcc()
210 ((brdev->payload == p_bridged) ? BR2684_PAD_LEN : 0); in br2684_xmit_vcc()
214 brvcc->copies_needed++; in br2684_xmit_vcc()
217 brvcc->copies_failed++; in br2684_xmit_vcc()
223 if (brvcc->encaps == e_llc) { in br2684_xmit_vcc()
224 if (brdev->payload == p_bridged) { in br2684_xmit_vcc()
228 } else if (brdev->payload == p_routed) { in br2684_xmit_vcc()
229 unsigned short prot = ntohs(skb->protocol); in br2684_xmit_vcc()
247 if (brdev->payload == p_bridged) { in br2684_xmit_vcc()
249 memset(skb->data, 0, 2); in br2684_xmit_vcc()
254 ATM_SKB(skb)->vcc = atmvcc = brvcc->atmvcc; in br2684_xmit_vcc()
255 pr_debug("atm_skb(%p)->vcc(%p)->dev(%p)\n", skb, atmvcc, atmvcc->dev); in br2684_xmit_vcc()
257 dev->stats.tx_packets++; in br2684_xmit_vcc()
258 dev->stats.tx_bytes += skb->len; in br2684_xmit_vcc()
260 if (atomic_dec_return(&brvcc->qspace) < 1) { in br2684_xmit_vcc()
262 netif_stop_queue(brvcc->device); in br2684_xmit_vcc()
264 if (unlikely(atomic_read(&brvcc->qspace) > 0)) in br2684_xmit_vcc()
265 netif_wake_queue(brvcc->device); in br2684_xmit_vcc()
271 return !atmvcc->send(atmvcc, skb); in br2684_xmit_vcc()
278 if (atomic_read(&brvcc->qspace) > 0) in br2684_release_cb()
279 netif_wake_queue(brvcc->device); in br2684_release_cb()
281 if (brvcc->old_release_cb) in br2684_release_cb()
282 brvcc->old_release_cb(atmvcc); in br2684_release_cb()
288 …return list_empty(&brdev->brvccs) ? NULL : list_entry_brvcc(brdev->brvccs.next); /* 1 vcc/dev righ… in pick_outgoing_vcc()
299 pr_debug("skb_dst(skb)=%p\n", skb_dst(skb)); in br2684_start_xmit()
303 pr_debug("no vcc attached to dev %s\n", dev->name); in br2684_start_xmit()
304 dev->stats.tx_errors++; in br2684_start_xmit()
305 dev->stats.tx_carrier_errors++; in br2684_start_xmit()
310 atmvcc = brvcc->atmvcc; in br2684_start_xmit()
314 if (test_bit(ATM_VF_RELEASED, &atmvcc->flags) || in br2684_start_xmit()
315 test_bit(ATM_VF_CLOSE, &atmvcc->flags) || in br2684_start_xmit()
316 !test_bit(ATM_VF_READY, &atmvcc->flags)) { in br2684_start_xmit()
317 dev->stats.tx_dropped++; in br2684_start_xmit()
323 netif_stop_queue(brvcc->device); in br2684_start_xmit()
336 dev->stats.tx_errors++; in br2684_start_xmit()
337 dev->stats.tx_fifo_errors++; in br2684_start_xmit()
350 static int br2684_mac_addr(struct net_device *dev, void *p) in br2684_mac_addr() argument
352 int err = eth_mac_addr(dev, p); in br2684_mac_addr()
354 BRPRIV(dev)->mac_was_set = 1; in br2684_mac_addr()
366 return -EFAULT; in br2684_setfilt()
369 * This is really a per-vcc thing, but we can also search in br2684_setfilt()
375 if (brdev == NULL || list_empty(&brdev->brvccs) || in br2684_setfilt()
376 brdev->brvccs.next != brdev->brvccs.prev) /* >1 VCC */ in br2684_setfilt()
379 brvcc = list_entry_brvcc(brdev->brvccs.next); in br2684_setfilt()
382 return -ESRCH; in br2684_setfilt()
385 memcpy(&brvcc->filter, &fs.filter, sizeof(brvcc->filter)); in br2684_setfilt()
393 if (brvcc->filter.netmask == 0) in packet_fails_filter()
396 (((struct iphdr *)(skb->data))->daddr & brvcc->filter. in packet_fails_filter()
397 netmask) == brvcc->filter.prefix) in packet_fails_filter()
411 pr_debug("removing VCC %p from dev %p\n", brvcc, brvcc->device); in br2684_close_vcc()
413 list_del(&brvcc->brvccs); in br2684_close_vcc()
415 brvcc->atmvcc->user_back = NULL; /* what about vcc->recvq ??? */ in br2684_close_vcc()
416 brvcc->atmvcc->release_cb = brvcc->old_release_cb; in br2684_close_vcc()
417 brvcc->old_push(brvcc->atmvcc, NULL); /* pass on the bad news */ in br2684_close_vcc()
418 module_put(brvcc->old_owner); in br2684_close_vcc()
426 struct net_device *net_dev = brvcc->device; in br2684_push()
432 /* skb==NULL means VCC is being destroyed */ in br2684_push()
434 if (list_empty(&brdev->brvccs)) { in br2684_push()
436 list_del(&brdev->br2684_devs); in br2684_push()
445 atm_return(atmvcc, skb->truesize); in br2684_push()
446 pr_debug("skb from brdev %p\n", brdev); in br2684_push()
447 if (brvcc->encaps == e_llc) { in br2684_push()
449 if (skb->len > 7 && skb->data[7] == 0x01) in br2684_push()
450 __skb_trim(skb, skb->len - 4); in br2684_push()
453 if ((skb->len >= (sizeof(llc_oui_ipv4))) && in br2684_push()
454 (memcmp(skb->data, llc_oui_ipv4, in br2684_push()
455 sizeof(llc_oui_ipv4) - BR2684_ETHERTYPE_LEN) == 0)) { in br2684_push()
456 if (memcmp(skb->data + 6, ethertype_ipv6, in br2684_push()
458 skb->protocol = htons(ETH_P_IPV6); in br2684_push()
459 else if (memcmp(skb->data + 6, ethertype_ipv4, in br2684_push()
461 skb->protocol = htons(ETH_P_IP); in br2684_push()
466 skb->pkt_type = PACKET_HOST; in br2684_push()
472 } else if ((skb->len >= sizeof(llc_oui_pid_pad)) && in br2684_push()
473 (memcmp(skb->data, llc_oui_pid_pad, 7) == 0)) { in br2684_push()
475 skb->protocol = eth_type_trans(skb, net_dev); in br2684_push()
480 if (brdev->payload == p_routed) { in br2684_push()
485 if (iph->version == 4) in br2684_push()
486 skb->protocol = htons(ETH_P_IP); in br2684_push()
487 else if (iph->version == 6) in br2684_push()
488 skb->protocol = htons(ETH_P_IPV6); in br2684_push()
491 skb->pkt_type = PACKET_HOST; in br2684_push()
494 if (memcmp(skb->data, pad, BR2684_PAD_LEN) != 0) in br2684_push()
497 skb->protocol = eth_type_trans(skb, net_dev); in br2684_push()
502 if (unlikely(packet_fails_filter(skb->protocol, brvcc, skb))) in br2684_push()
505 skb->dev = net_dev; in br2684_push()
506 ATM_SKB(skb)->vcc = atmvcc; /* needed ? */ in br2684_push()
507 pr_debug("received packet's protocol: %x\n", ntohs(skb->protocol)); in br2684_push()
510 if (unlikely(!(net_dev->flags & IFF_UP))) in br2684_push()
512 net_dev->stats.rx_packets++; in br2684_push()
513 net_dev->stats.rx_bytes += skb->len; in br2684_push()
519 net_dev->stats.rx_dropped++; in br2684_push()
522 net_dev->stats.rx_errors++; in br2684_push()
528 * Assign a vcc to a dev
540 return -EFAULT; in br2684_regvcc()
543 return -ENOMEM; in br2684_regvcc()
550 atomic_set(&brvcc->qspace, 2); in br2684_regvcc()
554 pr_err("tried to attach to non-existent device\n"); in br2684_regvcc()
555 err = -ENXIO; in br2684_regvcc()
559 if (atmvcc->push == NULL) { in br2684_regvcc()
560 err = -EBADFD; in br2684_regvcc()
563 if (!list_empty(&brdev->brvccs)) { in br2684_regvcc()
564 /* Only 1 VCC/dev right now */ in br2684_regvcc()
565 err = -EEXIST; in br2684_regvcc()
574 err = -EINVAL; in br2684_regvcc()
577 pr_debug("vcc=%p, encaps=%d, brvcc=%p\n", atmvcc, be.encaps, brvcc); in br2684_regvcc()
578 if (list_empty(&brdev->brvccs) && !brdev->mac_was_set) { in br2684_regvcc()
579 unsigned char *esi = atmvcc->dev->esi; in br2684_regvcc()
587 list_add(&brvcc->brvccs, &brdev->brvccs); in br2684_regvcc()
589 brvcc->device = net_dev; in br2684_regvcc()
590 brvcc->atmvcc = atmvcc; in br2684_regvcc()
591 atmvcc->user_back = brvcc; in br2684_regvcc()
592 brvcc->encaps = (enum br2684_encaps)be.encaps; in br2684_regvcc()
593 brvcc->old_push = atmvcc->push; in br2684_regvcc()
594 brvcc->old_pop = atmvcc->pop; in br2684_regvcc()
595 brvcc->old_release_cb = atmvcc->release_cb; in br2684_regvcc()
596 brvcc->old_owner = atmvcc->owner; in br2684_regvcc()
598 atmvcc->push = br2684_push; in br2684_regvcc()
599 atmvcc->pop = br2684_pop; in br2684_regvcc()
600 atmvcc->release_cb = br2684_release_cb; in br2684_regvcc()
601 atmvcc->owner = THIS_MODULE; in br2684_regvcc()
604 if (atmvcc->dev->signal == ATM_PHY_SIG_LOST) in br2684_regvcc()
611 /* re-process everything received between connection setup and in br2684_regvcc()
638 netdev->hard_header_len += sizeof(llc_oui_pid_pad); /* worst case */ in br2684_setup()
639 brdev->net_dev = netdev; in br2684_setup()
641 netdev->netdev_ops = &br2684_netdev_ops; in br2684_setup()
643 INIT_LIST_HEAD(&brdev->brvccs); in br2684_setup()
650 brdev->net_dev = netdev; in br2684_setup_routed()
651 netdev->hard_header_len = sizeof(llc_oui_ipv4); /* worst case */ in br2684_setup_routed()
652 netdev->netdev_ops = &br2684_netdev_ops_routed; in br2684_setup_routed()
653 netdev->addr_len = 0; in br2684_setup_routed()
654 netdev->mtu = ETH_DATA_LEN; in br2684_setup_routed()
655 netdev->min_mtu = 0; in br2684_setup_routed()
656 netdev->max_mtu = ETH_MAX_MTU; in br2684_setup_routed()
657 netdev->type = ARPHRD_PPP; in br2684_setup_routed()
658 netdev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST; in br2684_setup_routed()
659 netdev->tx_queue_len = 100; in br2684_setup_routed()
660 INIT_LIST_HEAD(&brdev->brvccs); in br2684_setup_routed()
674 return -EFAULT; in br2684_create()
683 return -EINVAL; in br2684_create()
690 return -ENOMEM; in br2684_create()
694 pr_debug("registered netdev %s\n", netdev->name); in br2684_create()
705 brdev->payload = payload; in br2684_create()
709 brdev->number = 1; in br2684_create()
711 brdev->number = BRPRIV(list_entry_brdev(br2684_devs.prev))->number + 1; in br2684_create()
713 list_add_tail(&brdev->br2684_devs, &br2684_devs); in br2684_create()
719 * This handles ioctls actually performed on our vcc - we must return
720 * -ENOIOCTLCMD for any unrecognized ioctl
735 return -EFAULT; in br2684_ioctl()
737 return -ENOIOCTLCMD; in br2684_ioctl()
739 return -EPERM; in br2684_ioctl()
741 if (sock->state != SS_CONNECTED) in br2684_ioctl()
742 return -EINVAL; in br2684_ioctl()
749 if (atmvcc->push != br2684_push) in br2684_ioctl()
750 return -ENOIOCTLCMD; in br2684_ioctl()
752 return -EPERM; in br2684_ioctl()
758 return -ENOIOCTLCMD; in br2684_ioctl()
789 const struct net_device *net_dev = brdev->net_dev; in br2684_seq_show()
793 net_dev->name, in br2684_seq_show()
794 brdev->number, in br2684_seq_show()
795 net_dev->dev_addr, in br2684_seq_show()
796 brdev->mac_was_set ? "set" : "auto"); in br2684_seq_show()
798 list_for_each_entry(brvcc, &brdev->brvccs, brvccs) { in br2684_seq_show()
799 seq_printf(seq, " vcc %d.%d.%d: encaps=%s payload=%s" in br2684_seq_show()
801 "\n", brvcc->atmvcc->dev->number, in br2684_seq_show()
802 brvcc->atmvcc->vpi, brvcc->atmvcc->vci, in br2684_seq_show()
803 (brvcc->encaps == e_llc) ? "LLC" : "VC", in br2684_seq_show()
804 (brdev->payload == p_bridged) ? "bridged" : "routed", in br2684_seq_show()
805 brvcc->copies_failed, brvcc->copies_needed); in br2684_seq_show()
807 if (brvcc->filter.netmask != 0) in br2684_seq_show()
809 &brvcc->filter.prefix, in br2684_seq_show()
810 &brvcc->filter.netmask); in br2684_seq_show()
829 struct proc_dir_entry *p; in br2684_init() local
830 p = proc_create_seq("br2684", 0, atm_proc_root, &br2684_seq_ops); in br2684_init()
831 if (p == NULL) in br2684_init()
832 return -ENOMEM; in br2684_init()
856 while (!list_empty(&brdev->brvccs)) { in br2684_exit()
857 brvcc = list_entry_brvcc(brdev->brvccs.next); in br2684_exit()
861 list_del(&brdev->br2684_devs); in br2684_exit()