Line data Source code
1 : /*
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:
6 : *
7 : * http://www.apache.org/licenses/LICENSE-2.0
8 : *
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.
14 : */
15 :
16 : #ifndef ___LACP_PTX_MACHINE_H__
17 : #define ___LACP_PTX_MACHINE_H__
18 :
19 : #include <stdint.h>
20 : #include <lacp/machine.h>
21 :
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")
27 :
28 : typedef enum
29 : {
30 : #define _(a, b, c) LACP_PTX_EVENT_##b = (a),
31 : foreach_lacp_ptx_event
32 : #undef _
33 : } lacp_ptx_event_t;
34 :
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")
40 :
41 : typedef enum
42 : {
43 : #define _(a, b, c) LACP_PTX_STATE_##b = (a),
44 : foreach_lacp_ptx_sm_state
45 : #undef _
46 : } lacp_ptx_sm_state_t;
47 :
48 : extern lacp_machine_t lacp_ptx_machine;
49 :
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);
56 :
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)
65 :
66 : static inline void
67 109 : lacp_start_periodic_timer (vlib_main_t * vm, member_if_t * mif, u8 expiration)
68 : {
69 109 : mif->periodic_timer = vlib_time_now (vm) + expiration;
70 109 : }
71 :
72 : static inline void
73 37 : lacp_schedule_periodic_timer (vlib_main_t * vm, member_if_t * mif)
74 : {
75 : // do fast rate if partner is in short timeout or
76 : // we are not yet synchronized
77 37 : if ((mif->partner.state & LACP_STATE_LACP_TIMEOUT) ||
78 9 : (((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 9 : && (mif->partner.state & LACP_STATE_AGGREGATION)))
84 28 : lacp_start_periodic_timer (vm, mif, LACP_FAST_PERIODIC_TIMER);
85 : else
86 9 : lacp_start_periodic_timer (vm, mif, LACP_SLOW_PERIODIC_TIMER);
87 37 : }
88 :
89 : static inline void
90 29 : lacp_ptx_post_short_timeout_event (vlib_main_t * vm, member_if_t * mif)
91 : {
92 29 : if (mif->lacp_enabled && mif->port_enabled &&
93 25 : ((mif->partner.state & LACP_STATE_LACP_ACTIVITY) ||
94 25 : (mif->actor.state & LACP_STATE_LACP_ACTIVITY)))
95 25 : lacp_machine_dispatch (&lacp_ptx_machine, vm, mif,
96 : LACP_PTX_EVENT_SHORT_TIMEOUT, &mif->ptx_state);
97 29 : }
98 :
99 : #endif /* __LACP_PTX_MACHINE_H__ */
100 :
101 : /*
102 : * fd.io coding-style-patch-verification: ON
103 : *
104 : * Local Variables:
105 : * eval: (c-set-style "gnu")
106 : * End:
107 : */
|