team_mode_random.c (1506B)
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * drivers/net/team/team_mode_random.c - Random mode for team 4 * Copyright (c) 2013 Jiri Pirko <jiri@resnulli.us> 5 */ 6 7#include <linux/kernel.h> 8#include <linux/types.h> 9#include <linux/module.h> 10#include <linux/init.h> 11#include <linux/skbuff.h> 12#include <linux/if_team.h> 13 14static bool rnd_transmit(struct team *team, struct sk_buff *skb) 15{ 16 struct team_port *port; 17 int port_index; 18 19 port_index = prandom_u32_max(team->en_port_count); 20 port = team_get_port_by_index_rcu(team, port_index); 21 if (unlikely(!port)) 22 goto drop; 23 port = team_get_first_port_txable_rcu(team, port); 24 if (unlikely(!port)) 25 goto drop; 26 if (team_dev_queue_xmit(team, port, skb)) 27 return false; 28 return true; 29 30drop: 31 dev_kfree_skb_any(skb); 32 return false; 33} 34 35static const struct team_mode_ops rnd_mode_ops = { 36 .transmit = rnd_transmit, 37 .port_enter = team_modeop_port_enter, 38 .port_change_dev_addr = team_modeop_port_change_dev_addr, 39}; 40 41static const struct team_mode rnd_mode = { 42 .kind = "random", 43 .owner = THIS_MODULE, 44 .ops = &rnd_mode_ops, 45 .lag_tx_type = NETDEV_LAG_TX_TYPE_RANDOM, 46}; 47 48static int __init rnd_init_module(void) 49{ 50 return team_mode_register(&rnd_mode); 51} 52 53static void __exit rnd_cleanup_module(void) 54{ 55 team_mode_unregister(&rnd_mode); 56} 57 58module_init(rnd_init_module); 59module_exit(rnd_cleanup_module); 60 61MODULE_LICENSE("GPL v2"); 62MODULE_AUTHOR("Jiri Pirko <jiri@resnulli.us>"); 63MODULE_DESCRIPTION("Random mode for team"); 64MODULE_ALIAS_TEAM_MODE("random");