.. | .. |
---|
80 | 80 | |
---|
81 | 81 | bool zlp; |
---|
82 | 82 | bool no_skb_reserve; |
---|
| 83 | + bool ifname_set; |
---|
83 | 84 | u8 host_mac[ETH_ALEN]; |
---|
84 | 85 | u8 dev_mac[ETH_ALEN]; |
---|
85 | 86 | }; |
---|
.. | .. |
---|
322 | 323 | /* data overrun */ |
---|
323 | 324 | case -EOVERFLOW: |
---|
324 | 325 | dev->net->stats.rx_over_errors++; |
---|
325 | | - /* FALLTHROUGH */ |
---|
| 326 | + fallthrough; |
---|
326 | 327 | |
---|
327 | 328 | default: |
---|
328 | 329 | dev->net->stats.rx_errors++; |
---|
.. | .. |
---|
445 | 446 | default: |
---|
446 | 447 | dev->net->stats.tx_errors++; |
---|
447 | 448 | VDBG(dev, "tx err %d\n", req->status); |
---|
448 | | - /* FALLTHROUGH */ |
---|
| 449 | + fallthrough; |
---|
449 | 450 | case -ECONNRESET: /* unlink */ |
---|
450 | 451 | case -ESHUTDOWN: /* disconnect etc */ |
---|
451 | 452 | dev_kfree_skb_any(skb); |
---|
.. | .. |
---|
732 | 733 | .name = "gadget", |
---|
733 | 734 | }; |
---|
734 | 735 | |
---|
735 | | -/** |
---|
| 736 | +/* |
---|
736 | 737 | * gether_setup_name - initialize one ethernet-over-usb link |
---|
737 | 738 | * @g: gadget to associated with these links |
---|
738 | 739 | * @ethaddr: NULL, or a buffer in which the ethernet address of the |
---|
.. | .. |
---|
772 | 773 | dev->qmult = qmult; |
---|
773 | 774 | snprintf(net->name, sizeof(net->name), "%s%%d", netname); |
---|
774 | 775 | |
---|
775 | | - if (get_ether_addr(dev_addr, net->dev_addr)) |
---|
| 776 | + if (get_ether_addr(dev_addr, net->dev_addr)) { |
---|
| 777 | + net->addr_assign_type = NET_ADDR_RANDOM; |
---|
776 | 778 | dev_warn(&g->dev, |
---|
777 | 779 | "using random %s ethernet address\n", "self"); |
---|
| 780 | + } else { |
---|
| 781 | + net->addr_assign_type = NET_ADDR_SET; |
---|
| 782 | + } |
---|
778 | 783 | if (get_ether_addr(host_addr, dev->host_mac)) |
---|
779 | 784 | dev_warn(&g->dev, |
---|
780 | 785 | "using random %s ethernet address\n", "host"); |
---|
.. | .. |
---|
831 | 836 | INIT_LIST_HEAD(&dev->tx_reqs); |
---|
832 | 837 | INIT_LIST_HEAD(&dev->rx_reqs); |
---|
833 | 838 | |
---|
| 839 | + /* by default we always have a random MAC address */ |
---|
| 840 | + net->addr_assign_type = NET_ADDR_RANDOM; |
---|
| 841 | + |
---|
834 | 842 | skb_queue_head_init(&dev->rx_frames); |
---|
835 | 843 | |
---|
836 | 844 | /* network device setup */ |
---|
.. | .. |
---|
868 | 876 | g = dev->gadget; |
---|
869 | 877 | |
---|
870 | 878 | memcpy(net->dev_addr, dev->dev_mac, ETH_ALEN); |
---|
871 | | - net->addr_assign_type = NET_ADDR_RANDOM; |
---|
872 | 879 | |
---|
873 | 880 | status = register_netdev(net); |
---|
874 | 881 | if (status < 0) { |
---|
.. | .. |
---|
908 | 915 | if (get_ether_addr(dev_addr, new_addr)) |
---|
909 | 916 | return -EINVAL; |
---|
910 | 917 | memcpy(dev->dev_mac, new_addr, ETH_ALEN); |
---|
| 918 | + net->addr_assign_type = NET_ADDR_SET; |
---|
911 | 919 | return 0; |
---|
912 | 920 | } |
---|
913 | 921 | EXPORT_SYMBOL_GPL(gether_set_dev_addr); |
---|
.. | .. |
---|
1000 | 1008 | |
---|
1001 | 1009 | int gether_get_ifname(struct net_device *net, char *name, int len) |
---|
1002 | 1010 | { |
---|
| 1011 | + struct eth_dev *dev = netdev_priv(net); |
---|
1003 | 1012 | int ret; |
---|
1004 | 1013 | |
---|
1005 | 1014 | rtnl_lock(); |
---|
1006 | | - ret = snprintf(name, len, "%s\n", netdev_name(net)); |
---|
| 1015 | + ret = scnprintf(name, len, "%s\n", |
---|
| 1016 | + dev->ifname_set ? net->name : netdev_name(net)); |
---|
1007 | 1017 | rtnl_unlock(); |
---|
1008 | | - return ret < len ? ret : len; |
---|
| 1018 | + return ret; |
---|
1009 | 1019 | } |
---|
1010 | 1020 | EXPORT_SYMBOL_GPL(gether_get_ifname); |
---|
1011 | 1021 | |
---|
1012 | | -/** |
---|
| 1022 | +int gether_set_ifname(struct net_device *net, const char *name, int len) |
---|
| 1023 | +{ |
---|
| 1024 | + struct eth_dev *dev = netdev_priv(net); |
---|
| 1025 | + char tmp[IFNAMSIZ]; |
---|
| 1026 | + const char *p; |
---|
| 1027 | + |
---|
| 1028 | + if (name[len - 1] == '\n') |
---|
| 1029 | + len--; |
---|
| 1030 | + |
---|
| 1031 | + if (len >= sizeof(tmp)) |
---|
| 1032 | + return -E2BIG; |
---|
| 1033 | + |
---|
| 1034 | + strscpy(tmp, name, len + 1); |
---|
| 1035 | + if (!dev_valid_name(tmp)) |
---|
| 1036 | + return -EINVAL; |
---|
| 1037 | + |
---|
| 1038 | + /* Require exactly one %d, so binding will not fail with EEXIST. */ |
---|
| 1039 | + p = strchr(name, '%'); |
---|
| 1040 | + if (!p || p[1] != 'd' || strchr(p + 2, '%')) |
---|
| 1041 | + return -EINVAL; |
---|
| 1042 | + |
---|
| 1043 | + strncpy(net->name, tmp, sizeof(net->name)); |
---|
| 1044 | + dev->ifname_set = true; |
---|
| 1045 | + |
---|
| 1046 | + return 0; |
---|
| 1047 | +} |
---|
| 1048 | +EXPORT_SYMBOL_GPL(gether_set_ifname); |
---|
| 1049 | + |
---|
| 1050 | +/* |
---|
1013 | 1051 | * gether_cleanup - remove Ethernet-over-USB device |
---|
1014 | 1052 | * Context: may sleep |
---|
1015 | 1053 | * |
---|