forked from Minki/linux
team: loadbalance: push lacpdus to exact delivery
When team is in bridge and LACP is utilized, LACPDU packets are pushed to userspace using raw socket and there they are processed. However, since8626c56c82
, LACPDU skbs are dropped by bridge rx_handler so they never reach packet handlers in rx path. Fix this by explicity treat LACPDUs to be pushed to exact delivery in team rx_handler. Reported-by: Ido Schimmel <idosch@mellanox.com> Fixes:8626c56c82
("bridge: fix potential use-after-free when hook returns QUEUE or STOLEN verdict") Signed-off-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
c234af5875
commit
c15e07b02b
@ -14,9 +14,23 @@
|
|||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/netdevice.h>
|
#include <linux/netdevice.h>
|
||||||
|
#include <linux/etherdevice.h>
|
||||||
#include <linux/filter.h>
|
#include <linux/filter.h>
|
||||||
#include <linux/if_team.h>
|
#include <linux/if_team.h>
|
||||||
|
|
||||||
|
static rx_handler_result_t lb_receive(struct team *team, struct team_port *port,
|
||||||
|
struct sk_buff *skb)
|
||||||
|
{
|
||||||
|
if (unlikely(skb->protocol == htons(ETH_P_SLOW))) {
|
||||||
|
/* LACPDU packets should go to exact delivery */
|
||||||
|
const unsigned char *dest = eth_hdr(skb)->h_dest;
|
||||||
|
|
||||||
|
if (is_link_local_ether_addr(dest) && dest[5] == 0x02)
|
||||||
|
return RX_HANDLER_EXACT;
|
||||||
|
}
|
||||||
|
return RX_HANDLER_ANOTHER;
|
||||||
|
}
|
||||||
|
|
||||||
struct lb_priv;
|
struct lb_priv;
|
||||||
|
|
||||||
typedef struct team_port *lb_select_tx_port_func_t(struct team *,
|
typedef struct team_port *lb_select_tx_port_func_t(struct team *,
|
||||||
@ -652,6 +666,7 @@ static const struct team_mode_ops lb_mode_ops = {
|
|||||||
.port_enter = lb_port_enter,
|
.port_enter = lb_port_enter,
|
||||||
.port_leave = lb_port_leave,
|
.port_leave = lb_port_leave,
|
||||||
.port_disabled = lb_port_disabled,
|
.port_disabled = lb_port_disabled,
|
||||||
|
.receive = lb_receive,
|
||||||
.transmit = lb_transmit,
|
.transmit = lb_transmit,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user