Merge pull request #1753 from donaldsharp/afi_vrf_label

lib, sharpd, zebra: Update the zapi_vrf_label call to add afi
This commit is contained in:
Lou Berger 2018-02-16 12:36:08 -06:00 committed by GitHub
commit df82650c67
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 47 additions and 13 deletions

View File

@ -363,7 +363,7 @@ static int zebra_hello_send(struct zclient *zclient)
return 0;
}
void zclient_send_vrf_label(struct zclient *zclient, vrf_id_t vrf_id,
void zclient_send_vrf_label(struct zclient *zclient, vrf_id_t vrf_id, afi_t afi,
mpls_label_t label, enum lsp_types_t ltype)
{
struct stream *s;
@ -373,6 +373,7 @@ void zclient_send_vrf_label(struct zclient *zclient, vrf_id_t vrf_id,
zclient_create_header(s, ZEBRA_VRF_LABEL, vrf_id);
stream_putl(s, label);
stream_putc(s, afi);
stream_putc(s, ltype);
stream_putw_at(s, 0, stream_get_endp(s));
zclient_send_message(zclient);

View File

@ -390,9 +390,15 @@ extern void redist_del_instance(struct redist_proto *, u_short);
* label for lookup. If you pass in MPLS_LABEL_NONE
* we will cause a delete action and remove this label pop
* operation.
*
* The underlying AF_MPLS doesn't care about afi's
* but we can make the zebra_vrf keep track of what
* we have installed and play some special games
* to get them both installed.
*/
extern void zclient_send_vrf_label(struct zclient *zclient, vrf_id_t vrf_id,
mpls_label_t label, enum lsp_types_t ltype);
afi_t afi, mpls_label_t label,
enum lsp_types_t ltype);
extern void zclient_send_reg_requests(struct zclient *, vrf_id_t);
extern void zclient_send_dereg_requests(struct zclient *, vrf_id_t);

View File

@ -80,14 +80,17 @@ DEFPY (install_routes,
}
DEFPY(vrf_label, vrf_label_cmd,
"sharp label vrf NAME$name label (0-100000)$label",
"sharp label <ip$ipv4|ipv6$ipv6> vrf NAME$name label (0-100000)$label",
"Sharp Routing Protocol\n"
"Give a vrf a label\n"
"Pop and forward for IPv4\n"
"Pop and forward for IPv6\n"
VRF_CMD_HELP_STR
"The label to use, 0 specifies remove the label installed from previous\n"
"Specified range to use\n")
{
struct vrf *vrf;
afi_t afi = (ipv4) ? AFI_IP : AFI_IP6;
if (strcmp(name, "default") == 0)
vrf = vrf_lookup_by_id(VRF_DEFAULT);
@ -102,7 +105,7 @@ DEFPY(vrf_label, vrf_label_cmd,
if (label == 0)
label = MPLS_LABEL_NONE;
vrf_label_add(vrf->vrf_id, label);
vrf_label_add(vrf->vrf_id, afi, label);
return CMD_SUCCESS;
}

View File

@ -152,9 +152,9 @@ static void zebra_connected(struct zclient *zclient)
zclient_send_reg_requests(zclient, VRF_DEFAULT);
}
void vrf_label_add(vrf_id_t vrf_id, mpls_label_t label)
void vrf_label_add(vrf_id_t vrf_id, afi_t afi, mpls_label_t label)
{
zclient_send_vrf_label(zclient, vrf_id, label, ZEBRA_LSP_SHARP);
zclient_send_vrf_label(zclient, vrf_id, afi, label, ZEBRA_LSP_SHARP);
}
void route_add(struct prefix *p, struct nexthop *nh)

View File

@ -24,7 +24,7 @@
extern void sharp_zebra_init(void);
extern void vrf_label_add(vrf_id_t vrf_id, mpls_label_t label);
extern void vrf_label_add(vrf_id_t vrf_id, afi_t afi, mpls_label_t label);
extern void route_add(struct prefix *p, struct nexthop *nh);
extern void route_delete(struct prefix *p);
#endif

View File

@ -80,7 +80,7 @@ struct zebra_vrf {
struct zebra_ns *zns;
/* MPLS Label to handle L3VPN <-> vrf popping */
mpls_label_t label;
mpls_label_t label[AFI_MAX];
/* MPLS static LSP config table */
struct hash *slsp_table;

View File

@ -2486,23 +2486,27 @@ stream_failure:
return 1;
}
static void zread_vrf_label(struct zserv *client,
struct zebra_vrf *zvrf)
{
struct interface *ifp;
mpls_label_t nlabel;
afi_t afi;
struct stream *s;
struct zebra_vrf *def_zvrf;
enum lsp_types_t ltype;
s = client->ibuf;
STREAM_GETL(s, nlabel);
if (nlabel == zvrf->label) {
STREAM_GETC(s, afi);
if (nlabel == zvrf->label[afi]) {
/*
* Nothing to do here move along
*/
return;
}
STREAM_GETC(s, ltype);
if (zvrf->vrf->vrf_id != VRF_DEFAULT)
@ -2518,15 +2522,35 @@ static void zread_vrf_label(struct zserv *client,
def_zvrf = zebra_vrf_lookup_by_id(VRF_DEFAULT);
if (zvrf->label != MPLS_LABEL_NONE)
mpls_lsp_uninstall(def_zvrf, ltype, zvrf->label,
NEXTHOP_TYPE_IFINDEX, NULL, ifp->ifindex);
if (zvrf->label[afi] != MPLS_LABEL_NONE) {
afi_t scrubber;
bool really_remove;
really_remove = true;
for (scrubber = AFI_IP; scrubber < AFI_MAX ; scrubber++) {
if (scrubber == afi)
continue;
if (zvrf->label[scrubber] == MPLS_LABEL_NONE)
continue;
if (zvrf->label[afi] == zvrf->label[scrubber]) {
really_remove = false;
break;
}
}
if (really_remove)
mpls_lsp_uninstall(def_zvrf, ltype, zvrf->label[afi],
NEXTHOP_TYPE_IFINDEX, NULL,
ifp->ifindex);
}
if (nlabel != MPLS_LABEL_NONE)
mpls_lsp_install(def_zvrf, ltype, nlabel, MPLS_LABEL_IMPLICIT_NULL,
NEXTHOP_TYPE_IFINDEX, NULL, ifp->ifindex);
zvrf->label = nlabel;
zvrf->label[afi] = nlabel;
stream_failure:
return;
}