summaryrefslogtreecommitdiffstats
path: root/pbrd/pbr_map.h
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-09 13:16:35 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-09 13:16:35 +0000
commite2bbf175a2184bd76f6c54ccf8456babeb1a46fc (patch)
treef0b76550d6e6f500ada964a3a4ee933a45e5a6f1 /pbrd/pbr_map.h
parentInitial commit. (diff)
downloadfrr-e2bbf175a2184bd76f6c54ccf8456babeb1a46fc.tar.xz
frr-e2bbf175a2184bd76f6c54ccf8456babeb1a46fc.zip
Adding upstream version 9.1.upstream/9.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'pbrd/pbr_map.h')
-rw-r--r--pbrd/pbr_map.h262
1 files changed, 262 insertions, 0 deletions
diff --git a/pbrd/pbr_map.h b/pbrd/pbr_map.h
new file mode 100644
index 0000000..9fb674b
--- /dev/null
+++ b/pbrd/pbr_map.h
@@ -0,0 +1,262 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * PBR-map Header
+ * Copyright (C) 2018 Cumulus Networks, Inc.
+ * Donald Sharp
+ * Portions:
+ * Copyright (c) 2023 LabN Consulting, L.L.C.
+ * Copyright (c) 2021 The MITRE Corporation
+ */
+#ifndef __PBR_MAP_H__
+#define __PBR_MAP_H__
+
+#include <bitfield.h>
+
+#include "pbr_vrf.h"
+
+struct pbr_map {
+ /*
+ * RB Tree of the pbr_maps
+ */
+ RB_ENTRY(pbr_map) pbr_map_entry;
+
+ /*
+ * The name of the PBR_MAP
+ */
+#define PBR_MAP_NAMELEN 100
+ char name[PBR_MAP_NAMELEN];
+
+ struct list *seqnumbers;
+
+ /*
+ * The list of incoming interfaces that
+ * we will apply this policy map onto
+ */
+ struct list *incoming;
+
+ bitfield_t ifi_bitfield;
+ /*
+ * If valid is true we think the pbr_map is valid,
+ * If false, look in individual pbrms to see
+ * what we think is the invalid reason
+ */
+ bool valid;
+};
+
+RB_HEAD(pbr_map_entry_head, pbr_map);
+RB_PROTOTYPE(pbr_map_entry_head, pbr_map, pbr_map_entry, pbr_map_compare)
+
+struct pbr_map_interface {
+ uint32_t install_bit;
+
+ struct interface *ifp;
+
+ struct pbr_map *pbrm;
+
+ bool delete;
+};
+
+enum pbr_forwarding_type {
+ PBR_FT_UNSPEC = 0,
+ PBR_FT_VRF_UNCHANGED,
+ PBR_FT_SETVRF,
+ PBR_FT_NEXTHOP_GROUP,
+ PBR_FT_NEXTHOP_SINGLE,
+};
+
+struct pbr_map_sequence {
+ struct pbr_map *parent;
+
+ /*
+ * The Unique identifier of this specific pbrms
+ */
+ uint32_t unique;
+
+ /*
+ * The sequence of where we are for display
+ */
+ uint32_t seqno;
+
+ /*
+ * The rule number to install into
+ */
+ uint32_t ruleno;
+
+
+ /*****************************************************************
+ * Filter fields
+ * gpz 230716: I hope to replace all of the filter fields with
+ * 'struct pbr_filter' from lib/pbr.h.
+ *****************************************************************/
+
+ /*
+ * same bit definitions as in lib/pbr.h
+ */
+ uint32_t filter_bm;
+
+ /* Family of the src/dst. Needed when deleting since we clear them */
+ unsigned char family;
+
+ /* src and dst IP addresses */
+ struct prefix *src;
+ struct prefix *dst;
+
+ /* src and dst UDP/TCP ports */
+ uint16_t src_prt;
+ uint16_t dst_prt;
+
+ uint8_t ip_proto;
+
+ uint8_t match_pcp;
+ uint16_t match_vlan_id; /* bits defined in lib/pbr.h */
+
+ uint16_t match_vlan_flags;
+
+ uint8_t dsfield;
+ uint32_t mark;
+
+ /*****************************************************************
+ * Action fields
+ *****************************************************************/
+
+ /*
+ * same bit definitions as in lib/pbr.h
+ */
+ uint32_t action_bm;
+
+ union sockunion action_src;
+ union sockunion action_dst;
+
+ uint16_t action_src_port;
+ uint16_t action_dst_port;
+
+ uint8_t action_dscp;
+ uint8_t action_ecn;
+
+ uint8_t action_pcp;
+ uint8_t action_vlan_id;
+
+#define PBR_MAP_UNDEFINED_QUEUE_ID 0
+ uint32_t action_queue_id;
+
+ enum pbr_forwarding_type forwarding_type;
+
+ /*
+ * Use interface's vrf.
+ */
+ bool vrf_unchanged;
+
+ /*
+ * The vrf to lookup in was directly configured.
+ */
+ bool vrf_lookup;
+
+ /*
+ * VRF to lookup.
+ */
+ char vrf_name[VRF_NAMSIZ + 1];
+
+ /*
+ * The nexthop group we auto create
+ * for when the user specifies a individual
+ * nexthop
+ */
+ struct nexthop_group *nhg;
+ char *internal_nhg_name;
+
+ /*
+ * The name of the nexthop group
+ * configured in the pbr-map
+ */
+ char *nhgrp_name;
+
+ /*
+ * Do we think are nexthops are installed
+ */
+ bool nhs_installed;
+
+ /*
+ * Are we installed
+ */
+ uint64_t installed;
+
+ /*
+ * A reason of 0 means we think the pbr_map_sequence is good to go
+ * We can accumuluate multiple failure states
+ */
+#define PBR_MAP_VALID_SEQUENCE_NUMBER 0
+#define PBR_MAP_INVALID_NEXTHOP_GROUP (1 << 0)
+#define PBR_MAP_INVALID_NEXTHOP (1 << 1)
+#define PBR_MAP_INVALID_NO_NEXTHOPS (1 << 2)
+#define PBR_MAP_INVALID_BOTH_NHANDGRP (1 << 3)
+#define PBR_MAP_INVALID_EMPTY (1 << 4)
+#define PBR_MAP_INVALID_VRF (1 << 5)
+#define PBR_MAP_INVALID_SET_STRIP_VLAN (1 << 6)
+ uint64_t reason;
+
+ QOBJ_FIELDS;
+};
+
+DECLARE_QOBJ_TYPE(pbr_map_sequence);
+
+extern struct pbr_map_entry_head pbr_maps;
+
+extern struct pbr_map_sequence *pbrms_get(const char *name, uint32_t seqno);
+extern struct pbr_map_sequence *
+pbrms_lookup_unique(uint32_t unique, char *ifname,
+ struct pbr_map_interface **ppmi);
+
+extern struct pbr_map *pbrm_find(const char *name);
+extern void pbr_map_delete(struct pbr_map_sequence *pbrms);
+extern void pbr_map_delete_nexthops(struct pbr_map_sequence *pbrms);
+extern void pbr_map_delete_vrf(struct pbr_map_sequence *pbrms);
+extern void pbr_map_add_interface(struct pbr_map *pbrm, struct interface *ifp);
+extern void pbr_map_interface_delete(struct pbr_map *pbrm,
+ struct interface *ifp);
+
+extern uint8_t pbr_map_decode_dscp_enum(const char *name);
+
+/* Update maps installed on interface */
+extern void pbr_map_policy_interface_update(const struct interface *ifp,
+ bool state_up);
+
+extern void pbr_map_final_interface_deletion(struct pbr_map *pbrm,
+ struct pbr_map_interface *pmi);
+
+extern void pbr_map_vrf_update(const struct pbr_vrf *pbr_vrf);
+
+extern void pbr_map_write_interfaces(struct vty *vty, struct interface *ifp);
+extern void pbr_map_init(void);
+
+extern bool pbr_map_check_valid(const char *name);
+
+/**
+ * Re-check the pbr map for validity.
+ *
+ * Install if valid, remove if not.
+ *
+ * If changed is set, the config on the on the map has changed somewhere
+ * and the rules need to be replaced if valid.
+ */
+extern void pbr_map_check(struct pbr_map_sequence *pbrms, bool changed);
+extern void pbr_map_check_nh_group_change(const char *nh_group);
+extern void pbr_map_reason_string(unsigned int reason, char *buf, int size);
+
+extern void pbr_map_schedule_policy_from_nhg(const char *nh_group,
+ bool installed);
+
+extern void pbr_map_install(struct pbr_map *pbrm);
+
+extern void pbr_map_policy_install(const char *name);
+extern void pbr_map_policy_delete(struct pbr_map *pbrm,
+ struct pbr_map_interface *pmi);
+
+extern void pbr_map_sequence_delete(struct pbr_map_sequence *pbrms);
+
+extern void pbr_map_check_vrf_nh_group_change(const char *nh_group,
+ struct pbr_vrf *pbr_vrf,
+ uint32_t old_vrf_id);
+extern void pbr_map_check_interface_nh_group_change(const char *nh_group,
+ struct interface *ifp,
+ ifindex_t oldifindex);
+#endif