zebra: fix wrong check for mpls label

Add a parameter for `zebra_mpls_fec_for_label()`, as before if it is `NULL`,
otherwise exclude what this parameter represents.

Before:
```
anlan(config)# mpls label bind 1.1.1.2/32 88
anlan(config)# mpls label bind 1.1.1.2/32 88
% Label already bound to a FEC
anlan(config)# mpls label bind 1.1.1.3/32 88
% Label already bound to a FEC
```

After:
```
anlan(config)# mpls label bind 1.1.1.2/32 88
anlan(config)# mpls label bind 1.1.1.2/32 88
anlan(config)# mpls label bind 1.1.1.3/32 88
% Label already bound to a FEC
```

Signed-off-by: anlan_cs <anlan_cs@tom.com>
This commit is contained in:
anlan_cs 2024-04-05 15:03:15 +08:00
parent 30dcd79011
commit cbd1f3239a
3 changed files with 12 additions and 7 deletions

View File

@ -2476,7 +2476,7 @@ static int zebra_mpls_cleanup_zclient_labels(struct zserv *client)
* hash.. * hash..
*/ */
struct zebra_fec *zebra_mpls_fec_for_label(struct zebra_vrf *zvrf, struct zebra_fec *zebra_mpls_fec_for_label(struct zebra_vrf *zvrf,
mpls_label_t label) struct prefix *p, mpls_label_t label)
{ {
struct route_node *rn; struct route_node *rn;
struct zebra_fec *fec; struct zebra_fec *fec;
@ -2491,8 +2491,11 @@ struct zebra_fec *zebra_mpls_fec_for_label(struct zebra_vrf *zvrf,
if (!rn->info) if (!rn->info)
continue; continue;
fec = rn->info; fec = rn->info;
if (fec->label == label) if (fec->label == label) {
if (p && prefix_same(p, &rn->p))
return NULL;
return fec; return fec;
}
} }
} }
@ -2502,9 +2505,10 @@ struct zebra_fec *zebra_mpls_fec_for_label(struct zebra_vrf *zvrf,
/* /*
* Inform if specified label is currently bound to a FEC or not. * Inform if specified label is currently bound to a FEC or not.
*/ */
int zebra_mpls_label_already_bound(struct zebra_vrf *zvrf, mpls_label_t label) int zebra_mpls_label_already_bound(struct zebra_vrf *zvrf, struct prefix *p,
mpls_label_t label)
{ {
return (zebra_mpls_fec_for_label(zvrf, label) ? 1 : 0); return (zebra_mpls_fec_for_label(zvrf, p, label) ? 1 : 0);
} }
/* /*

View File

@ -203,12 +203,13 @@ int zebra_mpls_fec_unregister(struct zebra_vrf *zvrf, struct prefix *p,
* hash.. * hash..
*/ */
struct zebra_fec *zebra_mpls_fec_for_label(struct zebra_vrf *zvrf, struct zebra_fec *zebra_mpls_fec_for_label(struct zebra_vrf *zvrf,
mpls_label_t label); struct prefix *p, mpls_label_t label);
/* /*
* Inform if specified label is currently bound to a FEC or not. * Inform if specified label is currently bound to a FEC or not.
*/ */
int zebra_mpls_label_already_bound(struct zebra_vrf *zvrf, mpls_label_t label); int zebra_mpls_label_already_bound(struct zebra_vrf *zvrf, struct prefix *p,
mpls_label_t label);
/* /*
* Add static FEC to label binding. If there are clients registered for this * Add static FEC to label binding. If there are clients registered for this

View File

@ -210,7 +210,7 @@ static int zebra_mpls_bind(struct vty *vty, int add_cmd, const char *prefix,
vty_out(vty, "%% Invalid label\n"); vty_out(vty, "%% Invalid label\n");
return CMD_WARNING_CONFIG_FAILED; return CMD_WARNING_CONFIG_FAILED;
} }
if (zebra_mpls_label_already_bound(zvrf, label)) { if (zebra_mpls_label_already_bound(zvrf, &p, label)) {
vty_out(vty, vty_out(vty,
"%% Label already bound to a FEC\n"); "%% Label already bound to a FEC\n");
return CMD_WARNING_CONFIG_FAILED; return CMD_WARNING_CONFIG_FAILED;