1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | /* |
3 | * Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved. |
4 | */ |
5 | |
6 | #ifndef _NET_BOND_ALB_H |
7 | #define _NET_BOND_ALB_H |
8 | |
9 | #include <linux/if_ether.h> |
10 | |
11 | struct bonding; |
12 | struct slave; |
13 | |
14 | #define BOND_ALB_INFO(bond) ((bond)->alb_info) |
15 | #define SLAVE_TLB_INFO(slave) ((slave)->tlb_info) |
16 | |
17 | #define ALB_TIMER_TICKS_PER_SEC 10 /* should be a divisor of HZ */ |
18 | #define BOND_TLB_REBALANCE_INTERVAL 10 /* In seconds, periodic re-balancing. |
19 | * Used for division - never set |
20 | * to zero !!! |
21 | */ |
22 | #define BOND_ALB_DEFAULT_LP_INTERVAL 1 |
23 | #define BOND_ALB_LP_INTERVAL(bond) (bond->params.lp_interval) /* In seconds, periodic send of |
24 | * learning packets to the switch |
25 | */ |
26 | |
27 | #define BOND_TLB_REBALANCE_TICKS (BOND_TLB_REBALANCE_INTERVAL \ |
28 | * ALB_TIMER_TICKS_PER_SEC) |
29 | |
30 | #define BOND_ALB_LP_TICKS(bond) (BOND_ALB_LP_INTERVAL(bond) \ |
31 | * ALB_TIMER_TICKS_PER_SEC) |
32 | |
33 | #define TLB_HASH_TABLE_SIZE 256 /* The size of the clients hash table. |
34 | * Note that this value MUST NOT be smaller |
35 | * because the key hash table is BYTE wide ! |
36 | */ |
37 | |
38 | |
39 | #define TLB_NULL_INDEX 0xffffffff |
40 | |
41 | /* rlb defs */ |
42 | #define RLB_HASH_TABLE_SIZE 256 |
43 | #define RLB_NULL_INDEX 0xffffffff |
44 | #define RLB_UPDATE_DELAY (2*ALB_TIMER_TICKS_PER_SEC) /* 2 seconds */ |
45 | #define RLB_ARP_BURST_SIZE 2 |
46 | #define RLB_UPDATE_RETRY 3 /* 3-ticks - must be smaller than the rlb |
47 | * rebalance interval (5 min). |
48 | */ |
49 | /* RLB_PROMISC_TIMEOUT = 10 sec equals the time that the current slave is |
50 | * promiscuous after failover |
51 | */ |
52 | #define RLB_PROMISC_TIMEOUT (10*ALB_TIMER_TICKS_PER_SEC) |
53 | |
54 | |
55 | struct tlb_client_info { |
56 | struct slave *tx_slave; /* A pointer to slave used for transmiting |
57 | * packets to a Client that the Hash function |
58 | * gave this entry index. |
59 | */ |
60 | u32 tx_bytes; /* Each Client accumulates the BytesTx that |
61 | * were transmitted to it, and after each |
62 | * CallBack the LoadHistory is divided |
63 | * by the balance interval |
64 | */ |
65 | u32 load_history; /* This field contains the amount of Bytes |
66 | * that were transmitted to this client by |
67 | * the server on the previous balance |
68 | * interval in Bps. |
69 | */ |
70 | u32 next; /* The next Hash table entry index, assigned |
71 | * to use the same adapter for transmit. |
72 | */ |
73 | u32 prev; /* The previous Hash table entry index, |
74 | * assigned to use the same |
75 | */ |
76 | }; |
77 | |
78 | /* ------------------------------------------------------------------------- |
79 | * struct rlb_client_info contains all info related to a specific rx client |
80 | * connection. This is the Clients Hash Table entry struct. |
81 | * Note that this is not a proper hash table; if a new client's IP address |
82 | * hash collides with an existing client entry, the old entry is replaced. |
83 | * |
84 | * There is a linked list (linked by the used_next and used_prev members) |
85 | * linking all the used entries of the hash table. This allows updating |
86 | * all the clients without walking over all the unused elements of the table. |
87 | * |
88 | * There are also linked lists of entries with identical hash(ip_src). These |
89 | * allow cleaning up the table from ip_src<->mac_src associations that have |
90 | * become outdated and would cause sending out invalid ARP updates to the |
91 | * network. These are linked by the (src_next and src_prev members). |
92 | * ------------------------------------------------------------------------- |
93 | */ |
94 | struct rlb_client_info { |
95 | __be32 ip_src; /* the server IP address */ |
96 | __be32 ip_dst; /* the client IP address */ |
97 | u8 mac_src[ETH_ALEN]; /* the server MAC address */ |
98 | u8 mac_dst[ETH_ALEN]; /* the client MAC address */ |
99 | |
100 | /* list of used hash table entries, starting at rx_hashtbl_used_head */ |
101 | u32 used_next; |
102 | u32 used_prev; |
103 | |
104 | /* ip_src based hashing */ |
105 | u32 src_next; /* next entry with same hash(ip_src) */ |
106 | u32 src_prev; /* prev entry with same hash(ip_src) */ |
107 | u32 src_first; /* first entry with hash(ip_src) == this entry's index */ |
108 | |
109 | u8 assigned; /* checking whether this entry is assigned */ |
110 | u8 ntt; /* flag - need to transmit client info */ |
111 | struct slave *slave; /* the slave assigned to this client */ |
112 | unsigned short vlan_id; /* VLAN tag associated with IP address */ |
113 | }; |
114 | |
115 | struct tlb_slave_info { |
116 | u32 head; /* Index to the head of the bi-directional clients |
117 | * hash table entries list. The entries in the list |
118 | * are the entries that were assigned to use this |
119 | * slave for transmit. |
120 | */ |
121 | u32 load; /* Each slave sums the loadHistory of all clients |
122 | * assigned to it |
123 | */ |
124 | }; |
125 | |
126 | struct alb_bond_info { |
127 | struct tlb_client_info *tx_hashtbl; /* Dynamically allocated */ |
128 | u32 unbalanced_load; |
129 | atomic_t tx_rebalance_counter; |
130 | int lp_counter; |
131 | /* -------- rlb parameters -------- */ |
132 | int rlb_enabled; |
133 | struct rlb_client_info *rx_hashtbl; /* Receive hash table */ |
134 | u32 rx_hashtbl_used_head; |
135 | u8 rx_ntt; /* flag - need to transmit |
136 | * to all rx clients |
137 | */ |
138 | struct slave *rx_slave;/* last slave to xmit from */ |
139 | u8 primary_is_promisc; /* boolean */ |
140 | u32 rlb_promisc_timeout_counter;/* counts primary |
141 | * promiscuity time |
142 | */ |
143 | u32 rlb_update_delay_counter; |
144 | u32 rlb_update_retry_counter;/* counter of retries |
145 | * of client update |
146 | */ |
147 | u8 rlb_rebalance; /* flag - indicates that the |
148 | * rx traffic should be |
149 | * rebalanced |
150 | */ |
151 | }; |
152 | |
153 | int bond_alb_initialize(struct bonding *bond, int rlb_enabled); |
154 | void bond_alb_deinitialize(struct bonding *bond); |
155 | int bond_alb_init_slave(struct bonding *bond, struct slave *slave); |
156 | void bond_alb_deinit_slave(struct bonding *bond, struct slave *slave); |
157 | void bond_alb_handle_link_change(struct bonding *bond, struct slave *slave, char link); |
158 | void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave); |
159 | netdev_tx_t bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev); |
160 | netdev_tx_t bond_tlb_xmit(struct sk_buff *skb, struct net_device *bond_dev); |
161 | struct slave *bond_xmit_alb_slave_get(struct bonding *bond, |
162 | struct sk_buff *skb); |
163 | struct slave *bond_xmit_tlb_slave_get(struct bonding *bond, |
164 | struct sk_buff *skb); |
165 | void bond_alb_monitor(struct work_struct *); |
166 | int bond_alb_set_mac_address(struct net_device *bond_dev, void *addr); |
167 | void bond_alb_clear_vlan(struct bonding *bond, unsigned short vlan_id); |
168 | #endif /* _NET_BOND_ALB_H */ |
169 | |
170 | |