forked from Mirror/frr
lib, sharpd, zebra: Add new enum for lsp type and pass it through.
Add the ability to pass the lsp owner type through the zapi and in addition add a new label type for the sharp protocol for testing. Finally modify zebra_mpls.h to not have defaults specified for the enum. That way when we add a new LSP type the compile fails and the person doing the addition knows where he has to touch shit. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
parent
70e98a7fe7
commit
339e36d258
|
@ -115,7 +115,8 @@ enum lsp_types_t {
|
||||||
ZEBRA_LSP_STATIC = 1, /* Static LSP. */
|
ZEBRA_LSP_STATIC = 1, /* Static LSP. */
|
||||||
ZEBRA_LSP_LDP = 2, /* LDP LSP. */
|
ZEBRA_LSP_LDP = 2, /* LDP LSP. */
|
||||||
ZEBRA_LSP_BGP = 3, /* BGP LSP. */
|
ZEBRA_LSP_BGP = 3, /* BGP LSP. */
|
||||||
ZEBRA_LSP_SR = 4 /* Segment Routing LSP. */
|
ZEBRA_LSP_SR = 4, /* Segment Routing LSP. */
|
||||||
|
ZEBRA_LSP_SHARP = 5, /* Identifier for test protocol */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Functions for basic label operations. */
|
/* Functions for basic label operations. */
|
||||||
|
|
|
@ -364,7 +364,7 @@ static int zebra_hello_send(struct zclient *zclient)
|
||||||
}
|
}
|
||||||
|
|
||||||
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,
|
||||||
mpls_label_t label)
|
mpls_label_t label, enum lsp_types_t ltype)
|
||||||
{
|
{
|
||||||
struct stream *s;
|
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);
|
zclient_create_header(s, ZEBRA_VRF_LABEL, vrf_id);
|
||||||
stream_putl(s, label);
|
stream_putl(s, label);
|
||||||
|
stream_putc(s, ltype);
|
||||||
stream_putw_at(s, 0, stream_get_endp(s));
|
stream_putw_at(s, 0, stream_get_endp(s));
|
||||||
zclient_send_message(zclient);
|
zclient_send_message(zclient);
|
||||||
}
|
}
|
||||||
|
|
|
@ -392,7 +392,7 @@ extern void redist_del_instance(struct redist_proto *, u_short);
|
||||||
* operation.
|
* operation.
|
||||||
*/
|
*/
|
||||||
extern void zclient_send_vrf_label(struct zclient *zclient, vrf_id_t vrf_id,
|
extern void zclient_send_vrf_label(struct zclient *zclient, vrf_id_t vrf_id,
|
||||||
mpls_label_t label);
|
mpls_label_t label, enum lsp_types_t ltype);
|
||||||
|
|
||||||
extern void zclient_send_reg_requests(struct zclient *, vrf_id_t);
|
extern void zclient_send_reg_requests(struct zclient *, vrf_id_t);
|
||||||
extern void zclient_send_dereg_requests(struct zclient *, vrf_id_t);
|
extern void zclient_send_dereg_requests(struct zclient *, vrf_id_t);
|
||||||
|
|
|
@ -154,7 +154,7 @@ static void zebra_connected(struct zclient *zclient)
|
||||||
|
|
||||||
void vrf_label_add(vrf_id_t vrf_id, mpls_label_t label)
|
void vrf_label_add(vrf_id_t vrf_id, mpls_label_t label)
|
||||||
{
|
{
|
||||||
zclient_send_vrf_label(zclient, vrf_id, label);
|
zclient_send_vrf_label(zclient, vrf_id, label, ZEBRA_LSP_SHARP);
|
||||||
}
|
}
|
||||||
|
|
||||||
void route_add(struct prefix *p, struct nexthop *nh)
|
void route_add(struct prefix *p, struct nexthop *nh)
|
||||||
|
|
|
@ -428,9 +428,19 @@ static inline u_char lsp_distance(enum lsp_types_t type)
|
||||||
return (route_distance(ZEBRA_ROUTE_LDP));
|
return (route_distance(ZEBRA_ROUTE_LDP));
|
||||||
case ZEBRA_LSP_BGP:
|
case ZEBRA_LSP_BGP:
|
||||||
return (route_distance(ZEBRA_ROUTE_BGP));
|
return (route_distance(ZEBRA_ROUTE_BGP));
|
||||||
default:
|
case ZEBRA_LSP_NONE:
|
||||||
|
case ZEBRA_LSP_SHARP:
|
||||||
|
case ZEBRA_LSP_SR:
|
||||||
return 150;
|
return 150;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For some reason certain compilers do not believe
|
||||||
|
* that all the cases have been handled. And
|
||||||
|
* WTF does this work differently than when I removed
|
||||||
|
* the default case????
|
||||||
|
*/
|
||||||
|
return 150;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -444,6 +454,8 @@ static inline enum lsp_types_t lsp_type_from_re_type(int re_type)
|
||||||
return ZEBRA_LSP_STATIC;
|
return ZEBRA_LSP_STATIC;
|
||||||
case ZEBRA_ROUTE_BGP:
|
case ZEBRA_ROUTE_BGP:
|
||||||
return ZEBRA_LSP_BGP;
|
return ZEBRA_LSP_BGP;
|
||||||
|
case ZEBRA_ROUTE_SHARP:
|
||||||
|
return ZEBRA_LSP_SHARP;
|
||||||
default:
|
default:
|
||||||
return ZEBRA_LSP_NONE;
|
return ZEBRA_LSP_NONE;
|
||||||
}
|
}
|
||||||
|
@ -464,9 +476,18 @@ static inline int re_type_from_lsp_type(enum lsp_types_t lsp_type)
|
||||||
case ZEBRA_LSP_SR:
|
case ZEBRA_LSP_SR:
|
||||||
return ZEBRA_ROUTE_OSPF;
|
return ZEBRA_ROUTE_OSPF;
|
||||||
case ZEBRA_LSP_NONE:
|
case ZEBRA_LSP_NONE:
|
||||||
default:
|
|
||||||
return ZEBRA_ROUTE_KERNEL;
|
return ZEBRA_ROUTE_KERNEL;
|
||||||
|
case ZEBRA_LSP_SHARP:
|
||||||
|
return ZEBRA_ROUTE_SHARP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For some reason certain compilers do not believe
|
||||||
|
* that all the cases have been handled. And
|
||||||
|
* WTF does this work differently than when I removed
|
||||||
|
* the default case????
|
||||||
|
*/
|
||||||
|
return ZEBRA_ROUTE_KERNEL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* NHLFE type as printable string. */
|
/* NHLFE type as printable string. */
|
||||||
|
@ -481,9 +502,19 @@ static inline const char *nhlfe_type2str(enum lsp_types_t lsp_type)
|
||||||
return "BGP";
|
return "BGP";
|
||||||
case ZEBRA_LSP_SR:
|
case ZEBRA_LSP_SR:
|
||||||
return "SR";
|
return "SR";
|
||||||
default:
|
case ZEBRA_LSP_SHARP:
|
||||||
|
return "SHARP";
|
||||||
|
case ZEBRA_LSP_NONE:
|
||||||
return "Unknown";
|
return "Unknown";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For some reason certain compilers do not believe
|
||||||
|
* that all the cases have been handled. And
|
||||||
|
* WTF does this work differently than when I removed
|
||||||
|
* the default case????
|
||||||
|
*/
|
||||||
|
return "Unknown";
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void mpls_mark_lsps_for_processing(struct zebra_vrf *zvrf)
|
static inline void mpls_mark_lsps_for_processing(struct zebra_vrf *zvrf)
|
||||||
|
|
|
@ -2493,16 +2493,17 @@ static void zread_vrf_label(struct zserv *client,
|
||||||
mpls_label_t nlabel;
|
mpls_label_t nlabel;
|
||||||
struct stream *s;
|
struct stream *s;
|
||||||
struct zebra_vrf *def_zvrf;
|
struct zebra_vrf *def_zvrf;
|
||||||
|
enum lsp_types_t ltype;
|
||||||
|
|
||||||
s = client->ibuf;
|
s = client->ibuf;
|
||||||
STREAM_GETL(s, nlabel);
|
STREAM_GETL(s, nlabel);
|
||||||
|
|
||||||
if (nlabel == zvrf->label) {
|
if (nlabel == zvrf->label) {
|
||||||
/*
|
/*
|
||||||
* Nothing to do here move along
|
* Nothing to do here move along
|
||||||
*/
|
*/
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
STREAM_GETC(s, ltype);
|
||||||
|
|
||||||
if (zvrf->vrf->vrf_id != VRF_DEFAULT)
|
if (zvrf->vrf->vrf_id != VRF_DEFAULT)
|
||||||
ifp = if_lookup_by_name(zvrf->vrf->name, zvrf->vrf->vrf_id);
|
ifp = if_lookup_by_name(zvrf->vrf->name, zvrf->vrf->vrf_id);
|
||||||
|
@ -2518,13 +2519,12 @@ static void zread_vrf_label(struct zserv *client,
|
||||||
def_zvrf = zebra_vrf_lookup_by_id(VRF_DEFAULT);
|
def_zvrf = zebra_vrf_lookup_by_id(VRF_DEFAULT);
|
||||||
|
|
||||||
if (zvrf->label != MPLS_LABEL_IPV4_EXPLICIT_NULL)
|
if (zvrf->label != MPLS_LABEL_IPV4_EXPLICIT_NULL)
|
||||||
mpls_lsp_uninstall(def_zvrf, ZEBRA_LSP_STATIC,
|
mpls_lsp_uninstall(def_zvrf, ltype, zvrf->label,
|
||||||
zvrf->label, NEXTHOP_TYPE_IFINDEX,
|
NEXTHOP_TYPE_IFINDEX, NULL, ifp->ifindex);
|
||||||
NULL, ifp->ifindex);
|
|
||||||
|
|
||||||
if (nlabel != MPLS_LABEL_IPV4_EXPLICIT_NULL)
|
if (nlabel != MPLS_LABEL_IPV4_EXPLICIT_NULL)
|
||||||
mpls_lsp_install(def_zvrf, ZEBRA_LSP_STATIC, nlabel,
|
mpls_lsp_install(def_zvrf, ltype, nlabel, MPLS_LABEL_IMPLICIT_NULL,
|
||||||
MPLS_LABEL_IMPLICIT_NULL, NEXTHOP_TYPE_IFINDEX, NULL, ifp->ifindex);
|
NEXTHOP_TYPE_IFINDEX, NULL, ifp->ifindex);
|
||||||
|
|
||||||
zvrf->label = nlabel;
|
zvrf->label = nlabel;
|
||||||
stream_failure:
|
stream_failure:
|
||||||
|
|
Loading…
Reference in a new issue