2 * Copyright 2015-2016, LabN Consulting, L.L.C.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with this program; see the file COPYING; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 #include "lib/zebra.h"
21 #include "lib/memory.h"
22 #include "lib/prefix.h"
23 #include "lib/table.h"
26 #include "bgpd/bgpd.h"
27 #include "bgpd/bgp_attr.h"
29 #include "bgpd/bgp_encap_types.h"
30 #include "bgpd/bgp_encap_tlv.h"
32 #include "bgpd/rfapi/rfapi.h"
33 #include "bgpd/rfapi/rfapi_encap_tlv.h"
34 #include "bgpd/rfapi/rfapi_private.h"
35 #include "bgpd/rfapi/rfapi_monitor.h"
36 #include "bgpd/rfapi/rfapi_vty.h"
37 #include "bgpd/rfapi/bgp_rfapi_cfg.h"
38 #include "bgpd/rfapi/vnc_debug.h"
40 static void rfapi_add_endpoint_address_to_subtlv(
41 struct bgp
*bgp
, struct rfapi_ip_addr
*ea
,
42 struct bgp_tea_subtlv_remote_endpoint
*subtlv
)
44 subtlv
->family
= ea
->addr_family
;
45 if (subtlv
->family
== AF_INET
)
46 subtlv
->ip_address
.v4
= ea
->addr
.v4
;
48 subtlv
->ip_address
.v6
= ea
->addr
.v6
;
49 subtlv
->as4
= htonl(bgp
->as
);
53 rfapi_tunneltype_option_to_tlv(struct bgp
*bgp
, struct rfapi_ip_addr
*ea
,
54 struct rfapi_tunneltype_option
*tto
,
55 struct attr
*attr
, int always_add
)
58 #define _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(ttype) \
61 && !CHECK_FLAG(bgp->rfapi_cfg->flags, \
62 BGP_VNC_CONFIG_ADV_UN_METHOD_ENCAP))) \
64 && !CHECK_SUBTLV_FLAG(&tto->bgpinfo.ttype, \
65 BGP_TEA_SUBTLV_REMOTE_ENDPOINT)) { \
66 rfapi_add_endpoint_address_to_subtlv( \
67 bgp, ea, &tto->bgpinfo.ttype.st_endpoint); \
68 SET_SUBTLV_FLAG(&tto->bgpinfo.ttype, \
69 BGP_TEA_SUBTLV_REMOTE_ENDPOINT); \
72 struct rfapi_tunneltype_option dto
;
73 if (tto
== NULL
) { /* create default type */
75 memset(tto
, 0, sizeof(dto
));
76 tto
->type
= RFAPI_BGP_ENCAP_TYPE_DEFAULT
;
79 case BGP_ENCAP_TYPE_L2TPV3_OVER_IP
:
80 _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(l2tpv3_ip
);
81 bgp_encap_type_l2tpv3overip_to_tlv(&tto
->bgpinfo
.l2tpv3_ip
,
85 case BGP_ENCAP_TYPE_GRE
:
86 _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(gre
);
87 bgp_encap_type_gre_to_tlv(&tto
->bgpinfo
.gre
, attr
);
90 case BGP_ENCAP_TYPE_TRANSMIT_TUNNEL_ENDPOINT
:
91 _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(transmit_tunnel_endpoint
);
92 bgp_encap_type_transmit_tunnel_endpoint(
93 &tto
->bgpinfo
.transmit_tunnel_endpoint
, attr
);
96 case BGP_ENCAP_TYPE_IPSEC_IN_TUNNEL_MODE
:
97 _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(ipsec_tunnel
);
98 bgp_encap_type_ipsec_in_tunnel_mode_to_tlv(
99 &tto
->bgpinfo
.ipsec_tunnel
, attr
);
102 case BGP_ENCAP_TYPE_IP_IN_IP_TUNNEL_WITH_IPSEC_TRANSPORT_MODE
:
103 _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(ip_ipsec
);
104 bgp_encap_type_ip_in_ip_tunnel_with_ipsec_transport_mode_to_tlv(
105 &tto
->bgpinfo
.ip_ipsec
, attr
);
108 case BGP_ENCAP_TYPE_MPLS_IN_IP_TUNNEL_WITH_IPSEC_TRANSPORT_MODE
:
109 _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(mpls_ipsec
);
110 bgp_encap_type_mpls_in_ip_tunnel_with_ipsec_transport_mode_to_tlv(
111 &tto
->bgpinfo
.mpls_ipsec
, attr
);
114 case BGP_ENCAP_TYPE_IP_IN_IP
:
115 _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(ip_ip
);
116 bgp_encap_type_ip_in_ip_to_tlv(&tto
->bgpinfo
.ip_ip
, attr
);
119 case BGP_ENCAP_TYPE_VXLAN
:
120 _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(vxlan
);
121 bgp_encap_type_vxlan_to_tlv(&tto
->bgpinfo
.vxlan
, attr
);
124 case BGP_ENCAP_TYPE_NVGRE
:
125 _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(nvgre
);
126 bgp_encap_type_nvgre_to_tlv(&tto
->bgpinfo
.nvgre
, attr
);
129 case BGP_ENCAP_TYPE_MPLS
:
130 /* nothing to do for MPLS */
133 case BGP_ENCAP_TYPE_MPLS_IN_GRE
:
134 _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(mpls_gre
);
135 bgp_encap_type_mpls_in_gre_to_tlv(&tto
->bgpinfo
.mpls_gre
, attr
);
138 case BGP_ENCAP_TYPE_VXLAN_GPE
:
139 _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(vxlan_gpe
);
140 bgp_encap_type_vxlan_gpe_to_tlv(&tto
->bgpinfo
.vxlan_gpe
, attr
);
143 case BGP_ENCAP_TYPE_MPLS_IN_UDP
:
144 _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(mpls_udp
);
145 bgp_encap_type_mpls_in_udp_to_tlv(&tto
->bgpinfo
.mpls_udp
, attr
);
148 case BGP_ENCAP_TYPE_PBB
:
149 _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(pbb
);
150 bgp_encap_type_pbb_to_tlv(&tto
->bgpinfo
.pbb
, attr
);
159 struct rfapi_un_option
*rfapi_encap_tlv_to_un_option(struct attr
*attr
)
161 struct rfapi_un_option
*uo
= NULL
;
162 struct rfapi_tunneltype_option
*tto
;
164 struct bgp_attr_encap_subtlv
*stlv
;
166 /* no tunnel encap attr stored */
167 if (!attr
->encap_tunneltype
)
170 stlv
= attr
->encap_subtlvs
;
172 uo
= XCALLOC(MTYPE_RFAPI_UN_OPTION
, sizeof(struct rfapi_un_option
));
174 uo
->type
= RFAPI_UN_OPTION_TYPE_TUNNELTYPE
;
175 uo
->v
.tunnel
.type
= attr
->encap_tunneltype
;
178 switch (attr
->encap_tunneltype
) {
179 case BGP_ENCAP_TYPE_L2TPV3_OVER_IP
:
180 rc
= tlv_to_bgp_encap_type_l2tpv3overip(
181 stlv
, &tto
->bgpinfo
.l2tpv3_ip
);
184 case BGP_ENCAP_TYPE_GRE
:
185 rc
= tlv_to_bgp_encap_type_gre(stlv
, &tto
->bgpinfo
.gre
);
188 case BGP_ENCAP_TYPE_TRANSMIT_TUNNEL_ENDPOINT
:
189 rc
= tlv_to_bgp_encap_type_transmit_tunnel_endpoint(
190 stlv
, &tto
->bgpinfo
.transmit_tunnel_endpoint
);
193 case BGP_ENCAP_TYPE_IPSEC_IN_TUNNEL_MODE
:
194 rc
= tlv_to_bgp_encap_type_ipsec_in_tunnel_mode(
195 stlv
, &tto
->bgpinfo
.ipsec_tunnel
);
198 case BGP_ENCAP_TYPE_IP_IN_IP_TUNNEL_WITH_IPSEC_TRANSPORT_MODE
:
199 rc
= tlv_to_bgp_encap_type_ip_in_ip_tunnel_with_ipsec_transport_mode(
200 stlv
, &tto
->bgpinfo
.ip_ipsec
);
203 case BGP_ENCAP_TYPE_MPLS_IN_IP_TUNNEL_WITH_IPSEC_TRANSPORT_MODE
:
204 rc
= tlv_to_bgp_encap_type_mpls_in_ip_tunnel_with_ipsec_transport_mode(
205 stlv
, &tto
->bgpinfo
.mpls_ipsec
);
208 case BGP_ENCAP_TYPE_IP_IN_IP
:
209 rc
= tlv_to_bgp_encap_type_ip_in_ip(stlv
, &tto
->bgpinfo
.ip_ip
);
212 case BGP_ENCAP_TYPE_VXLAN
:
213 rc
= tlv_to_bgp_encap_type_vxlan(stlv
, &tto
->bgpinfo
.vxlan
);
216 case BGP_ENCAP_TYPE_NVGRE
:
217 rc
= tlv_to_bgp_encap_type_nvgre(stlv
, &tto
->bgpinfo
.nvgre
);
220 case BGP_ENCAP_TYPE_MPLS
:
221 rc
= tlv_to_bgp_encap_type_mpls(stlv
, &tto
->bgpinfo
.mpls
);
224 case BGP_ENCAP_TYPE_MPLS_IN_GRE
:
225 rc
= tlv_to_bgp_encap_type_mpls_in_gre(stlv
,
226 &tto
->bgpinfo
.mpls_gre
);
229 case BGP_ENCAP_TYPE_VXLAN_GPE
:
230 rc
= tlv_to_bgp_encap_type_vxlan_gpe(stlv
,
231 &tto
->bgpinfo
.vxlan_gpe
);
234 case BGP_ENCAP_TYPE_MPLS_IN_UDP
:
235 rc
= tlv_to_bgp_encap_type_mpls_in_udp(stlv
,
236 &tto
->bgpinfo
.mpls_udp
);
239 case BGP_ENCAP_TYPE_PBB
:
240 rc
= tlv_to_bgp_encap_type_pbb(stlv
, &tto
->bgpinfo
.pbb
);
244 vnc_zlog_debug_verbose("%s: unknown tunnel type %d", __func__
,
245 attr
->encap_tunneltype
);
250 XFREE(MTYPE_RFAPI_UN_OPTION
, uo
);
256 /***********************************************************************
258 ***********************************************************************/
260 static void subtlv_print_encap_l2tpv3_over_ip(
261 void *stream
, int column_offset
,
262 struct bgp_tea_subtlv_encap_l2tpv3_over_ip
*st
)
264 int (*fp
)(void *, const char *, ...);
267 const char *vty_newline
;
269 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
274 fp(out
, "%*s%s%s", column_offset
, "", "SubTLV: Encap(L2TPv3 over IP)",
276 fp(out
, "%*s SessionID: %d%s", column_offset
, "", st
->sessionid
,
278 fp(out
, "%*s Cookie: (length %d)%s", column_offset
, "",
279 st
->cookie_length
, vty_newline
);
282 static void subtlv_print_encap_gre(void *stream
, int column_offset
,
283 struct bgp_tea_subtlv_encap_gre_key
*st
)
285 int (*fp
)(void *, const char *, ...);
288 const char *vty_newline
;
290 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
295 fp(out
, "%*s%s%s", column_offset
, "", "SubTLV: Encap(GRE)",
297 fp(out
, "%*s GRE key: %d (0x%x)%s", column_offset
, "", st
->gre_key
,
298 st
->gre_key
, vty_newline
);
301 static void subtlv_print_encap_pbb(void *stream
, int column_offset
,
302 struct bgp_tea_subtlv_encap_pbb
*st
)
304 int (*fp
)(void *, const char *, ...);
307 const char *vty_newline
;
309 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
314 fp(out
, "%*s%s%s", column_offset
, "", "SubTLV: Encap(PBB)",
317 fp(out
, "%*s ISID: %d (0x%x)%s", column_offset
, "", st
->isid
,
318 st
->isid
, vty_newline
);
321 fp(out
, "%*s VID: %d (0x%x)%s", column_offset
, "", st
->vid
,
322 st
->vid
, vty_newline
);
324 fp(out
, "%*s MACADDR %02x:%02x:%02x:%02x:%02x:%02x%s", column_offset
,
325 "", st
->macaddr
[0], st
->macaddr
[1], st
->macaddr
[2], st
->macaddr
[3],
326 st
->macaddr
[4], st
->macaddr
[5], vty_newline
);
329 static void subtlv_print_proto_type(void *stream
, int column_offset
,
330 struct bgp_tea_subtlv_proto_type
*st
)
332 int (*fp
)(void *, const char *, ...);
335 const char *vty_newline
;
337 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
342 fp(out
, "%*s%s%s", column_offset
, "", "SubTLV: Encap(Proto Type)",
344 fp(out
, "%*s Proto %d (0x%x)%s", column_offset
, "", st
->proto
,
345 st
->proto
, vty_newline
);
348 static void subtlv_print_color(void *stream
, int column_offset
,
349 struct bgp_tea_subtlv_color
*st
)
351 int (*fp
)(void *, const char *, ...);
354 const char *vty_newline
;
356 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
361 fp(out
, "%*s%s%s", column_offset
, "", "SubTLV: Color", vty_newline
);
362 fp(out
, "%*s Color: %d (0x%x)", column_offset
, "", st
->color
,
363 st
->color
, vty_newline
);
366 static void subtlv_print_ipsec_ta(void *stream
, int column_offset
,
367 struct bgp_tea_subtlv_ipsec_ta
*st
)
369 int (*fp
)(void *, const char *, ...);
372 const char *vty_newline
;
374 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
379 fp(out
, "%*s%s%s", column_offset
, "", "SubTLV: IPSEC TA", vty_newline
);
380 fp(out
, "%*s Authenticator Type: %d (0x%x)", column_offset
, "",
381 st
->authenticator_type
, st
->authenticator_type
, vty_newline
);
382 fp(out
, "%*s Authenticator: (length %d)", column_offset
, "",
383 st
->authenticator_length
, vty_newline
);
386 /***********************************************************************
388 ***********************************************************************/
391 print_encap_type_l2tpv3overip(void *stream
, int column_offset
,
392 struct bgp_encap_type_l2tpv3_over_ip
*bet
)
394 const char *type
= "L2TPv3 over IP";
395 int (*fp
)(void *, const char *, ...);
398 const char *vty_newline
;
400 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
405 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
407 subtlv_print_encap_l2tpv3_over_ip(stream
, column_offset
+ 2,
409 subtlv_print_proto_type(stream
, column_offset
+ 2, &bet
->st_proto
);
410 subtlv_print_color(stream
, column_offset
+ 2, &bet
->st_color
);
413 static void print_encap_type_gre(void *stream
, int column_offset
,
414 struct bgp_encap_type_gre
*bet
)
416 const char *type
= "GRE";
417 int (*fp
)(void *, const char *, ...);
420 const char *vty_newline
;
422 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
427 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
429 subtlv_print_encap_gre(stream
, column_offset
+ 2, &bet
->st_encap
);
430 subtlv_print_proto_type(stream
, column_offset
+ 2, &bet
->st_proto
);
431 subtlv_print_color(stream
, column_offset
+ 2, &bet
->st_color
);
434 static void print_encap_type_ip_in_ip(void *stream
, int column_offset
,
435 struct bgp_encap_type_ip_in_ip
*bet
)
437 const char *type
= "IP in IP";
438 int (*fp
)(void *, const char *, ...);
441 const char *vty_newline
;
443 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
448 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
450 subtlv_print_proto_type(stream
, column_offset
+ 2, &bet
->st_proto
);
451 subtlv_print_color(stream
, column_offset
+ 2, &bet
->st_color
);
454 static void print_encap_type_transmit_tunnel_endpoint(
455 void *stream
, int column_offset
,
456 struct bgp_encap_type_transmit_tunnel_endpoint
*bet
)
458 const char *type
= "Transmit Tunnel Endpoint";
459 int (*fp
)(void *, const char *, ...);
462 const char *vty_newline
;
464 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
469 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
471 /* no subtlvs for this type */
474 static void print_encap_type_ipsec_in_tunnel_mode(
475 void *stream
, int column_offset
,
476 struct bgp_encap_type_ipsec_in_tunnel_mode
*bet
)
478 const char *type
= "IPSEC in Tunnel mode";
479 int (*fp
)(void *, const char *, ...);
482 const char *vty_newline
;
484 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
489 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
490 subtlv_print_ipsec_ta(stream
, column_offset
+ 2, &bet
->st_ipsec_ta
);
493 static void print_encap_type_ip_in_ip_tunnel_with_ipsec_transport_mode(
494 void *stream
, int column_offset
,
495 struct bgp_encap_type_ip_in_ip_tunnel_with_ipsec_transport_mode
*bet
)
497 const char *type
= "IP in IP Tunnel with IPSEC transport mode";
498 int (*fp
)(void *, const char *, ...);
501 const char *vty_newline
;
503 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
508 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
510 subtlv_print_ipsec_ta(stream
, column_offset
+ 2, &bet
->st_ipsec_ta
);
513 static void print_encap_type_mpls_in_ip_tunnel_with_ipsec_transport_mode(
514 void *stream
, int column_offset
,
515 struct bgp_encap_type_mpls_in_ip_tunnel_with_ipsec_transport_mode
*bet
)
517 const char *type
= "MPLS in IP Tunnel with IPSEC transport mode";
518 int (*fp
)(void *, const char *, ...);
521 const char *vty_newline
;
523 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
528 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
530 subtlv_print_ipsec_ta(stream
, column_offset
+ 2, &bet
->st_ipsec_ta
);
534 static void print_encap_type_pbb(void *stream
, int column_offset
,
535 struct bgp_encap_type_pbb
*bet
)
537 const char *type
= "PBB";
538 int (*fp
)(void *, const char *, ...);
541 const char *vty_newline
;
543 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
548 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
550 subtlv_print_encap_pbb(stream
, column_offset
+ 2, &bet
->st_encap
);
554 static void print_encap_type_vxlan(void *stream
, int column_offset
,
555 struct bgp_encap_type_vxlan
*bet
)
557 const char *type
= "VXLAN";
558 int (*fp
)(void *, const char *, ...);
561 const char *vty_newline
;
563 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
568 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
570 /* no subtlvs for this type */
574 static void print_encap_type_nvgre(void *stream
, int column_offset
,
575 struct bgp_encap_type_nvgre
*bet
)
577 const char *type
= "NVGRE";
578 int (*fp
)(void *, const char *, ...);
581 const char *vty_newline
;
583 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
588 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
590 /* no subtlvs for this type */
593 static void print_encap_type_mpls(void *stream
, int column_offset
,
594 struct bgp_encap_type_mpls
*bet
)
596 const char *type
= "MPLS";
597 int (*fp
)(void *, const char *, ...);
600 const char *vty_newline
;
602 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
607 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
609 /* no subtlvs for this type */
612 static void print_encap_type_mpls_in_gre(void *stream
, int column_offset
,
613 struct bgp_encap_type_mpls_in_gre
*bet
)
615 const char *type
= "MPLS in GRE";
616 int (*fp
)(void *, const char *, ...);
619 const char *vty_newline
;
621 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
626 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
628 /* no subtlvs for this type */
631 static void print_encap_type_vxlan_gpe(void *stream
, int column_offset
,
632 struct bgp_encap_type_vxlan_gpe
*bet
)
634 const char *type
= "VXLAN GPE";
635 int (*fp
)(void *, const char *, ...);
638 const char *vty_newline
;
640 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
645 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
647 /* no subtlvs for this type */
650 static void print_encap_type_mpls_in_udp(void *stream
, int column_offset
,
651 struct bgp_encap_type_mpls_in_udp
*bet
)
653 const char *type
= "MPLS in UDP";
654 int (*fp
)(void *, const char *, ...);
657 const char *vty_newline
;
659 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
664 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
666 /* no subtlvs for this type */
669 void rfapi_print_tunneltype_option(void *stream
, int column_offset
,
670 struct rfapi_tunneltype_option
*tto
)
673 case BGP_ENCAP_TYPE_L2TPV3_OVER_IP
:
674 print_encap_type_l2tpv3overip(stream
, column_offset
,
675 &tto
->bgpinfo
.l2tpv3_ip
);
678 case BGP_ENCAP_TYPE_GRE
:
679 print_encap_type_gre(stream
, column_offset
, &tto
->bgpinfo
.gre
);
682 case BGP_ENCAP_TYPE_TRANSMIT_TUNNEL_ENDPOINT
:
683 print_encap_type_transmit_tunnel_endpoint(
684 stream
, column_offset
,
685 &tto
->bgpinfo
.transmit_tunnel_endpoint
);
688 case BGP_ENCAP_TYPE_IPSEC_IN_TUNNEL_MODE
:
689 print_encap_type_ipsec_in_tunnel_mode(
690 stream
, column_offset
, &tto
->bgpinfo
.ipsec_tunnel
);
693 case BGP_ENCAP_TYPE_IP_IN_IP_TUNNEL_WITH_IPSEC_TRANSPORT_MODE
:
694 print_encap_type_ip_in_ip_tunnel_with_ipsec_transport_mode(
695 stream
, column_offset
, &tto
->bgpinfo
.ip_ipsec
);
698 case BGP_ENCAP_TYPE_MPLS_IN_IP_TUNNEL_WITH_IPSEC_TRANSPORT_MODE
:
699 print_encap_type_mpls_in_ip_tunnel_with_ipsec_transport_mode(
700 stream
, column_offset
, &tto
->bgpinfo
.mpls_ipsec
);
703 case BGP_ENCAP_TYPE_IP_IN_IP
:
704 print_encap_type_ip_in_ip(stream
, column_offset
,
705 &tto
->bgpinfo
.ip_ip
);
708 case BGP_ENCAP_TYPE_VXLAN
:
709 print_encap_type_vxlan(stream
, column_offset
,
710 &tto
->bgpinfo
.vxlan
);
713 case BGP_ENCAP_TYPE_NVGRE
:
714 print_encap_type_nvgre(stream
, column_offset
,
715 &tto
->bgpinfo
.nvgre
);
718 case BGP_ENCAP_TYPE_MPLS
:
719 print_encap_type_mpls(stream
, column_offset
,
723 case BGP_ENCAP_TYPE_MPLS_IN_GRE
:
724 print_encap_type_mpls_in_gre(stream
, column_offset
,
725 &tto
->bgpinfo
.mpls_gre
);
728 case BGP_ENCAP_TYPE_VXLAN_GPE
:
729 print_encap_type_vxlan_gpe(stream
, column_offset
,
730 &tto
->bgpinfo
.vxlan_gpe
);
733 case BGP_ENCAP_TYPE_MPLS_IN_UDP
:
734 print_encap_type_mpls_in_udp(stream
, column_offset
,
735 &tto
->bgpinfo
.mpls_udp
);
738 case BGP_ENCAP_TYPE_PBB
:
739 print_encap_type_pbb(stream
, column_offset
, &tto
->bgpinfo
.pbb
);