AT_BANNER([lacp]) # Strips out Reciulation ID information since it may change over time. m4_define([STRIP_RECIRC_ID], [[sed ' s/Recirc-ID.*$// ' ]]) # Strips out active slave mac address since it may change over time. m4_define([STRIP_ACTIVE_SLAVE_MAC], [[sed ' s/active slave mac.*$// ' ]]) AT_SETUP([lacp - config]) OVS_VSWITCHD_START([\ add-port br0 p1 --\ set Port p1 lacp=active --\ set Interface p1 type=dummy ]) ovs-appctl time/stop ovs-appctl time/warp 300 100 AT_CHECK([ovs-appctl lacp/show], [0], [dnl ---- p1 ---- status: active negotiated sys_id: aa:55:aa:55:00:00 sys_priority: 65535 aggregation key: 1 lacp_time: slow slave: p1: expired attached port_id: 1 port_priority: 65535 may_enable: false actor sys_id: aa:55:aa:55:00:00 actor sys_priority: 65535 actor port_id: 1 actor port_priority: 65535 actor key: 1 actor state: activity synchronized collecting distributing expired partner sys_id: 00:00:00:00:00:00 partner sys_priority: 0 partner port_id: 0 partner port_priority: 0 partner key: 0 partner state: timeout ]) AT_CHECK([ovs-appctl bond/show]) OVS_VSWITCHD_STOP AT_CLEANUP AT_SETUP([lacp - multi port config]) OVS_VSWITCHD_START([dnl add-bond br0 bond p1 p2 --\ set Port bond lacp=active bond-mode=active-backup \ other_config:lacp-time="fast" \ other_config:lacp-system-id=11:22:33:44:55:66 \ other_config:lacp-system-priority=54321 --\ set Interface p1 type=dummy \ other_config:lacp-port-id=11 \ other_config:lacp-port-priority=111 \ other_config:lacp-aggregation-key=3333 --\ set Interface p2 type=dummy \ other_config:lacp-port-id=22 \ other_config:lacp-port-priority=222 \ other_config:lacp-aggregation-key=3333 ]) ovs-appctl time/stop ovs-appctl time/warp 300 100 AT_CHECK([ovs-appctl lacp/show], [0], [stdout]) AT_CHECK([sed -e 's/aggregation key:.*/aggregation key: /' < stdout], [0], [dnl ---- bond ---- status: active negotiated sys_id: 11:22:33:44:55:66 sys_priority: 54321 aggregation key: lacp_time: fast slave: p1: expired attached port_id: 11 port_priority: 111 may_enable: false actor sys_id: 11:22:33:44:55:66 actor sys_priority: 54321 actor port_id: 11 actor port_priority: 111 actor key: 3333 actor state: activity timeout aggregation synchronized collecting distributing expired partner sys_id: 00:00:00:00:00:00 partner sys_priority: 0 partner port_id: 0 partner port_priority: 0 partner key: 0 partner state: timeout slave: p2: expired attached port_id: 22 port_priority: 222 may_enable: false actor sys_id: 11:22:33:44:55:66 actor sys_priority: 54321 actor port_id: 22 actor port_priority: 222 actor key: 3333 actor state: activity timeout aggregation synchronized collecting distributing expired partner sys_id: 00:00:00:00:00:00 partner sys_priority: 0 partner port_id: 0 partner port_priority: 0 partner key: 0 partner state: timeout ]) AT_CHECK([ovs-appctl bond/show], [0], [dnl ---- bond ---- bond_mode: active-backup bond may use recirculation: no, Recirc-ID : -1 bond-hash-basis: 0 updelay: 0 ms downdelay: 0 ms lacp_status: negotiated active slave mac: 00:00:00:00:00:00(none) slave p1: disabled may_enable: false slave p2: disabled may_enable: false ]) OVS_VSWITCHD_STOP AT_CLEANUP AT_SETUP([lacp - negotiation]) # Create bond0 on br0 with interfaces p0 and p1 # and bond1 on br1 with interfaces p2 and p3 # with p0 patched to p2 and p1 patched to p3. OVS_VSWITCHD_START( [add-bond br0 bond0 p0 p1 bond_mode=balance-tcp lacp=active \ other-config:lacp-time=fast \ other-config:bond-rebalance-interval=0 -- \ set interface p0 type=patch options:peer=p2 ofport_request=1 \ other-config:lacp-aggregation-key=2 -- \ set interface p1 type=patch options:peer=p3 ofport_request=2 \ other-config:lacp-aggregation-key=2 -- \ add-br br1 -- \ set bridge br1 other-config:hwaddr=aa:66:aa:66:00:00 -- \ set bridge br1 datapath-type=dummy other-config:datapath-id=1234 \ fail-mode=secure -- \ add-bond br1 bond1 p2 p3 bond_mode=balance-tcp lacp=active \ other-config:lacp-time=fast \ other-config:bond-rebalance-interval=0 -- \ set interface p2 type=patch options:peer=p0 ofport_request=3 \ other-config:lacp-aggregation-key=4 -- \ set interface p3 type=patch options:peer=p1 ofport_request=4 \ other-config:lacp-aggregation-key=4 --]) AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK ]) ovs-appctl time/stop # Wait for up to 5 (simulated) seconds, until LACP negotiation finishes. i=0 while :; do ovs-appctl lacp/show bond0 > bond0 AT_CAPTURE_FILE([bond0]) ovs-appctl lacp/show bond1 > bond1 AT_CAPTURE_FILE([bond1]) if grep negotiated bond0 && grep negotiated bond1; then if grep expired bond0 || grep expired bond1; then : else break fi fi i=`expr $i + 1` if test $i = 50; then AT_FAIL_IF([:]) fi ovs-appctl time/warp 100 done # Now check the correctly negotiated configuration. AT_CHECK( [ovs-appctl lacp/show bond0 ovs-appctl lacp/show bond1 ovs-appctl bond/show bond0 | STRIP_RECIRC_ID | STRIP_ACTIVE_SLAVE_MAC ovs-appctl bond/show bond1 | STRIP_RECIRC_ID | STRIP_ACTIVE_SLAVE_MAC ], [0], [stdout]) AT_CHECK([sed '/active slave/d' stdout], [0], [dnl ---- bond0 ---- status: active negotiated sys_id: aa:55:aa:55:00:00 sys_priority: 65534 aggregation key: 2 lacp_time: fast slave: p0: current attached port_id: 1 port_priority: 65535 may_enable: true actor sys_id: aa:55:aa:55:00:00 actor sys_priority: 65534 actor port_id: 1 actor port_priority: 65535 actor key: 2 actor state: activity timeout aggregation synchronized collecting distributing partner sys_id: aa:66:aa:66:00:00 partner sys_priority: 65534 partner port_id: 3 partner port_priority: 65535 partner key: 4 partner state: activity timeout aggregation synchronized collecting distributing slave: p1: current attached port_id: 2 port_priority: 65535 may_enable: true actor sys_id: aa:55:aa:55:00:00 actor sys_priority: 65534 actor port_id: 2 actor port_priority: 65535 actor key: 2 actor state: activity timeout aggregation synchronized collecting distributing partner sys_id: aa:66:aa:66:00:00 partner sys_priority: 65534 partner port_id: 4 partner port_priority: 65535 partner key: 4 partner state: activity timeout aggregation synchronized collecting distributing ---- bond1 ---- status: active negotiated sys_id: aa:66:aa:66:00:00 sys_priority: 65534 aggregation key: 4 lacp_time: fast slave: p2: current attached port_id: 3 port_priority: 65535 may_enable: true actor sys_id: aa:66:aa:66:00:00 actor sys_priority: 65534 actor port_id: 3 actor port_priority: 65535 actor key: 4 actor state: activity timeout aggregation synchronized collecting distributing partner sys_id: aa:55:aa:55:00:00 partner sys_priority: 65534 partner port_id: 1 partner port_priority: 65535 partner key: 2 partner state: activity timeout aggregation synchronized collecting distributing slave: p3: current attached port_id: 4 port_priority: 65535 may_enable: true actor sys_id: aa:66:aa:66:00:00 actor sys_priority: 65534 actor port_id: 4 actor port_priority: 65535 actor key: 4 actor state: activity timeout aggregation synchronized collecting distributing partner sys_id: aa:55:aa:55:00:00 partner sys_priority: 65534 partner port_id: 2 partner port_priority: 65535 partner key: 2 partner state: activity timeout aggregation synchronized collecting distributing ---- bond0 ---- bond_mode: balance-tcp bond may use recirculation: yes, bond-hash-basis: 0 updelay: 0 ms downdelay: 0 ms lacp_status: negotiated slave p0: enabled may_enable: true slave p1: enabled may_enable: true ---- bond1 ---- bond_mode: balance-tcp bond may use recirculation: yes, bond-hash-basis: 0 updelay: 0 ms downdelay: 0 ms lacp_status: negotiated slave p2: enabled may_enable: true slave p3: enabled may_enable: true ]) AT_CHECK([grep 'active slave$' stdout], [0], [dnl active slave active slave ]) # Redirect the patch link between p0 and p2 so that no packets get # back and forth across them anymore. Then wait 4 simulated # seconds. The LACP state should become "expired" for p0 and p2. AT_CHECK([ovs-vsctl \ -- add-port br0 null0 -- set int null0 type=patch options:peer=p2 -- set int p2 options:peer=null0 \ -- add-port br1 null1 -- set int null1 type=patch options:peer=p0 -- set int p0 options:peer=null1]) ovs-appctl time/warp 4100 100 AT_CHECK( [ovs-appctl lacp/show bond0 ovs-appctl lacp/show bond1 ovs-appctl bond/show bond0 | STRIP_RECIRC_ID | STRIP_ACTIVE_SLAVE_MAC ovs-appctl bond/show bond1 | STRIP_RECIRC_ID | STRIP_ACTIVE_SLAVE_MAC ], [0], [dnl ---- bond0 ---- status: active negotiated sys_id: aa:55:aa:55:00:00 sys_priority: 65534 aggregation key: 2 lacp_time: fast slave: p0: expired attached port_id: 1 port_priority: 65535 may_enable: false actor sys_id: aa:55:aa:55:00:00 actor sys_priority: 65534 actor port_id: 1 actor port_priority: 65535 actor key: 2 actor state: activity timeout aggregation synchronized collecting distributing expired partner sys_id: aa:66:aa:66:00:00 partner sys_priority: 65534 partner port_id: 3 partner port_priority: 65535 partner key: 4 partner state: activity timeout aggregation collecting distributing slave: p1: current attached port_id: 2 port_priority: 65535 may_enable: true actor sys_id: aa:55:aa:55:00:00 actor sys_priority: 65534 actor port_id: 2 actor port_priority: 65535 actor key: 2 actor state: activity timeout aggregation synchronized collecting distributing partner sys_id: aa:66:aa:66:00:00 partner sys_priority: 65534 partner port_id: 4 partner port_priority: 65535 partner key: 4 partner state: activity timeout aggregation synchronized collecting distributing ---- bond1 ---- status: active negotiated sys_id: aa:66:aa:66:00:00 sys_priority: 65534 aggregation key: 4 lacp_time: fast slave: p2: expired attached port_id: 3 port_priority: 65535 may_enable: false actor sys_id: aa:66:aa:66:00:00 actor sys_priority: 65534 actor port_id: 3 actor port_priority: 65535 actor key: 4 actor state: activity timeout aggregation synchronized collecting distributing expired partner sys_id: aa:55:aa:55:00:00 partner sys_priority: 65534 partner port_id: 1 partner port_priority: 65535 partner key: 2 partner state: activity timeout aggregation collecting distributing slave: p3: current attached port_id: 4 port_priority: 65535 may_enable: true actor sys_id: aa:66:aa:66:00:00 actor sys_priority: 65534 actor port_id: 4 actor port_priority: 65535 actor key: 4 actor state: activity timeout aggregation synchronized collecting distributing partner sys_id: aa:55:aa:55:00:00 partner sys_priority: 65534 partner port_id: 2 partner port_priority: 65535 partner key: 2 partner state: activity timeout aggregation synchronized collecting distributing ---- bond0 ---- bond_mode: balance-tcp bond may use recirculation: yes, bond-hash-basis: 0 updelay: 0 ms downdelay: 0 ms lacp_status: negotiated slave p0: disabled may_enable: false slave p1: enabled active slave may_enable: true ---- bond1 ---- bond_mode: balance-tcp bond may use recirculation: yes, bond-hash-basis: 0 updelay: 0 ms downdelay: 0 ms lacp_status: negotiated slave p2: disabled may_enable: false slave p3: enabled active slave may_enable: true ]) # Wait 4 more simulated seconds. The LACP state should become # "defaulted" for p0 and p2. ovs-appctl time/warp 4100 100 AT_CHECK( [ovs-appctl lacp/show bond0 ovs-appctl lacp/show bond1 ovs-appctl bond/show bond0 | STRIP_RECIRC_ID | STRIP_ACTIVE_SLAVE_MAC ovs-appctl bond/show bond1 | STRIP_RECIRC_ID | STRIP_ACTIVE_SLAVE_MAC ], [0], [dnl ---- bond0 ---- status: active negotiated sys_id: aa:55:aa:55:00:00 sys_priority: 65534 aggregation key: 2 lacp_time: fast slave: p0: defaulted detached port_id: 1 port_priority: 65535 may_enable: false actor sys_id: aa:55:aa:55:00:00 actor sys_priority: 65534 actor port_id: 1 actor port_priority: 65535 actor key: 2 actor state: activity timeout aggregation defaulted partner sys_id: 00:00:00:00:00:00 partner sys_priority: 0 partner port_id: 0 partner port_priority: 0 partner key: 0 partner state: slave: p1: current attached port_id: 2 port_priority: 65535 may_enable: true actor sys_id: aa:55:aa:55:00:00 actor sys_priority: 65534 actor port_id: 2 actor port_priority: 65535 actor key: 2 actor state: activity timeout aggregation synchronized collecting distributing partner sys_id: aa:66:aa:66:00:00 partner sys_priority: 65534 partner port_id: 4 partner port_priority: 65535 partner key: 4 partner state: activity timeout aggregation synchronized collecting distributing ---- bond1 ---- status: active negotiated sys_id: aa:66:aa:66:00:00 sys_priority: 65534 aggregation key: 4 lacp_time: fast slave: p2: defaulted detached port_id: 3 port_priority: 65535 may_enable: false actor sys_id: aa:66:aa:66:00:00 actor sys_priority: 65534 actor port_id: 3 actor port_priority: 65535 actor key: 4 actor state: activity timeout aggregation defaulted partner sys_id: 00:00:00:00:00:00 partner sys_priority: 0 partner port_id: 0 partner port_priority: 0 partner key: 0 partner state: slave: p3: current attached port_id: 4 port_priority: 65535 may_enable: true actor sys_id: aa:66:aa:66:00:00 actor sys_priority: 65534 actor port_id: 4 actor port_priority: 65535 actor key: 4 actor state: activity timeout aggregation synchronized collecting distributing partner sys_id: aa:55:aa:55:00:00 partner sys_priority: 65534 partner port_id: 2 partner port_priority: 65535 partner key: 2 partner state: activity timeout aggregation synchronized collecting distributing ---- bond0 ---- bond_mode: balance-tcp bond may use recirculation: yes, bond-hash-basis: 0 updelay: 0 ms downdelay: 0 ms lacp_status: negotiated slave p0: disabled may_enable: false slave p1: enabled active slave may_enable: true ---- bond1 ---- bond_mode: balance-tcp bond may use recirculation: yes, bond-hash-basis: 0 updelay: 0 ms downdelay: 0 ms lacp_status: negotiated slave p2: disabled may_enable: false slave p3: enabled active slave may_enable: true ]) OVS_VSWITCHD_STOP AT_CLEANUP