diff options
author | Eli Baum <ebaum@mitre.org> | 2021-10-05 15:06:49 +0200 |
---|---|---|
committer | Eli Baum <ebaum@mitre.org> | 2021-10-07 15:14:59 +0200 |
commit | d70a31a3ef2b60d978b336d5cc9ee5e1ec079dfc (patch) | |
tree | 2fdf320ce338a2078a2d9bac1453e59fcd04ef91 /pbrd/pbr_map.c | |
parent | Merge pull request #9694 from mjstapp/fix_topo_pim_cmp (diff) | |
download | frr-d70a31a3ef2b60d978b336d5cc9ee5e1ec079dfc.tar.xz frr-d70a31a3ef2b60d978b336d5cc9ee5e1ec079dfc.zip |
pbrd: add vlan actions to vty
Signed-off-by: Eli Baum <ebaum@mitre.org>
Diffstat (limited to 'pbrd/pbr_map.c')
-rw-r--r-- | pbrd/pbr_map.c | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/pbrd/pbr_map.c b/pbrd/pbr_map.c index 053b7363a..03e6bacf1 100644 --- a/pbrd/pbr_map.c +++ b/pbrd/pbr_map.c @@ -178,9 +178,9 @@ static void pbr_map_pbrms_uninstall(struct pbr_map_sequence *pbrms) } static const char *const pbr_map_reason_str[] = { - "Invalid NH-group", "Invalid NH", "No Nexthops", - "Both NH and NH-Group", "Invalid Src or Dst", "Invalid VRF", - "Deleting Sequence", + "Invalid NH-group", "Invalid NH", "No Nexthops", + "Both NH and NH-Group", "Invalid Src or Dst", "Invalid VRF", + "Both VLAN Set and Strip", "Deleting Sequence", }; void pbr_map_reason_string(unsigned int reason, char *buf, int size) @@ -539,6 +539,13 @@ struct pbr_map_sequence *pbrms_get(const char *name, uint32_t seqno) pbrms->seqno = seqno; pbrms->ruleno = pbr_nht_get_next_rule(seqno); pbrms->parent = pbrm; + + pbrms->action_vlan_id = 0; + pbrms->action_vlan_flags = 0; + pbrms->action_pcp = 0; + + pbrms->action_queue_id = PBR_MAP_UNDEFINED_QUEUE_ID; + pbrms->reason = PBR_MAP_INVALID_EMPTY | PBR_MAP_INVALID_NO_NEXTHOPS; @@ -601,10 +608,28 @@ pbr_map_sequence_check_nexthops_valid(struct pbr_map_sequence *pbrms) static void pbr_map_sequence_check_not_empty(struct pbr_map_sequence *pbrms) { - if (!pbrms->src && !pbrms->dst && !pbrms->mark && !pbrms->dsfield) + if (!pbrms->src && !pbrms->dst && !pbrms->mark && !pbrms->dsfield + && !pbrms->action_vlan_id && !pbrms->action_vlan_flags + && !pbrms->action_pcp + && pbrms->action_queue_id == PBR_MAP_UNDEFINED_QUEUE_ID) pbrms->reason |= PBR_MAP_INVALID_EMPTY; } +static void pbr_map_sequence_check_vlan_actions(struct pbr_map_sequence *pbrms) +{ + /* The set vlan tag action does the following: + * 1. If the frame is untagged, it tags the frame with the + * configured VLAN ID. + * 2. If the frame is tagged, if replaces the tag. + * + * The strip vlan action removes any inner tag, so it is invalid to + * specify both a set and strip action. + */ + if ((pbrms->action_vlan_id != 0) && (pbrms->action_vlan_flags != 0)) + pbrms->reason |= PBR_MAP_INVALID_SET_STRIP_VLAN; +} + + /* * Checks to see if we think that the pbmrs is valid. If we think * the config is valid return true. @@ -612,7 +637,7 @@ static void pbr_map_sequence_check_not_empty(struct pbr_map_sequence *pbrms) static void pbr_map_sequence_check_valid(struct pbr_map_sequence *pbrms) { pbr_map_sequence_check_nexthops_valid(pbrms); - + pbr_map_sequence_check_vlan_actions(pbrms); pbr_map_sequence_check_not_empty(pbrms); } |