diff --git a/[refs] b/[refs] index ff7921cd743d..1ac2387b5b14 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 1627801def0e1cef948f9d593e6757eab295803f +refs/heads/master: d48ddb83666c32f14436106b8c9319f8ab24cf0a diff --git a/trunk/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/trunk/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index 9a88e01216bb..88d636a7459c 100644 --- a/trunk/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/trunk/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c @@ -44,7 +44,6 @@ #include #include #include -#include #include #include @@ -3225,6 +3224,7 @@ static void ixgbe_configure_virtualization(struct ixgbe_adapter *adapter) IXGBE_WRITE_REG(hw, IXGBE_VFRE(reg_offset ^ 1), reg_offset - 1); IXGBE_WRITE_REG(hw, IXGBE_VFTE(reg_offset), (~0) << vf_shift); IXGBE_WRITE_REG(hw, IXGBE_VFTE(reg_offset ^ 1), reg_offset - 1); + IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, IXGBE_PFDTXGSWC_VT_LBEN); /* Map PF MAC address in RAR Entry 0 to first pool following VFs */ hw->mac.ops.set_vmdq(hw, 0, VMDQ_P(0)); @@ -3247,6 +3247,8 @@ static void ixgbe_configure_virtualization(struct ixgbe_adapter *adapter) IXGBE_WRITE_REG(hw, IXGBE_GCR_EXT, gcr_ext); + /* enable Tx loopback for VF/PF communication */ + IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, IXGBE_PFDTXGSWC_VT_LBEN); /* Enable MAC Anti-Spoofing */ hw->mac.ops.set_mac_anti_spoofing(hw, (adapter->num_vfs != 0), @@ -7023,59 +7025,6 @@ static int ixgbe_ndo_fdb_dump(struct sk_buff *skb, return idx; } -static int ixgbe_ndo_bridge_setlink(struct net_device *dev, - struct nlmsghdr *nlh) -{ - struct ixgbe_adapter *adapter = netdev_priv(dev); - struct nlattr *attr, *br_spec; - int rem; - - if (!(adapter->flags & IXGBE_FLAG_SRIOV_ENABLED)) - return -EOPNOTSUPP; - - br_spec = nlmsg_find_attr(nlh, sizeof(struct ifinfomsg), IFLA_AF_SPEC); - - nla_for_each_nested(attr, br_spec, rem) { - __u16 mode; - u32 reg = 0; - - if (nla_type(attr) != IFLA_BRIDGE_MODE) - continue; - - mode = nla_get_u16(attr); - if (mode == BRIDGE_MODE_VEPA) - reg = 0; - else if (mode == BRIDGE_MODE_VEB) - reg = IXGBE_PFDTXGSWC_VT_LBEN; - else - return -EINVAL; - - IXGBE_WRITE_REG(&adapter->hw, IXGBE_PFDTXGSWC, reg); - - e_info(drv, "enabling bridge mode: %s\n", - mode == BRIDGE_MODE_VEPA ? "VEPA" : "VEB"); - } - - return 0; -} - -static int ixgbe_ndo_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, - struct net_device *dev) -{ - struct ixgbe_adapter *adapter = netdev_priv(dev); - u16 mode; - - if (!(adapter->flags & IXGBE_FLAG_SRIOV_ENABLED)) - return 0; - - if (IXGBE_READ_REG(&adapter->hw, IXGBE_PFDTXGSWC) & 1) - mode = BRIDGE_MODE_VEB; - else - mode = BRIDGE_MODE_VEPA; - - return ndo_dflt_bridge_getlink(skb, pid, seq, dev, mode); -} - static const struct net_device_ops ixgbe_netdev_ops = { .ndo_open = ixgbe_open, .ndo_stop = ixgbe_close, @@ -7115,8 +7064,6 @@ static const struct net_device_ops ixgbe_netdev_ops = { .ndo_fdb_add = ixgbe_ndo_fdb_add, .ndo_fdb_del = ixgbe_ndo_fdb_del, .ndo_fdb_dump = ixgbe_ndo_fdb_dump, - .ndo_bridge_setlink = ixgbe_ndo_bridge_setlink, - .ndo_bridge_getlink = ixgbe_ndo_bridge_getlink, }; /** diff --git a/trunk/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c b/trunk/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c index 7e3ac28ffba8..96876b7442b1 100644 --- a/trunk/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c +++ b/trunk/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c @@ -117,9 +117,6 @@ void ixgbe_enable_sriov(struct ixgbe_adapter *adapter, } } - /* Initialize default switching mode VEB */ - IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, IXGBE_PFDTXGSWC_VT_LBEN); - /* If call to enable VFs succeeded then allocate memory * for per VF control structures. */ diff --git a/trunk/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/trunk/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c index ac6a76deb01d..07d7eaba6f1b 100644 --- a/trunk/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +++ b/trunk/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c @@ -478,16 +478,6 @@ static bool ixgbevf_clean_rx_irq(struct ixgbevf_q_vector *q_vector, } skb->protocol = eth_type_trans(skb, rx_ring->netdev); - /* Workaround hardware that can't do proper VEPA multicast - * source pruning. - */ - if ((skb->pkt_type & (PACKET_BROADCAST | PACKET_MULTICAST)) && - !(compare_ether_addr(adapter->netdev->dev_addr, - eth_hdr(skb)->h_source))) { - dev_kfree_skb_irq(skb); - goto next_desc; - } - ixgbevf_receive_skb(q_vector, skb, staterr, rx_desc); next_desc: diff --git a/trunk/drivers/net/ethernet/qlogic/qla3xxx.c b/trunk/drivers/net/ethernet/qlogic/qla3xxx.c index 80ba7292ec3d..df09b1cb742f 100644 --- a/trunk/drivers/net/ethernet/qlogic/qla3xxx.c +++ b/trunk/drivers/net/ethernet/qlogic/qla3xxx.c @@ -1920,6 +1920,7 @@ static void ql_process_mac_tx_intr(struct ql3_adapter *qdev, { struct ql_tx_buf_cb *tx_cb; int i; + int retval = 0; if (mac_rsp->flags & OB_MAC_IOCB_RSP_S) { netdev_warn(qdev->ndev, @@ -1934,6 +1935,7 @@ static void ql_process_mac_tx_intr(struct ql3_adapter *qdev, "Frame too short to be legal, frame not sent\n"); qdev->ndev->stats.tx_errors++; + retval = -EIO; goto frame_not_sent; } @@ -1942,6 +1944,7 @@ static void ql_process_mac_tx_intr(struct ql3_adapter *qdev, mac_rsp->transaction_id); qdev->ndev->stats.tx_errors++; + retval = -EIO; goto invalid_seg_count; } @@ -3950,4 +3953,15 @@ static struct pci_driver ql3xxx_driver = { .remove = __devexit_p(ql3xxx_remove), }; -module_pci_driver(ql3xxx_driver); +static int __init ql3xxx_init_module(void) +{ + return pci_register_driver(&ql3xxx_driver); +} + +static void __exit ql3xxx_exit(void) +{ + pci_unregister_driver(&ql3xxx_driver); +} + +module_init(ql3xxx_init_module); +module_exit(ql3xxx_exit); diff --git a/trunk/drivers/net/usb/Kconfig b/trunk/drivers/net/usb/Kconfig index e62882c68dd7..2ab8043e1e28 100644 --- a/trunk/drivers/net/usb/Kconfig +++ b/trunk/drivers/net/usb/Kconfig @@ -256,8 +256,6 @@ config USB_NET_SMSC75XX config USB_NET_SMSC95XX tristate "SMSC LAN95XX based USB 2.0 10/100 ethernet devices" depends on USB_USBNET - select BITREVERSE - select CRC16 select CRC32 help This option adds support for SMSC LAN95XX based USB 2.0 diff --git a/trunk/drivers/net/usb/smsc95xx.c b/trunk/drivers/net/usb/smsc95xx.c index 46cd784467d5..1730f753d062 100644 --- a/trunk/drivers/net/usb/smsc95xx.c +++ b/trunk/drivers/net/usb/smsc95xx.c @@ -26,8 +26,6 @@ #include #include #include -#include -#include #include #include #include @@ -48,8 +46,7 @@ #define SMSC95XX_INTERNAL_PHY_ID (1) #define SMSC95XX_TX_OVERHEAD (8) #define SMSC95XX_TX_OVERHEAD_CSUM (12) -#define SUPPORTED_WAKE (WAKE_UCAST | WAKE_BCAST | \ - WAKE_MCAST | WAKE_ARP | WAKE_MAGIC) +#define SUPPORTED_WAKE (WAKE_MAGIC) #define check_warn(ret, fmt, args...) \ ({ if (ret < 0) netdev_warn(dev->net, fmt, ##args); }) @@ -66,7 +63,6 @@ struct smsc95xx_priv { u32 hash_lo; u32 wolopts; spinlock_t mac_cr_lock; - int wuff_filter_count; }; static bool turbo_mode = true; @@ -960,7 +956,6 @@ static const struct net_device_ops smsc95xx_netdev_ops = { static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf) { struct smsc95xx_priv *pdata = NULL; - u32 val; int ret; printk(KERN_INFO SMSC_CHIPNAME " v" SMSC_DRIVER_VERSION "\n"); @@ -991,15 +986,6 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf) /* Init all registers */ ret = smsc95xx_reset(dev); - /* detect device revision as different features may be available */ - ret = smsc95xx_read_reg(dev, ID_REV, &val); - check_warn_return(ret, "Failed to read ID_REV: %d\n", ret); - val >>= 16; - if ((val == ID_REV_CHIP_ID_9500A_) || (val == ID_REV_CHIP_ID_9512_)) - pdata->wuff_filter_count = LAN9500A_WUFF_NUM; - else - pdata->wuff_filter_count = LAN9500_WUFF_NUM; - dev->net->netdev_ops = &smsc95xx_netdev_ops; dev->net->ethtool_ops = &smsc95xx_ethtool_ops; dev->net->flags |= IFF_MULTICAST; @@ -1019,11 +1005,6 @@ static void smsc95xx_unbind(struct usbnet *dev, struct usb_interface *intf) } } -static u16 smsc_crc(const u8 *buffer, size_t len, int filter) -{ - return bitrev16(crc16(0xFFFF, buffer, len)) << ((filter % 2) * 16); -} - static int smsc95xx_suspend(struct usb_interface *intf, pm_message_t message) { struct usbnet *dev = usb_get_intfdata(intf); @@ -1068,94 +1049,6 @@ static int smsc95xx_suspend(struct usb_interface *intf, pm_message_t message) return 0; } - if (pdata->wolopts & (WAKE_BCAST | WAKE_MCAST | WAKE_ARP | WAKE_UCAST)) { - u32 *filter_mask = kzalloc(32, GFP_KERNEL); - u32 *command = kzalloc(2, GFP_KERNEL); - u32 *offset = kzalloc(2, GFP_KERNEL); - u32 *crc = kzalloc(4, GFP_KERNEL); - int i, filter = 0; - - if (pdata->wolopts & WAKE_BCAST) { - const u8 bcast[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; - netdev_info(dev->net, "enabling broadcast detection"); - filter_mask[filter * 4] = 0x003F; - filter_mask[filter * 4 + 1] = 0x00; - filter_mask[filter * 4 + 2] = 0x00; - filter_mask[filter * 4 + 3] = 0x00; - command[filter/4] |= 0x05UL << ((filter % 4) * 8); - offset[filter/4] |= 0x00 << ((filter % 4) * 8); - crc[filter/2] |= smsc_crc(bcast, 6, filter); - filter++; - } - - if (pdata->wolopts & WAKE_MCAST) { - const u8 mcast[] = {0x01, 0x00, 0x5E}; - netdev_info(dev->net, "enabling multicast detection"); - filter_mask[filter * 4] = 0x0007; - filter_mask[filter * 4 + 1] = 0x00; - filter_mask[filter * 4 + 2] = 0x00; - filter_mask[filter * 4 + 3] = 0x00; - command[filter/4] |= 0x09UL << ((filter % 4) * 8); - offset[filter/4] |= 0x00 << ((filter % 4) * 8); - crc[filter/2] |= smsc_crc(mcast, 3, filter); - filter++; - } - - if (pdata->wolopts & WAKE_ARP) { - const u8 arp[] = {0x08, 0x06}; - netdev_info(dev->net, "enabling ARP detection"); - filter_mask[filter * 4] = 0x0003; - filter_mask[filter * 4 + 1] = 0x00; - filter_mask[filter * 4 + 2] = 0x00; - filter_mask[filter * 4 + 3] = 0x00; - command[filter/4] |= 0x05UL << ((filter % 4) * 8); - offset[filter/4] |= 0x0C << ((filter % 4) * 8); - crc[filter/2] |= smsc_crc(arp, 2, filter); - filter++; - } - - if (pdata->wolopts & WAKE_UCAST) { - netdev_info(dev->net, "enabling unicast detection"); - filter_mask[filter * 4] = 0x003F; - filter_mask[filter * 4 + 1] = 0x00; - filter_mask[filter * 4 + 2] = 0x00; - filter_mask[filter * 4 + 3] = 0x00; - command[filter/4] |= 0x01UL << ((filter % 4) * 8); - offset[filter/4] |= 0x00 << ((filter % 4) * 8); - crc[filter/2] |= smsc_crc(dev->net->dev_addr, ETH_ALEN, filter); - filter++; - } - - for (i = 0; i < (pdata->wuff_filter_count * 4); i++) { - ret = smsc95xx_write_reg(dev, WUFF, filter_mask[i]); - check_warn_return(ret, "Error writing WUFF"); - } - - for (i = 0; i < (pdata->wuff_filter_count / 4); i++) { - ret = smsc95xx_write_reg(dev, WUFF, command[i]); - check_warn_return(ret, "Error writing WUFF"); - } - - for (i = 0; i < (pdata->wuff_filter_count / 4); i++) { - ret = smsc95xx_write_reg(dev, WUFF, offset[i]); - check_warn_return(ret, "Error writing WUFF"); - } - - for (i = 0; i < (pdata->wuff_filter_count / 2); i++) { - ret = smsc95xx_write_reg(dev, WUFF, crc[i]); - check_warn_return(ret, "Error writing WUFF"); - } - - /* clear any pending pattern match packet status */ - ret = smsc95xx_read_reg(dev, WUCSR, &val); - check_warn_return(ret, "Error reading WUCSR"); - - val |= WUCSR_WUFR_; - - ret = smsc95xx_write_reg(dev, WUCSR, val); - check_warn_return(ret, "Error writing WUCSR"); - } - if (pdata->wolopts & WAKE_MAGIC) { /* clear any pending magic packet status */ ret = smsc95xx_read_reg(dev, WUCSR, &val); @@ -1167,18 +1060,10 @@ static int smsc95xx_suspend(struct usb_interface *intf, pm_message_t message) check_warn_return(ret, "Error writing WUCSR"); } - /* enable/disable wakeup sources */ + /* enable/disable magic packup wake */ ret = smsc95xx_read_reg(dev, WUCSR, &val); check_warn_return(ret, "Error reading WUCSR"); - if (pdata->wolopts & (WAKE_BCAST | WAKE_MCAST | WAKE_ARP | WAKE_UCAST)) { - netdev_info(dev->net, "enabling pattern match wakeup"); - val |= WUCSR_WAKE_EN_; - } else { - netdev_info(dev->net, "disabling pattern match wakeup"); - val &= ~WUCSR_WAKE_EN_; - } - if (pdata->wolopts & WAKE_MAGIC) { netdev_info(dev->net, "enabling magic packet wakeup"); val |= WUCSR_MPEN_; @@ -1199,7 +1084,7 @@ static int smsc95xx_suspend(struct usb_interface *intf, pm_message_t message) ret = smsc95xx_write_reg(dev, PM_CTRL, val); check_warn_return(ret, "Error writing PM_CTRL"); - /* enable receiver to enable frame reception */ + /* enable receiver */ smsc95xx_start_rx_path(dev); /* some wol options are enabled, so enter SUSPEND0 */ @@ -1238,14 +1123,14 @@ static int smsc95xx_resume(struct usb_interface *intf) BUG_ON(!dev); - if (pdata->wolopts) { + if (pdata->wolopts & WAKE_MAGIC) { smsc95xx_clear_feature(dev, USB_DEVICE_REMOTE_WAKEUP); - /* clear wake-up sources */ + /* Disable magic packup wake */ ret = smsc95xx_read_reg(dev, WUCSR, &val); check_warn_return(ret, "Error reading WUCSR"); - val &= ~(WUCSR_WAKE_EN_ | WUCSR_MPEN_); + val &= ~WUCSR_MPEN_; ret = smsc95xx_write_reg(dev, WUCSR, val); check_warn_return(ret, "Error writing WUCSR"); diff --git a/trunk/drivers/net/usb/smsc95xx.h b/trunk/drivers/net/usb/smsc95xx.h index 1f862693dd7e..2ff9815aa27c 100644 --- a/trunk/drivers/net/usb/smsc95xx.h +++ b/trunk/drivers/net/usb/smsc95xx.h @@ -53,8 +53,6 @@ #define ID_REV_CHIP_ID_MASK_ (0xFFFF0000) #define ID_REV_CHIP_REV_MASK_ (0x0000FFFF) #define ID_REV_CHIP_ID_9500_ (0x9500) -#define ID_REV_CHIP_ID_9500A_ (0x9E00) -#define ID_REV_CHIP_ID_9512_ (0xEC00) #define INT_STS (0x08) #define INT_STS_TX_STOP_ (0x00020000) @@ -205,11 +203,8 @@ #define VLAN2 (0x124) #define WUFF (0x128) -#define LAN9500_WUFF_NUM (4) -#define LAN9500A_WUFF_NUM (8) #define WUCSR (0x12C) -#define WUCSR_WFF_PTR_RST_ (0x80000000) #define WUCSR_GUE_ (0x00000200) #define WUCSR_WUFR_ (0x00000040) #define WUCSR_MPR_ (0x00000020) diff --git a/trunk/include/linux/netdevice.h b/trunk/include/linux/netdevice.h index 7bf867c97043..f8eda0276f03 100644 --- a/trunk/include/linux/netdevice.h +++ b/trunk/include/linux/netdevice.h @@ -887,10 +887,6 @@ struct netdev_fcoe_hbainfo { * struct net_device *dev, int idx) * Used to add FDB entries to dump requests. Implementers should add * entries to skb and update idx with the number of entries. - * - * int (*ndo_bridge_setlink)(struct net_device *dev, struct nlmsghdr *nlh) - * int (*ndo_bridge_getlink)(struct sk_buff *skb, u32 pid, u32 seq, - * struct net_device *dev) */ struct net_device_ops { int (*ndo_init)(struct net_device *dev); @@ -1002,12 +998,6 @@ struct net_device_ops { struct netlink_callback *cb, struct net_device *dev, int idx); - - int (*ndo_bridge_setlink)(struct net_device *dev, - struct nlmsghdr *nlh); - int (*ndo_bridge_getlink)(struct sk_buff *skb, - u32 pid, u32 seq, - struct net_device *dev); }; /* diff --git a/trunk/include/linux/rtnetlink.h b/trunk/include/linux/rtnetlink.h index 489dd7bb28ec..7002bbfd5d4a 100644 --- a/trunk/include/linux/rtnetlink.h +++ b/trunk/include/linux/rtnetlink.h @@ -69,7 +69,4 @@ extern int ndo_dflt_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb, struct net_device *dev, int idx); - -extern int ndo_dflt_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, - struct net_device *dev, u16 mode); #endif /* __LINUX_RTNETLINK_H */ diff --git a/trunk/include/uapi/linux/if_bridge.h b/trunk/include/uapi/linux/if_bridge.h index b3885791e11e..a8fe9549ddbc 100644 --- a/trunk/include/uapi/linux/if_bridge.h +++ b/trunk/include/uapi/linux/if_bridge.h @@ -97,23 +97,5 @@ struct __fdb_entry { __u16 unused; }; -/* Bridge Flags */ -#define BRIDGE_FLAGS_MASTER 1 /* Bridge command to/from master */ -#define BRIDGE_FLAGS_SELF 2 /* Bridge command to/from lowerdev */ -#define BRIDGE_MODE_VEB 0 /* Default loopback mode */ -#define BRIDGE_MODE_VEPA 1 /* 802.1Qbg defined VEPA mode */ - -/* Bridge management nested attributes - * [IFLA_AF_SPEC] = { - * [IFLA_BRIDGE_FLAGS] - * [IFLA_BRIDGE_MODE] - * } - */ -enum { - IFLA_BRIDGE_FLAGS, - IFLA_BRIDGE_MODE, - __IFLA_BRIDGE_MAX, -}; -#define IFLA_BRIDGE_MAX (__IFLA_BRIDGE_MAX - 1) #endif /* _UAPI_LINUX_IF_BRIDGE_H */ diff --git a/trunk/net/batman-adv/routing.c b/trunk/net/batman-adv/routing.c index 376b4cc6ca82..8bdafc85ba4f 100644 --- a/trunk/net/batman-adv/routing.c +++ b/trunk/net/batman-adv/routing.c @@ -687,21 +687,8 @@ int batadv_recv_roam_adv(struct sk_buff *skb, struct batadv_hard_iface *recv_if) struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface); struct batadv_roam_adv_packet *roam_adv_packet; struct batadv_orig_node *orig_node; - struct ethhdr *ethhdr; - - /* drop packet if it has not necessary minimum size */ - if (unlikely(!pskb_may_pull(skb, - sizeof(struct batadv_roam_adv_packet)))) - goto out; - - ethhdr = (struct ethhdr *)skb_mac_header(skb); - /* packet with unicast indication but broadcast recipient */ - if (is_broadcast_ether_addr(ethhdr->h_dest)) - goto out; - - /* packet with broadcast sender address */ - if (is_broadcast_ether_addr(ethhdr->h_source)) + if (batadv_check_unicast_packet(skb, sizeof(*roam_adv_packet)) < 0) goto out; batadv_inc_counter(bat_priv, BATADV_CNT_TT_ROAM_ADV_RX); diff --git a/trunk/net/bridge/br_device.c b/trunk/net/bridge/br_device.c index 63b5b088e80f..070e8a68cfc6 100644 --- a/trunk/net/bridge/br_device.c +++ b/trunk/net/bridge/br_device.c @@ -313,8 +313,6 @@ static const struct net_device_ops br_netdev_ops = { .ndo_fdb_add = br_fdb_add, .ndo_fdb_del = br_fdb_delete, .ndo_fdb_dump = br_fdb_dump, - .ndo_bridge_getlink = br_getlink, - .ndo_bridge_setlink = br_setlink, }; static void br_dev_free(struct net_device *dev) diff --git a/trunk/net/bridge/br_netlink.c b/trunk/net/bridge/br_netlink.c index 14b065cbd214..093f527276a3 100644 --- a/trunk/net/bridge/br_netlink.c +++ b/trunk/net/bridge/br_netlink.c @@ -111,33 +111,54 @@ void br_ifinfo_notify(int event, struct net_bridge_port *port) /* * Dump information about all ports, in response to GETLINK */ -int br_getlink(struct sk_buff *skb, u32 pid, u32 seq, - struct net_device *dev) +static int br_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) { - int err = 0; - struct net_bridge_port *port = br_port_get_rcu(dev); - - /* not a bridge port */ - if (!port) - goto out; + struct net *net = sock_net(skb->sk); + struct net_device *dev; + int idx; + + idx = 0; + rcu_read_lock(); + for_each_netdev_rcu(net, dev) { + struct net_bridge_port *port = br_port_get_rcu(dev); + + /* not a bridge port */ + if (!port || idx < cb->args[0]) + goto skip; + + if (br_fill_ifinfo(skb, port, + NETLINK_CB(cb->skb).portid, + cb->nlh->nlmsg_seq, RTM_NEWLINK, + NLM_F_MULTI) < 0) + break; +skip: + ++idx; + } + rcu_read_unlock(); + cb->args[0] = idx; - err = br_fill_ifinfo(skb, port, pid, seq, RTM_NEWLINK, NLM_F_MULTI); -out: - return err; + return skb->len; } /* * Change state of port (ie from forwarding to blocking etc) * Used by spanning tree in user space. */ -int br_setlink(struct net_device *dev, struct nlmsghdr *nlh) +static int br_rtm_setlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) { + struct net *net = sock_net(skb->sk); struct ifinfomsg *ifm; struct nlattr *protinfo; + struct net_device *dev; struct net_bridge_port *p; u8 new_state; + if (nlmsg_len(nlh) < sizeof(*ifm)) + return -EINVAL; + ifm = nlmsg_data(nlh); + if (ifm->ifi_family != AF_BRIDGE) + return -EPFNOSUPPORT; protinfo = nlmsg_find_attr(nlh, sizeof(*ifm), IFLA_PROTINFO); if (!protinfo || nla_len(protinfo) < sizeof(u8)) @@ -147,6 +168,10 @@ int br_setlink(struct net_device *dev, struct nlmsghdr *nlh) if (new_state > BR_STATE_BLOCKING) return -EINVAL; + dev = __dev_get_by_index(net, ifm->ifi_index); + if (!dev) + return -ENODEV; + p = br_port_get_rtnl(dev); if (!p) return -EINVAL; @@ -166,6 +191,8 @@ int br_setlink(struct net_device *dev, struct nlmsghdr *nlh) br_port_state_selection(p->br); spin_unlock_bh(&p->br->lock); + br_ifinfo_notify(RTM_NEWLINK, p); + return 0; } @@ -191,7 +218,29 @@ struct rtnl_link_ops br_link_ops __read_mostly = { int __init br_netlink_init(void) { - return rtnl_link_register(&br_link_ops); + int err; + + err = rtnl_link_register(&br_link_ops); + if (err < 0) + goto err1; + + err = __rtnl_register(PF_BRIDGE, RTM_GETLINK, NULL, + br_dump_ifinfo, NULL); + if (err) + goto err2; + err = __rtnl_register(PF_BRIDGE, RTM_SETLINK, + br_rtm_setlink, NULL, NULL); + if (err) + goto err3; + + return 0; + +err3: + rtnl_unregister_all(PF_BRIDGE); +err2: + rtnl_link_unregister(&br_link_ops); +err1: + return err; } void __exit br_netlink_fini(void) diff --git a/trunk/net/bridge/br_private.h b/trunk/net/bridge/br_private.h index 6f40c14a2a65..9b278c4ebee1 100644 --- a/trunk/net/bridge/br_private.h +++ b/trunk/net/bridge/br_private.h @@ -158,9 +158,7 @@ struct net_bridge_port static inline struct net_bridge_port *br_port_get_rcu(const struct net_device *dev) { - struct net_bridge_port *port = - rcu_dereference_rtnl(dev->rx_handler_data); - + struct net_bridge_port *port = rcu_dereference(dev->rx_handler_data); return br_port_exists(dev) ? port : NULL; } @@ -555,9 +553,6 @@ extern struct rtnl_link_ops br_link_ops; extern int br_netlink_init(void); extern void br_netlink_fini(void); extern void br_ifinfo_notify(int event, struct net_bridge_port *port); -extern int br_setlink(struct net_device *dev, struct nlmsghdr *nlmsg); -extern int br_getlink(struct sk_buff *skb, u32 pid, u32 seq, - struct net_device *dev); #ifdef CONFIG_SYSFS /* br_sysfs_if.c */ diff --git a/trunk/net/core/rtnetlink.c b/trunk/net/core/rtnetlink.c index 51dc58ff0091..64fe3cca2a4e 100644 --- a/trunk/net/core/rtnetlink.c +++ b/trunk/net/core/rtnetlink.c @@ -2252,210 +2252,6 @@ static int rtnl_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb) return skb->len; } -int ndo_dflt_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, - struct net_device *dev, u16 mode) -{ - struct nlmsghdr *nlh; - struct ifinfomsg *ifm; - struct nlattr *br_afspec; - u8 operstate = netif_running(dev) ? dev->operstate : IF_OPER_DOWN; - - nlh = nlmsg_put(skb, pid, seq, RTM_NEWLINK, sizeof(*ifm), NLM_F_MULTI); - if (nlh == NULL) - return -EMSGSIZE; - - ifm = nlmsg_data(nlh); - ifm->ifi_family = AF_BRIDGE; - ifm->__ifi_pad = 0; - ifm->ifi_type = dev->type; - ifm->ifi_index = dev->ifindex; - ifm->ifi_flags = dev_get_flags(dev); - ifm->ifi_change = 0; - - - if (nla_put_string(skb, IFLA_IFNAME, dev->name) || - nla_put_u32(skb, IFLA_MTU, dev->mtu) || - nla_put_u8(skb, IFLA_OPERSTATE, operstate) || - (dev->master && - nla_put_u32(skb, IFLA_MASTER, dev->master->ifindex)) || - (dev->addr_len && - nla_put(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr)) || - (dev->ifindex != dev->iflink && - nla_put_u32(skb, IFLA_LINK, dev->iflink))) - goto nla_put_failure; - - br_afspec = nla_nest_start(skb, IFLA_AF_SPEC); - if (!br_afspec) - goto nla_put_failure; - - if (nla_put_u16(skb, IFLA_BRIDGE_FLAGS, BRIDGE_FLAGS_SELF) || - nla_put_u16(skb, IFLA_BRIDGE_MODE, mode)) { - nla_nest_cancel(skb, br_afspec); - goto nla_put_failure; - } - nla_nest_end(skb, br_afspec); - - return nlmsg_end(skb, nlh); -nla_put_failure: - nlmsg_cancel(skb, nlh); - return -EMSGSIZE; -} -EXPORT_SYMBOL(ndo_dflt_bridge_getlink); - -static int rtnl_bridge_getlink(struct sk_buff *skb, struct netlink_callback *cb) -{ - struct net *net = sock_net(skb->sk); - struct net_device *dev; - int idx = 0; - u32 portid = NETLINK_CB(cb->skb).portid; - u32 seq = cb->nlh->nlmsg_seq; - - rcu_read_lock(); - for_each_netdev_rcu(net, dev) { - const struct net_device_ops *ops = dev->netdev_ops; - struct net_device *master = dev->master; - - if (idx < cb->args[0]) - continue; - - if (master && master->netdev_ops->ndo_bridge_getlink) { - const struct net_device_ops *bops = master->netdev_ops; - int err = bops->ndo_bridge_getlink(skb, portid, - seq, dev); - - if (err < 0) - break; - else - idx++; - } - - if (ops->ndo_bridge_getlink) { - int err = ops->ndo_bridge_getlink(skb, portid, - seq, dev); - - if (err < 0) - break; - else - idx++; - } - } - rcu_read_unlock(); - cb->args[0] = idx; - - return skb->len; -} - -static inline size_t bridge_nlmsg_size(void) -{ - return NLMSG_ALIGN(sizeof(struct ifinfomsg)) - + nla_total_size(IFNAMSIZ) /* IFLA_IFNAME */ - + nla_total_size(MAX_ADDR_LEN) /* IFLA_ADDRESS */ - + nla_total_size(sizeof(u32)) /* IFLA_MASTER */ - + nla_total_size(sizeof(u32)) /* IFLA_MTU */ - + nla_total_size(sizeof(u32)) /* IFLA_LINK */ - + nla_total_size(sizeof(u32)) /* IFLA_OPERSTATE */ - + nla_total_size(sizeof(u8)) /* IFLA_PROTINFO */ - + nla_total_size(sizeof(struct nlattr)) /* IFLA_AF_SPEC */ - + nla_total_size(sizeof(u16)) /* IFLA_BRIDGE_FLAGS */ - + nla_total_size(sizeof(u16)); /* IFLA_BRIDGE_MODE */ -} - -static int rtnl_bridge_notify(struct net_device *dev, u16 flags) -{ - struct net *net = dev_net(dev); - struct net_device *master = dev->master; - struct sk_buff *skb; - int err = -EOPNOTSUPP; - - skb = nlmsg_new(bridge_nlmsg_size(), GFP_ATOMIC); - if (!skb) { - err = -ENOMEM; - goto errout; - } - - if (!flags && master && master->netdev_ops->ndo_bridge_getlink) - err = master->netdev_ops->ndo_bridge_getlink(skb, 0, 0, dev); - else if (dev->netdev_ops->ndo_bridge_getlink) - err = dev->netdev_ops->ndo_bridge_getlink(skb, 0, 0, dev); - - if (err < 0) - goto errout; - - rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL, GFP_ATOMIC); - return 0; -errout: - WARN_ON(err == -EMSGSIZE); - kfree_skb(skb); - rtnl_set_sk_err(net, RTNLGRP_LINK, err); - return err; -} - -static int rtnl_bridge_setlink(struct sk_buff *skb, struct nlmsghdr *nlh, - void *arg) -{ - struct net *net = sock_net(skb->sk); - struct ifinfomsg *ifm; - struct net_device *dev; - struct nlattr *br_spec, *attr = NULL; - int rem, err = -EOPNOTSUPP; - u16 flags = 0; - - if (nlmsg_len(nlh) < sizeof(*ifm)) - return -EINVAL; - - ifm = nlmsg_data(nlh); - if (ifm->ifi_family != AF_BRIDGE) - return -EPFNOSUPPORT; - - dev = __dev_get_by_index(net, ifm->ifi_index); - if (!dev) { - pr_info("PF_BRIDGE: RTM_SETLINK with unknown ifindex\n"); - return -ENODEV; - } - - br_spec = nlmsg_find_attr(nlh, sizeof(struct ifinfomsg), IFLA_AF_SPEC); - if (br_spec) { - nla_for_each_nested(attr, br_spec, rem) { - if (nla_type(attr) == IFLA_BRIDGE_FLAGS) { - flags = nla_get_u16(attr); - break; - } - } - } - - if (!flags || (flags & BRIDGE_FLAGS_MASTER)) { - if (!dev->master || - !dev->master->netdev_ops->ndo_bridge_setlink) { - err = -EOPNOTSUPP; - goto out; - } - - err = dev->master->netdev_ops->ndo_bridge_setlink(dev, nlh); - if (err) - goto out; - - flags &= ~BRIDGE_FLAGS_MASTER; - } - - if ((flags & BRIDGE_FLAGS_SELF)) { - if (!dev->netdev_ops->ndo_bridge_setlink) - err = -EOPNOTSUPP; - else - err = dev->netdev_ops->ndo_bridge_setlink(dev, nlh); - - if (!err) - flags &= ~BRIDGE_FLAGS_SELF; - } - - if (attr && nla_type(attr) == IFLA_BRIDGE_FLAGS) - memcpy(nla_data(attr), &flags, sizeof(flags)); - /* Generate event to notify upper layer of bridge change */ - if (!err) - err = rtnl_bridge_notify(dev, flags); -out: - return err; -} - /* Protected by RTNL sempahore. */ static struct rtattr **rta_buf; static int rtattr_max; @@ -2637,8 +2433,5 @@ void __init rtnetlink_init(void) rtnl_register(PF_BRIDGE, RTM_NEWNEIGH, rtnl_fdb_add, NULL, NULL); rtnl_register(PF_BRIDGE, RTM_DELNEIGH, rtnl_fdb_del, NULL, NULL); rtnl_register(PF_BRIDGE, RTM_GETNEIGH, NULL, rtnl_fdb_dump, NULL); - - rtnl_register(PF_BRIDGE, RTM_GETLINK, NULL, rtnl_bridge_getlink, NULL); - rtnl_register(PF_BRIDGE, RTM_SETLINK, rtnl_bridge_setlink, NULL, NULL); } diff --git a/trunk/net/ipv4/ipconfig.c b/trunk/net/ipv4/ipconfig.c index d763701cff1b..798358b10717 100644 --- a/trunk/net/ipv4/ipconfig.c +++ b/trunk/net/ipv4/ipconfig.c @@ -1500,10 +1500,8 @@ static int __init ip_auto_config(void) * Clue in the operator. */ pr_info("IP-Config: Complete:\n"); - - pr_info(" device=%s, hwaddr=%*phC, ipaddr=%pI4, mask=%pI4, gw=%pI4\n", - ic_dev->name, ic_dev->addr_len, ic_dev->dev_addr, - &ic_myaddr, &ic_netmask, &ic_gateway); + pr_info(" device=%s, addr=%pI4, mask=%pI4, gw=%pI4\n", + ic_dev->name, &ic_myaddr, &ic_netmask, &ic_gateway); pr_info(" host=%s, domain=%s, nis-domain=%s\n", utsname()->nodename, ic_domain, utsname()->domainname); pr_info(" bootserver=%pI4, rootserver=%pI4, rootpath=%s",