Skip to content

Commit

Permalink
ehea: Fixed possible kernel panic on VLAN packet recv
Browse files Browse the repository at this point in the history
This patch fixes a possible kernel panic due to not checking the vlan group
when processing received VLAN packets and a malfunction in VLAN/hypervisor
registration.

Signed-off-by: Thomas Klein <tklein@de.ibm.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
  • Loading branch information
Thomas Klein authored and Jeff Garzik committed Jun 9, 2007
1 parent 0d04761 commit dec590c
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 8 deletions.
2 changes: 1 addition & 1 deletion drivers/net/ehea/ehea.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
#include <asm/io.h>

#define DRV_NAME "ehea"
#define DRV_VERSION "EHEA_0061"
#define DRV_VERSION "EHEA_0064"

#define EHEA_MSG_DEFAULT (NETIF_MSG_LINK | NETIF_MSG_TIMER \
| NETIF_MSG_RX_ERR | NETIF_MSG_TX_ERR)
Expand Down
12 changes: 5 additions & 7 deletions drivers/net/ehea/ehea_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -451,7 +451,8 @@ static struct ehea_cqe *ehea_proc_rwqes(struct net_device *dev,
processed_rq3++;
}

if (cqe->status & EHEA_CQE_VLAN_TAG_XTRACT)
if ((cqe->status & EHEA_CQE_VLAN_TAG_XTRACT)
&& port->vgrp)
vlan_hwaccel_receive_skb(skb, port->vgrp,
cqe->vlan_tag);
else
Expand Down Expand Up @@ -1910,10 +1911,7 @@ static void ehea_vlan_rx_register(struct net_device *dev,
goto out;
}

if (grp)
memset(cb1->vlan_filter, 0, sizeof(cb1->vlan_filter));
else
memset(cb1->vlan_filter, 0xFF, sizeof(cb1->vlan_filter));
memset(cb1->vlan_filter, 0, sizeof(cb1->vlan_filter));

hret = ehea_h_modify_ehea_port(adapter->handle, port->logical_port_id,
H_PORT_CB1, H_PORT_CB1_ALL, cb1);
Expand Down Expand Up @@ -1947,7 +1945,7 @@ static void ehea_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
}

index = (vid / 64);
cb1->vlan_filter[index] |= ((u64)(1 << (vid & 0x3F)));
cb1->vlan_filter[index] |= ((u64)(0x8000000000000000 >> (vid & 0x3F)));

hret = ehea_h_modify_ehea_port(adapter->handle, port->logical_port_id,
H_PORT_CB1, H_PORT_CB1_ALL, cb1);
Expand Down Expand Up @@ -1982,7 +1980,7 @@ static void ehea_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
}

index = (vid / 64);
cb1->vlan_filter[index] &= ~((u64)(1 << (vid & 0x3F)));
cb1->vlan_filter[index] &= ~((u64)(0x8000000000000000 >> (vid & 0x3F)));

hret = ehea_h_modify_ehea_port(adapter->handle, port->logical_port_id,
H_PORT_CB1, H_PORT_CB1_ALL, cb1);
Expand Down

0 comments on commit dec590c

Please sign in to comment.