]>
Commit | Line | Data |
---|---|---|
f620b43a | 1 | /* |
adcf00ba | 2 | * Copyright (c) 2008, 2009, 2010, 2011, 2014 Nicira, Inc. |
f620b43a BP |
3 | * |
4 | * Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | * you may not use this file except in compliance with the License. | |
6 | * You may obtain a copy of the License at: | |
7 | * | |
8 | * http://www.apache.org/licenses/LICENSE-2.0 | |
9 | * | |
10 | * Unless required by applicable law or agreed to in writing, software | |
11 | * distributed under the License is distributed on an "AS IS" BASIS, | |
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | * See the License for the specific language governing permissions and | |
14 | * limitations under the License. | |
15 | */ | |
16 | ||
17 | #ifndef BOND_H | |
18 | #define BOND_H 1 | |
19 | ||
20 | #include <stdbool.h> | |
21 | #include <stdint.h> | |
adcf00ba | 22 | #include "ofproto-provider.h" |
f620b43a | 23 | #include "packets.h" |
f620b43a BP |
24 | |
25 | struct flow; | |
f620b43a BP |
26 | struct netdev; |
27 | struct ofpbuf; | |
adcf00ba | 28 | struct ofproto_dpif; |
bdebeece | 29 | enum lacp_status; |
f620b43a BP |
30 | |
31 | /* How flows are balanced among bond slaves. */ | |
32 | enum bond_mode { | |
33 | BM_TCP, /* Transport Layer Load Balance. */ | |
34 | BM_SLB, /* Source Load Balance. */ | |
35 | BM_AB /* Active Backup. */ | |
36 | }; | |
37 | ||
38 | bool bond_mode_from_string(enum bond_mode *, const char *); | |
39 | const char *bond_mode_to_string(enum bond_mode); | |
40 | ||
f620b43a BP |
41 | /* Configuration for a bond as a whole. */ |
42 | struct bond_settings { | |
43 | char *name; /* Bond's name, for log messages. */ | |
672d18b2 | 44 | uint32_t basis; /* Flow hashing basis. */ |
f620b43a BP |
45 | |
46 | /* Balancing configuration. */ | |
47 | enum bond_mode balance; | |
bc1b010c EJ |
48 | int rebalance_interval; /* Milliseconds between rebalances. |
49 | Zero to disable rebalancing. */ | |
f620b43a BP |
50 | |
51 | /* Link status detection. */ | |
f620b43a BP |
52 | int up_delay; /* ms before enabling an up slave. */ |
53 | int down_delay; /* ms before disabling a down slave. */ | |
54 | ||
9dd165e0 | 55 | bool lacp_fallback_ab_cfg; /* Fallback to active-backup on LACP failure. */ |
3e5aeeb5 | 56 | |
74ff3298 | 57 | struct eth_addr active_slave_mac; |
3bd0fd39 | 58 | /* The MAC address of the interface |
3e5aeeb5 AZ |
59 | that was active during the last |
60 | ovs run. */ | |
f620b43a BP |
61 | }; |
62 | ||
63 | /* Program startup. */ | |
64 | void bond_init(void); | |
65 | ||
66 | /* Basics. */ | |
adcf00ba AZ |
67 | struct bond *bond_create(const struct bond_settings *, |
68 | struct ofproto_dpif *ofproto); | |
03366a2d EJ |
69 | void bond_unref(struct bond *); |
70 | struct bond *bond_ref(const struct bond *); | |
f620b43a | 71 | |
59d7b2b6 | 72 | bool bond_reconfigure(struct bond *, const struct bond_settings *); |
adcf00ba | 73 | void bond_slave_register(struct bond *, void *slave_, ofp_port_t ofport, struct netdev *); |
f8ddccd2 | 74 | void bond_slave_set_netdev(struct bond *, void *slave_, struct netdev *); |
f620b43a BP |
75 | void bond_slave_unregister(struct bond *, const void *slave); |
76 | ||
4a1b8f30 | 77 | bool bond_run(struct bond *, enum lacp_status); |
f620b43a BP |
78 | void bond_wait(struct bond *); |
79 | ||
296f6519 | 80 | void bond_slave_set_may_enable(struct bond *, void *slave_, bool may_enable); |
4d6fb5eb | 81 | |
f620b43a BP |
82 | /* Special MAC learning support for SLB bonding. */ |
83 | bool bond_should_send_learning_packets(struct bond *); | |
cf62fa4c | 84 | struct dp_packet *bond_compose_learning_packet(struct bond *, |
74ff3298 JR |
85 | const struct eth_addr eth_src, |
86 | uint16_t vlan, void **port_aux); | |
87 | bool bond_get_changed_active_slave(const char *name, struct eth_addr *mac, | |
3bd0fd39 | 88 | bool force); |
f620b43a BP |
89 | |
90 | /* Packet processing. */ | |
91 | enum bond_verdict { | |
92 | BV_ACCEPT, /* Accept this packet. */ | |
93 | BV_DROP, /* Drop this packet. */ | |
94 | BV_DROP_IF_MOVED /* Drop if we've learned a different port. */ | |
95 | }; | |
96 | enum bond_verdict bond_check_admissibility(struct bond *, const void *slave_, | |
74ff3298 | 97 | const struct eth_addr dst); |
bcd2633a | 98 | void *bond_choose_output_slave(struct bond *, const struct flow *, |
4a1b8f30 | 99 | struct flow_wildcards *, uint16_t vlan); |
f620b43a BP |
100 | |
101 | /* Rebalancing. */ | |
102 | void bond_account(struct bond *, const struct flow *, uint16_t vlan, | |
103 | uint64_t n_bytes); | |
60cda7d6 | 104 | void bond_rebalance(struct bond *); |
f620b43a | 105 | |
adcf00ba AZ |
106 | /* Recirculation |
107 | * | |
108 | * Only balance_tcp mode uses recirculation. | |
109 | * | |
110 | * When recirculation is used, each bond port is assigned with a unique | |
111 | * recirc_id. The output action to the bond port will be replaced by | |
60cda7d6 | 112 | * a Hash action, followed by a RECIRC action. |
adcf00ba | 113 | * |
60cda7d6 | 114 | * ... actions= ... HASH(hash(L4)), RECIRC(recirc_id) .... |
adcf00ba AZ |
115 | * |
116 | * On handling first output packet, 256 post recirculation flows are installed: | |
117 | * | |
118 | * recirc_id=<bond_recirc_id>, dp_hash=<[0..255]>/0xff, actions: output<slave> | |
119 | * | |
120 | * Bond module pulls stats from those post recirculation rules. If rebalancing | |
121 | * is needed, those rules are updated with new output actions. | |
122 | */ | |
123 | void bond_update_post_recirc_rules(struct bond *, const bool force); | |
124 | bool bond_may_recirc(const struct bond *, uint32_t *recirc_id, | |
125 | uint32_t *hash_bias); | |
f620b43a | 126 | #endif /* bond.h */ |