mirror of https://gitee.com/openkylin/linux.git
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/errno.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/filter.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;
|
||||
|
||||
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_leave = lb_port_leave,
|
||||
.port_disabled = lb_port_disabled,
|
||||
.receive = lb_receive,
|
||||
.transmit = lb_transmit,
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue