aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/vrrp/vrrp_format.c
diff options
context:
space:
mode:
authorMatthew Smith <mgsmith@netgate.com>2020-02-11 11:25:32 -0600
committerDave Barach <openvpp@barachs.net>2020-02-13 19:46:30 +0000
commit39e9428b90bc74d1bb15fc17759c8ef6ad712418 (patch)
treede9317a906a7df43bf2140a654d3b7675cab8d86 /src/plugins/vrrp/vrrp_format.c
parentf75defa7676759fa81ae75e7edd492572c6b8fd6 (diff)
vrrp: add plugin providing vrrp support
Type: feature Add a new plugin to support HA using VRRPv3 (RFC 5798). Change-Id: Iaa2c37e6172f8f41e9165f178f44d481f6e247b9 Signed-off-by: Matthew Smith <mgsmith@netgate.com>
Diffstat (limited to 'src/plugins/vrrp/vrrp_format.c')
-rw-r--r--src/plugins/vrrp/vrrp_format.c146
1 files changed, 146 insertions, 0 deletions
diff --git a/src/plugins/vrrp/vrrp_format.c b/src/plugins/vrrp/vrrp_format.c
new file mode 100644
index 00000000000..df9bf930b78
--- /dev/null
+++ b/src/plugins/vrrp/vrrp_format.c
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2019-2020 Rubicon Communications, LLC (Netgate)
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ */
+
+#include <vnet/vnet.h>
+#include <vnet/api_errno.h>
+#include <vnet/ip/ip.h>
+#include <vnet/interface.h>
+
+#include <plugins/vrrp/vrrp.h>
+#include <plugins/vrrp/vrrp_packet.h>
+
+u8 *
+format_vrrp_vr_flags (u8 * s, va_list * args)
+{
+ vrrp_vr_flags_t flags = va_arg (*args, vrrp_vr_flags_t);
+
+ s = format (s, "preempt %s accept %s unicast %s",
+ (flags & VRRP_VR_PREEMPT) ? "yes" : "no",
+ (flags & VRRP_VR_ACCEPT) ? "yes" : "no",
+ (flags & VRRP_VR_UNICAST) ? "yes" : "no");
+
+ return s;
+}
+
+u8 *
+format_vrrp_vr_addrs (u8 * s, va_list * args)
+{
+ int is_ipv6 = va_arg (*args, int);
+ ip46_address_t *addrs = va_arg (*args, ip46_address_t *);
+ ip46_address_t *addr;
+
+ vec_foreach (addr, addrs)
+ {
+ s = format (s, "%U ",
+ (is_ipv6) ? format_ip6_address : format_ip4_address,
+ (is_ipv6) ? (u8 *) & addr->ip6 : (u8 *) & addr->ip4);
+ }
+
+ return s;
+}
+
+u8 *
+format_vrrp_vr_state (u8 * s, va_list * args)
+{
+ vrrp_vr_state_t state = va_arg (*args, vrrp_vr_state_t);
+
+ switch (state)
+ {
+#define _(v,f,n) case VRRP_VR_STATE_##f: s = format (s, n); break;
+ foreach_vrrp_vr_state
+#undef _
+ default:
+ s = format (s, "Unknown");
+ break;
+ }
+
+ return s;
+}
+
+u8 *
+format_vrrp_vr_key (u8 * s, va_list * args)
+{
+ vrrp_main_t *vmp = &vrrp_main;
+ vrrp_vr_t *vr = va_arg (*args, vrrp_vr_t *);
+ vrrp_vr_config_t *vrc = &vr->config;
+
+ s = format (s, "[%d] sw_if_index %u VR ID %u IPv%d",
+ vr - vmp->vrs, vrc->sw_if_index,
+ vrc->vr_id, (vrc->flags & VRRP_VR_IPV6) ? 6 : 4);
+
+ return s;
+}
+
+u8 *
+format_vrrp_vr_track_ifs (u8 * s, va_list * args)
+{
+ vrrp_vr_tracking_if_t *track_ifs = va_arg (*args, vrrp_vr_tracking_if_t *);
+ vrrp_vr_tracking_if_t *track_if;
+
+ vec_foreach (track_if, track_ifs)
+ s = format (s, "sw_if_index %u priority %u ",
+ track_if->sw_if_index, track_if->priority);
+
+ return s;
+}
+
+u8 *
+format_vrrp_vr (u8 * s, va_list * args)
+{
+ vrrp_vr_t *vr = va_arg (*args, vrrp_vr_t *);
+
+ s = format (s, "%U\n", format_vrrp_vr_key, vr);
+
+ s = format (s, " state %U flags: %U\n",
+ format_vrrp_vr_state, vr->runtime.state,
+ format_vrrp_vr_flags, vr->config.flags);
+ s = format (s, " priority: configured %u adjusted %u\n",
+ vr->config.priority, vrrp_vr_priority (vr));
+ s = format (s, " timers: adv interval %u "
+ "master adv %u skew %u master down %u\n",
+ vr->config.adv_interval, vr->runtime.master_adv_int,
+ vr->runtime.skew, vr->runtime.master_down_int);
+
+ s = format (s, " virtual MAC %U\n", format_ethernet_address,
+ &vr->runtime.mac);
+
+ s = format (s, " addresses %U\n", format_vrrp_vr_addrs,
+ (vr->config.flags & VRRP_VR_IPV6) != 0, vr->config.vr_addrs);
+
+ s = format (s, " peer addresses %U\n", format_vrrp_vr_addrs,
+ (vr->config.flags & VRRP_VR_IPV6) != 0, vr->config.peer_addrs);
+
+ s = format (s, " tracked interfaces %U\n", format_vrrp_vr_track_ifs,
+ vr->tracking.interfaces);
+
+ return s;
+}
+
+u8 *
+format_vrrp_packet_hdr (u8 * s, va_list * args)
+{
+ vrrp_header_t *pkt = va_arg (*args, vrrp_header_t *);
+ u32 version = pkt->vrrp_version_and_type >> 4;
+
+ s = format (s, "ver %u, type %u, VRID %u, prio %u, "
+ "n_addrs %u, interval %u%ss, csum 0x%x",
+ version, pkt->vrrp_version_and_type & 0xf,
+ pkt->vr_id, pkt->priority, pkt->n_addrs,
+ clib_net_to_host_u16 (pkt->rsvd_and_max_adv_int),
+ (version == 3) ? "c" : "", pkt->checksum);
+
+ return s;
+}
+
+
+/*
+ * fd.io coding-style-patch-verification: ON
+ *
+ * Local Variables:
+ * eval: (c-set-style "gnu")
+ * End:
+ */