2 * Copyright (c) 2017 Cisco and/or its affiliates.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
16 #ifndef ___LACP_PTX_MACHINE_H__
17 #define ___LACP_PTX_MACHINE_H__
20 #include <lacp/machine.h>
22 #define foreach_lacp_ptx_event \
23 _(0, NO_PERIODIC, "no periodic") \
24 _(1, LONG_TIMEOUT, "long tiemout") \
25 _(2, TIMER_EXPIRED, "timer expired") \
26 _(3, SHORT_TIMEOUT, "short timeout")
30 #define _(a, b, c) LACP_PTX_EVENT_##b = (a),
31 foreach_lacp_ptx_event
35 #define foreach_lacp_ptx_sm_state \
36 _(0, NO_PERIODIC, "no periodic") \
37 _(1, FAST_PERIODIC, "fast periodic") \
38 _(2, SLOW_PERIODIC, "slow periodic") \
39 _(3, PERIODIC_TX, "periodic transmission")
43 #define _(a, b, c) LACP_PTX_STATE_##b = (a),
44 foreach_lacp_ptx_sm_state
46 } lacp_ptx_sm_state_t;
48 extern lacp_machine_t lacp_ptx_machine;
50 int lacp_ptx_action_no_periodic (void *p1, void *p2);
51 int lacp_ptx_action_slow_periodic (void *p1, void *p2);
52 int lacp_ptx_action_fast_periodic (void *p1, void *p2);
53 int lacp_ptx_action_timer_expired (void *p1, void *p2);
54 void lacp_ptx_debug_func (member_if_t * mif, int event, int state,
55 lacp_fsm_state_t * transition);
57 #define LACP_ACTION_NO_PERIODIC \
58 LACP_ACTION_ROUTINE(lacp_ptx_action_no_periodic)
59 #define LACP_ACTION_SLOW_PERIODIC \
60 LACP_ACTION_ROUTINE(lacp_ptx_action_slow_periodic)
61 #define LACP_ACTION_FAST_PERIODIC \
62 LACP_ACTION_ROUTINE(lacp_ptx_action_fast_periodic)
63 #define LACP_ACTION_TIMER_EXPIRED \
64 LACP_ACTION_ROUTINE(lacp_ptx_action_timer_expired)
67 lacp_start_periodic_timer (vlib_main_t * vm, member_if_t * mif, u8 expiration)
69 mif->periodic_timer = vlib_time_now (vm) + expiration;
73 lacp_schedule_periodic_timer (vlib_main_t * vm, member_if_t * mif)
75 // do fast rate if partner is in short timeout or
76 // we are not yet synchronized
77 if ((mif->partner.state & LACP_STATE_LACP_TIMEOUT) ||
78 (((mif->actor.state & (LACP_STATE_SYNCHRONIZATION |
79 LACP_STATE_COLLECTING |
80 LACP_STATE_DISTRIBUTING)) !=
81 (LACP_STATE_SYNCHRONIZATION | LACP_STATE_COLLECTING |
82 LACP_STATE_DISTRIBUTING))
83 && (mif->partner.state & LACP_STATE_AGGREGATION)))
84 lacp_start_periodic_timer (vm, mif, LACP_FAST_PERIODIC_TIMER);
86 lacp_start_periodic_timer (vm, mif, LACP_SLOW_PERIODIC_TIMER);
90 lacp_ptx_post_short_timeout_event (vlib_main_t * vm, member_if_t * mif)
92 if (mif->lacp_enabled && mif->port_enabled &&
93 ((mif->partner.state & LACP_STATE_LACP_ACTIVITY) ||
94 (mif->actor.state & LACP_STATE_LACP_ACTIVITY)))
95 lacp_machine_dispatch (&lacp_ptx_machine, vm, mif,
96 LACP_PTX_EVENT_SHORT_TIMEOUT, &mif->ptx_state);
99 #endif /* __LACP_PTX_MACHINE_H__ */
102 * fd.io coding-style-patch-verification: ON
105 * eval: (c-set-style "gnu")