162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * drivers/net/team/team_mode_random.c - Random mode for team 462306a36Sopenharmony_ci * Copyright (c) 2013 Jiri Pirko <jiri@resnulli.us> 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/kernel.h> 862306a36Sopenharmony_ci#include <linux/types.h> 962306a36Sopenharmony_ci#include <linux/module.h> 1062306a36Sopenharmony_ci#include <linux/init.h> 1162306a36Sopenharmony_ci#include <linux/skbuff.h> 1262306a36Sopenharmony_ci#include <linux/if_team.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_cistatic bool rnd_transmit(struct team *team, struct sk_buff *skb) 1562306a36Sopenharmony_ci{ 1662306a36Sopenharmony_ci struct team_port *port; 1762306a36Sopenharmony_ci int port_index; 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci port_index = get_random_u32_below(team->en_port_count); 2062306a36Sopenharmony_ci port = team_get_port_by_index_rcu(team, port_index); 2162306a36Sopenharmony_ci if (unlikely(!port)) 2262306a36Sopenharmony_ci goto drop; 2362306a36Sopenharmony_ci port = team_get_first_port_txable_rcu(team, port); 2462306a36Sopenharmony_ci if (unlikely(!port)) 2562306a36Sopenharmony_ci goto drop; 2662306a36Sopenharmony_ci if (team_dev_queue_xmit(team, port, skb)) 2762306a36Sopenharmony_ci return false; 2862306a36Sopenharmony_ci return true; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cidrop: 3162306a36Sopenharmony_ci dev_kfree_skb_any(skb); 3262306a36Sopenharmony_ci return false; 3362306a36Sopenharmony_ci} 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_cistatic const struct team_mode_ops rnd_mode_ops = { 3662306a36Sopenharmony_ci .transmit = rnd_transmit, 3762306a36Sopenharmony_ci .port_enter = team_modeop_port_enter, 3862306a36Sopenharmony_ci .port_change_dev_addr = team_modeop_port_change_dev_addr, 3962306a36Sopenharmony_ci}; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_cistatic const struct team_mode rnd_mode = { 4262306a36Sopenharmony_ci .kind = "random", 4362306a36Sopenharmony_ci .owner = THIS_MODULE, 4462306a36Sopenharmony_ci .ops = &rnd_mode_ops, 4562306a36Sopenharmony_ci .lag_tx_type = NETDEV_LAG_TX_TYPE_RANDOM, 4662306a36Sopenharmony_ci}; 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_cistatic int __init rnd_init_module(void) 4962306a36Sopenharmony_ci{ 5062306a36Sopenharmony_ci return team_mode_register(&rnd_mode); 5162306a36Sopenharmony_ci} 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_cistatic void __exit rnd_cleanup_module(void) 5462306a36Sopenharmony_ci{ 5562306a36Sopenharmony_ci team_mode_unregister(&rnd_mode); 5662306a36Sopenharmony_ci} 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cimodule_init(rnd_init_module); 5962306a36Sopenharmony_cimodule_exit(rnd_cleanup_module); 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ciMODULE_LICENSE("GPL v2"); 6262306a36Sopenharmony_ciMODULE_AUTHOR("Jiri Pirko <jiri@resnulli.us>"); 6362306a36Sopenharmony_ciMODULE_DESCRIPTION("Random mode for team"); 6462306a36Sopenharmony_ciMODULE_ALIAS_TEAM_MODE("random"); 65