/* Basic tx selection based solely by hash */ static struct team_port *lb_hash_select_tx_port(struct team *team, struct lb_priv *lb_priv, struct sk_buff *skb, unsigned char hash) { int port_index = team_num_to_port_index(team, hash); return team_get_port_by_index_rcu(team, port_index); }
static bool rnd_transmit(struct team *team, struct sk_buff *skb) { struct team_port *port; int port_index; port_index = prandom_u32_max(team->en_port_count); port = team_get_port_by_index_rcu(team, port_index); if (unlikely(!port)) goto drop; port = team_get_first_port_txable_rcu(team, port); if (unlikely(!port)) goto drop; if (team_dev_queue_xmit(team, port, skb)) return false; return true; drop: dev_kfree_skb_any(skb); return false; }
static bool lb_transmit(struct team *team, struct sk_buff *skb) { struct sk_filter *fp; struct team_port *port; unsigned int hash; int port_index; fp = rcu_dereference(lb_priv(team)->fp); if (unlikely(!fp)) goto drop; hash = SK_RUN_FILTER(fp, skb); port_index = hash % team->en_port_count; port = team_get_port_by_index_rcu(team, port_index); if (unlikely(!port)) goto drop; skb->dev = port->dev; if (dev_queue_xmit(skb)) return false; return true; drop: dev_kfree_skb_any(skb); return false; }