]> git.proxmox.com Git - mirror_frr.git/blob - pbrd/pbr_map.h
Merge pull request #6730 from wesleycoakley/pbrd-dscp-ecn
[mirror_frr.git] / pbrd / pbr_map.h
1 /*
2 * PBR-map Header
3 * Copyright (C) 2018 Cumulus Networks, Inc.
4 * Donald Sharp
5 *
6 * FRR is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2, or (at your option) any
9 * later version.
10 *
11 * FRR is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20 #ifndef __PBR_MAP_H__
21 #define __PBR_MAP_H__
22
23 #include <bitfield.h>
24
25 #include "pbr_vrf.h"
26
27 struct pbr_map {
28 /*
29 * RB Tree of the pbr_maps
30 */
31 RB_ENTRY(pbr_map) pbr_map_entry;
32
33 /*
34 * The name of the PBR_MAP
35 */
36 #define PBR_MAP_NAMELEN 100
37 char name[PBR_MAP_NAMELEN];
38
39 struct list *seqnumbers;
40
41 /*
42 * The list of incoming interfaces that
43 * we will apply this policy map onto
44 */
45 struct list *incoming;
46
47 bitfield_t ifi_bitfield;
48 /*
49 * If valid is true we think the pbr_map is valid,
50 * If false, look in individual pbrms to see
51 * what we think is the invalid reason
52 */
53 bool valid;
54 };
55
56 RB_HEAD(pbr_map_entry_head, pbr_map);
57 RB_PROTOTYPE(pbr_map_entry_head, pbr_map, pbr_map_entry, pbr_map_compare)
58
59 struct pbr_map_interface {
60 uint32_t install_bit;
61
62 struct interface *ifp;
63
64 struct pbr_map *pbrm;
65
66 bool delete;
67 };
68
69 struct pbr_map_sequence {
70 struct pbr_map *parent;
71
72 /*
73 * The Unique identifier of this specific pbrms
74 */
75 uint32_t unique;
76
77 /*
78 * The sequence of where we are for display
79 */
80 uint32_t seqno;
81
82 /*
83 * The rule number to install into
84 */
85 uint32_t ruleno;
86
87 /*
88 * Our policy Catchers
89 */
90 struct prefix *src;
91 struct prefix *dst;
92 uint8_t dsfield;
93 uint32_t mark;
94
95 /*
96 * Family of the src/dst. Needed when deleting since we clear them
97 */
98 unsigned char family;
99
100 /*
101 * Use interface's vrf.
102 */
103 bool vrf_unchanged;
104
105 /*
106 * The vrf to lookup in was directly configured.
107 */
108 bool vrf_lookup;
109
110 /*
111 * VRF to lookup.
112 */
113 char vrf_name[VRF_NAMSIZ + 1];
114
115 /*
116 * The nexthop group we auto create
117 * for when the user specifies a individual
118 * nexthop
119 */
120 struct nexthop_group *nhg;
121 char *internal_nhg_name;
122
123 /*
124 * The name of the nexthop group
125 * configured in the pbr-map
126 */
127 char *nhgrp_name;
128
129 /*
130 * Do we think are nexthops are installed
131 */
132 bool nhs_installed;
133
134 /*
135 * Are we installed
136 */
137 uint64_t installed;
138
139 /*
140 * A reason of 0 means we think the pbr_map_sequence is good to go
141 * We can accumuluate multiple failure states
142 */
143 #define PBR_MAP_VALID_SEQUENCE_NUMBER 0
144 #define PBR_MAP_INVALID_NEXTHOP_GROUP (1 << 0)
145 #define PBR_MAP_INVALID_NEXTHOP (1 << 1)
146 #define PBR_MAP_INVALID_NO_NEXTHOPS (1 << 2)
147 #define PBR_MAP_INVALID_BOTH_NHANDGRP (1 << 3)
148 #define PBR_MAP_INVALID_EMPTY (1 << 4)
149 #define PBR_MAP_INVALID_VRF (1 << 5)
150 uint64_t reason;
151
152 QOBJ_FIELDS
153 };
154
155 DECLARE_QOBJ_TYPE(pbr_map_sequence)
156
157 extern struct pbr_map_entry_head pbr_maps;
158
159 extern struct pbr_map_sequence *pbrms_get(const char *name, uint32_t seqno);
160 extern struct pbr_map_sequence *
161 pbrms_lookup_unique(uint32_t unique, ifindex_t ifindex,
162 struct pbr_map_interface **ppmi);
163
164 extern struct pbr_map *pbrm_find(const char *name);
165 extern void pbr_map_delete(struct pbr_map_sequence *pbrms);
166 extern void pbr_map_delete_nexthops(struct pbr_map_sequence *pbrms);
167 extern void pbr_map_delete_vrf(struct pbr_map_sequence *pbrms);
168 extern void pbr_map_add_interface(struct pbr_map *pbrm, struct interface *ifp);
169 extern void pbr_map_interface_delete(struct pbr_map *pbrm,
170 struct interface *ifp);
171
172 extern uint8_t pbr_map_decode_dscp_enum(const char *name);
173
174 /* Update maps installed on interface */
175 extern void pbr_map_policy_interface_update(const struct interface *ifp,
176 bool state_up);
177
178 extern void pbr_map_final_interface_deletion(struct pbr_map *pbrm,
179 struct pbr_map_interface *pmi);
180
181 extern void pbr_map_vrf_update(const struct pbr_vrf *pbr_vrf);
182
183 extern void pbr_map_write_interfaces(struct vty *vty, struct interface *ifp);
184 extern void pbr_map_init(void);
185
186 extern bool pbr_map_check_valid(const char *name);
187
188 /**
189 * Re-check the pbr map for validity.
190 *
191 * Install if valid, remove if not.
192 *
193 * If changed is set, the config on the on the map has changed somewhere
194 * and the rules need to be replaced if valid.
195 */
196 extern void pbr_map_check(struct pbr_map_sequence *pbrms, bool changed);
197 extern void pbr_map_check_nh_group_change(const char *nh_group);
198 extern void pbr_map_reason_string(unsigned int reason, char *buf, int size);
199
200 extern void pbr_map_schedule_policy_from_nhg(const char *nh_group,
201 bool installed);
202
203 extern void pbr_map_install(struct pbr_map *pbrm);
204
205 extern void pbr_map_policy_install(const char *name);
206 extern void pbr_map_policy_delete(struct pbr_map *pbrm,
207 struct pbr_map_interface *pmi);
208 #endif