提交 2a5391a1 编写于 作者: M Michael Ellerman 提交者: Jeff Garzik

[PATCH] iseries_veth: Fix broken promiscuous handling

Due to a logic bug, once promiscuous mode is enabled in the iseries_veth
driver it is never disabled.

The driver keeps two flags, promiscuous and all_mcast which have exactly the
same effect. This is because we only ever receive packets destined for us,
or multicast packets. So consolidate them into one promiscuous flag for
simplicity.
Signed-off-by: NMichael Ellerman <michael@ellerman.id.au>
Signed-off-by: NJeff Garzik <jgarzik@pobox.com>
上级 58c5900b
...@@ -159,7 +159,6 @@ struct veth_port { ...@@ -159,7 +159,6 @@ struct veth_port {
rwlock_t mcast_gate; rwlock_t mcast_gate;
int promiscuous; int promiscuous;
int all_mcast;
int num_mcast; int num_mcast;
u64 mcast_addr[VETH_MAX_MCAST]; u64 mcast_addr[VETH_MAX_MCAST];
}; };
...@@ -756,17 +755,15 @@ static void veth_set_multicast_list(struct net_device *dev) ...@@ -756,17 +755,15 @@ static void veth_set_multicast_list(struct net_device *dev)
write_lock_irqsave(&port->mcast_gate, flags); write_lock_irqsave(&port->mcast_gate, flags);
if (dev->flags & IFF_PROMISC) { /* set promiscuous mode */ if ((dev->flags & IFF_PROMISC) || (dev->flags & IFF_ALLMULTI) ||
printk(KERN_INFO "%s: Promiscuous mode enabled.\n", (dev->mc_count > VETH_MAX_MCAST)) {
dev->name);
port->promiscuous = 1; port->promiscuous = 1;
} else if ( (dev->flags & IFF_ALLMULTI)
|| (dev->mc_count > VETH_MAX_MCAST) ) {
port->all_mcast = 1;
} else { } else {
struct dev_mc_list *dmi = dev->mc_list; struct dev_mc_list *dmi = dev->mc_list;
int i; int i;
port->promiscuous = 0;
/* Update table */ /* Update table */
port->num_mcast = 0; port->num_mcast = 0;
...@@ -1145,12 +1142,9 @@ static inline int veth_frame_wanted(struct veth_port *port, u64 mac_addr) ...@@ -1145,12 +1142,9 @@ static inline int veth_frame_wanted(struct veth_port *port, u64 mac_addr)
if ( (mac_addr == port->mac_addr) || (mac_addr == 0xffffffffffff0000) ) if ( (mac_addr == port->mac_addr) || (mac_addr == 0xffffffffffff0000) )
return 1; return 1;
if (! (((char *) &mac_addr)[0] & 0x01))
return 0;
read_lock_irqsave(&port->mcast_gate, flags); read_lock_irqsave(&port->mcast_gate, flags);
if (port->promiscuous || port->all_mcast) { if (port->promiscuous) {
wanted = 1; wanted = 1;
goto out; goto out;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册