-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathbfd_scion.patch
248 lines (236 loc) · 7.68 KB
/
bfd_scion.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
commit 107ae97c089d970da16fdb7ccbeb3c08e7a93618
Author: Martin Sustrik <[email protected]>
Date: Wed Aug 12 13:09:18 2020 +0200
BFD_TRANSPORT_PLUGIN added
diff --git a/src/vnet/adj/adj_bfd.c b/src/vnet/adj/adj_bfd.c
index 2d787d41a..e02e60396 100644
--- a/src/vnet/adj/adj_bfd.c
+++ b/src/vnet/adj/adj_bfd.c
@@ -120,6 +120,11 @@ adj_bfd_notify (bfd_listen_event_e event,
adj_delegate_t *aed;
adj_index_t ai;
+ if (session->transport == BFD_TRANSPORT_PLUGIN)
+ {
+ return;
+ }
+
if (BFD_HOP_TYPE_SINGLE != session->hop_type)
{
/*
diff --git a/src/vnet/bfd/bfd_api.c b/src/vnet/bfd/bfd_api.c
index cc28b0b6b..2f893985f 100644
--- a/src/vnet/bfd/bfd_api.c
+++ b/src/vnet/bfd/bfd_api.c
@@ -191,6 +191,8 @@ bfd_event (bfd_main_t * bm, bfd_session_t * bs)
/* fallthrough */
case BFD_TRANSPORT_UDP6:
send_bfd_udp_session_details (vl_reg, 0, bs);
+ case BFD_TRANSPORT_PLUGIN:
+ bs->plugin->send_session_details(bs, vl_reg, 0);
}
}
}));
diff --git a/src/vnet/bfd/bfd_api.h b/src/vnet/bfd/bfd_api.h
index 2a6c69b78..be487dd2c 100644
--- a/src/vnet/bfd/bfd_api.h
+++ b/src/vnet/bfd/bfd_api.h
@@ -25,7 +25,8 @@
#define foreach_bfd_transport(F) \
F (UDP4, "ip4-rewrite") \
- F (UDP6, "ip6-rewrite")
+ F (UDP6, "ip6-rewrite") \
+ F (PLUGIN, "")
typedef enum
{
diff --git a/src/vnet/bfd/bfd_cli.c b/src/vnet/bfd/bfd_cli.c
index a6953bd26..e2340b41a 100644
--- a/src/vnet/bfd/bfd_cli.c
+++ b/src/vnet/bfd/bfd_cli.c
@@ -43,6 +43,9 @@ format_bfd_session_cli (u8 * s, va_list * args)
format_ip6_address, &bs->udp.key.local_addr.ip6,
format_ip6_address, &bs->udp.key.peer_addr.ip6);
break;
+ case BFD_TRANSPORT_PLUGIN:
+ s = bs->plugin->format (bs, s);
+ break;
}
s = format (s, "%10s %-32s %20s %20s\n", "", "Session state",
bfd_state_string (bs->local_state),
diff --git a/src/vnet/bfd/bfd_main.c b/src/vnet/bfd/bfd_main.c
index 4b8975732..6abe2ce79 100644
--- a/src/vnet/bfd/bfd_main.c
+++ b/src/vnet/bfd/bfd_main.c
@@ -730,6 +730,10 @@ bfd_add_transport_layer (vlib_main_t * vm, u32 bi, bfd_session_t * bs)
BFD_DBG ("Transport bfd via udp6, bs_idx=%u", bs->bs_idx);
bfd_add_udp6_transport (vm, bi, bs, 0 /* is_echo */ );
break;
+ case BFD_TRANSPORT_PLUGIN:
+ BFD_DBG ("Transport bfd via plugin, bs_idx=%u", bs->bs_idx);
+ bs->plugin->add_transport (bs, vm, bi, 0 /* is_echo */ );
+ break;
}
}
@@ -746,6 +750,10 @@ bfd_transport_control_frame (vlib_main_t * vm, u32 bi, bfd_session_t * bs)
BFD_DBG ("Transport bfd via udp6, bs_idx=%u", bs->bs_idx);
return bfd_transport_udp6 (vm, bi, bs);
break;
+ case BFD_TRANSPORT_PLUGIN:
+ BFD_DBG ("Transport bfd via plugin, bs_idx=%u", bs->bs_idx);
+ return bs->plugin->transport (bs, vm, bi);
+ break;
}
return 0;
}
@@ -763,6 +771,10 @@ bfd_echo_add_transport_layer (vlib_main_t * vm, u32 bi, bfd_session_t * bs)
BFD_DBG ("Transport bfd echo via udp6, bs_idx=%u", bs->bs_idx);
return bfd_add_udp6_transport (vm, bi, bs, 1 /* is_echo */ );
break;
+ case BFD_TRANSPORT_PLUGIN:
+ BFD_DBG ("Transport bfd echo via plugin, bs_idx=%u", bs->bs_idx);
+ bs->plugin->add_transport (bs, vm, bi, 1 /* is_echo */ );
+ break;
}
return 0;
}
@@ -780,6 +792,10 @@ bfd_transport_echo (vlib_main_t * vm, u32 bi, bfd_session_t * bs)
BFD_DBG ("Transport bfd echo via udp6, bs_idx=%u", bs->bs_idx);
return bfd_transport_udp6 (vm, bi, bs);
break;
+ case BFD_TRANSPORT_PLUGIN:
+ BFD_DBG ("Transport bfd echo via plugin, bs_idx=%u", bs->bs_idx);
+ bs->plugin->transport (bs, vm, bi);
+ break;
}
return 0;
}
@@ -867,6 +883,8 @@ bfd_is_echo_possible (bfd_session_t * bs)
return bfd_udp_is_echo_available (BFD_TRANSPORT_UDP4);
case BFD_TRANSPORT_UDP6:
return bfd_udp_is_echo_available (BFD_TRANSPORT_UDP6);
+ case BFD_TRANSPORT_PLUGIN:
+ return bs->plugin->is_echo_available (bs);
}
}
return 0;
@@ -1190,6 +1208,7 @@ bfd_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f)
}
else
{
+ bfd_unlock (bm);
(void) vlib_process_wait_for_event (vm);
}
event_type = vlib_process_get_events (vm, &event_data);
@@ -2285,6 +2304,31 @@ bfd_auth_del_key (u32 conf_key_id)
#endif
}
+vnet_api_error_t
+bfd_add_plugin_session (vlib_main_t * vm, bfd_main_t * bm,
+ u32 sw_if_index, u32 desired_min_tx_usec,
+ u32 required_min_rx_usec, u8 detect_mult,
+ bfd_plugin_session_t *bps,
+ bfd_session_t ** bs_out)
+{
+ bfd_session_t *bs = bfd_get_session (bm, BFD_TRANSPORT_PLUGIN);
+ if (!bs)
+ {
+ return VNET_API_ERROR_BFD_EAGAIN;
+ }
+ bs->plugin = bps;
+ *bs_out = bs;
+ vnet_api_error_t err = bfd_session_set_params (bm, bs, desired_min_tx_usec,
+ required_min_rx_usec, detect_mult);
+ if (err)
+ {
+ bfd_put_session (bm, bs);
+ return err;
+ }
+ bfd_session_start (bm, bs);
+ return 0;
+}
+
bfd_main_t bfd_main;
/*
diff --git a/src/vnet/bfd/bfd_main.h b/src/vnet/bfd/bfd_main.h
index a7540004d..0dcf32262 100644
--- a/src/vnet/bfd/bfd_main.h
+++ b/src/vnet/bfd/bfd_main.h
@@ -23,6 +23,7 @@
#include <vnet/bfd/bfd_protocol.h>
#include <vnet/bfd/bfd_udp.h>
#include <vlib/log.h>
+#include <vlibapi/api_common.h>
#include <vppinfra/os.h>
#include <vppinfra/tw_timer_1t_3w_1024sl_ov.h>
@@ -82,6 +83,15 @@ typedef enum
#undef F
} bfd_hop_type_e;
+typedef struct bfd_plugin_session_s
+{
+ int (*is_echo_available) (struct bfd_session_s *bs);
+ void (*send_session_details) (struct bfd_session_s *bs, vl_api_registration_t * reg, u32 context);
+ int (*add_transport) (struct bfd_session_s *bs, vlib_main_t * vm, u32 bi, int is_echo);
+ int (*transport) (struct bfd_session_s *bs, vlib_main_t * vm, u32 bi);
+ u8 *(*format) (struct bfd_session_s *bs, u8 *s);
+} bfd_plugin_session_t;
+
typedef struct bfd_session_s
{
/** index in bfd_main.sessions pool */
@@ -239,6 +249,7 @@ typedef struct bfd_session_s
union
{
bfd_udp_session_t udp;
+ bfd_plugin_session_t *plugin;
};
} bfd_session_t;
@@ -434,6 +445,11 @@ vnet_api_error_t bfd_session_set_params (bfd_main_t * bm, bfd_session_t * bs,
u32 desired_min_tx_usec,
u32 required_min_rx_usec,
u8 detect_mult);
+vnet_api_error_t bfd_add_plugin_session (vlib_main_t * vm, bfd_main_t * bm,
+ u32 sw_if_index, u32 desired_min_tx_usec,
+ u32 required_min_rx_usec, u8 detect_mult,
+ bfd_plugin_session_t *bps,
+ bfd_session_t ** bs_out);
u32 bfd_nsec_to_usec (u64 nsec);
const char *bfd_poll_state_string (bfd_poll_state_e state);
diff --git a/src/vnet/bfd/bfd_udp.c b/src/vnet/bfd/bfd_udp.c
index 0edf8a8d4..177865f59 100644
--- a/src/vnet/bfd/bfd_udp.c
+++ b/src/vnet/bfd/bfd_udp.c
@@ -403,6 +403,8 @@ bfd_udp_calc_next_node (const struct bfd_session_s *bs, u32 * next_node)
case BFD_TRANSPORT_UDP6:
*next_node = bfd_udp_main.ip6_ndp_idx;
return 1;
+ default:
+ ASSERT (0);
}
break;
case IP_LOOKUP_NEXT_REWRITE:
@@ -414,6 +416,8 @@ bfd_udp_calc_next_node (const struct bfd_session_s *bs, u32 * next_node)
case BFD_TRANSPORT_UDP6:
*next_node = bfd_udp_main.ip6_rewrite_idx;
return 1;
+ default:
+ ASSERT (0);
}
break;
case IP_LOOKUP_NEXT_MIDCHAIN:
@@ -425,6 +429,8 @@ bfd_udp_calc_next_node (const struct bfd_session_s *bs, u32 * next_node)
case BFD_TRANSPORT_UDP6:
*next_node = bfd_udp_main.ip6_midchain_idx;
return 1;
+ default:
+ ASSERT (0);
}
break;
default:
@@ -734,6 +740,8 @@ bfd_udp_del_session_internal (vlib_main_t * vm, bfd_session_t * bs)
udp_unregister_dst_port (vm, UDP_DST_PORT_bfd_echo6, 0);
}
break;
+ default:
+ ASSERT (0);
}
bfd_put_session (bum->bfd_main, bs);
}