DEFINE_MTYPE_STATIC(LIB, PREFIX, "Prefix");
DEFINE_MTYPE_STATIC(LIB, PREFIX_FLOWSPEC, "Prefix Flowspec");
-DEFINE_MTYPE_STATIC(LIB, PREFIX_LINKSTATE, "Prefix Link-State");
/* Maskbit. */
static const uint8_t maskbit[] = {0x00, 0x80, 0xc0, 0xe0, 0xf0,
#define MASKBIT(offset) ((0xff << (PNBBY - (offset))) & 0xff)
-char *(*prefix_linkstate_display_hook)(char *buf, size_t size,
- uint16_t nlri_type, uintptr_t ptr,
- uint16_t len) = NULL;
-
-void prefix_set_linkstate_display_hook(char *(*func)(char *buf, size_t size,
- uint16_t nlri_type,
- uintptr_t ptr,
- uint16_t len))
-{
- prefix_linkstate_display_hook = func;
-}
-
int is_zero_mac(const struct ethaddr *mac)
{
int i = 0;
return AF_ETHERNET;
else if (!strcmp("evpn", string))
return AF_EVPN;
- else if (!strcmp("link-state", string))
- return AF_LINKSTATE;
return -1;
}
return "Ethernet";
case AF_EVPN:
return "Evpn";
- case AF_LINKSTATE:
- return "Link-State";
}
return "?";
}
else if (afi == AFI_L2VPN)
return AF_ETHERNET;
/* NOTE: EVPN code should NOT use this interface. */
- else if (afi == AFI_LINKSTATE)
- return AF_LINKSTATE;
return 0;
}
return AFI_IP6;
else if (family == AF_ETHERNET || family == AF_EVPN)
return AFI_L2VPN;
- else if (family == AF_LINKSTATE)
- return AFI_LINKSTATE;
return 0;
}
offset = n->u.prefix_flowspec.prefixlen;
- while (offset--)
- if (np[offset] != pp[offset])
- return 0;
- return 1;
- } else if (n->family == AF_LINKSTATE) {
- if (n->u.prefix_linkstate.nlri_type !=
- p->u.prefix_linkstate.nlri_type)
- return 0;
-
- /* Set both prefix's head pointer. */
- np = (const uint8_t *)&n->u.prefix_linkstate.ptr;
- pp = (const uint8_t *)&p->u.prefix_linkstate.ptr;
-
- offset = n->prefixlen; /* length is checked above */
-
while (offset--)
if (np[offset] != pp[offset])
return 0;
{
struct prefix *dest = udest.p;
const struct prefix *src = usrc.p;
- void *temp;
- int len;
dest->family = src->family;
dest->prefixlen = src->prefixlen;
dest->u.lp.id = src->u.lp.id;
dest->u.lp.adv_router = src->u.lp.adv_router;
} else if (src->family == AF_FLOWSPEC) {
+ void *temp;
+ int len;
+
len = src->u.prefix_flowspec.prefixlen;
dest->u.prefix_flowspec.prefixlen =
src->u.prefix_flowspec.prefixlen;
dest->u.prefix_flowspec.ptr = (uintptr_t)temp;
memcpy((void *)dest->u.prefix_flowspec.ptr,
(void *)src->u.prefix_flowspec.ptr, len);
- } else if (src->family == AF_LINKSTATE) {
- len = src->prefixlen;
- dest->u.prefix_linkstate.nlri_type =
- src->u.prefix_linkstate.nlri_type;
- temp = XCALLOC(MTYPE_PREFIX_LINKSTATE, len);
- dest->u.prefix_linkstate.ptr = (uintptr_t)temp;
- memcpy((void *)dest->u.prefix_linkstate.ptr,
- (void *)src->u.prefix_linkstate.ptr, len);
} else {
flog_err(EC_LIB_DEVELOPMENT,
"prefix_copy(): Unknown address family %d",
p2->u.prefix_flowspec.prefixlen))
return 1;
}
- if (p1->family == AF_LINKSTATE) {
- if (p1->u.prefix_linkstate.nlri_type !=
- p2->u.prefix_linkstate.nlri_type)
- return 0;
- if (!memcmp(&p1->u.prefix_linkstate.ptr,
- &p2->u.prefix_linkstate.ptr, p2->prefixlen))
- return 1;
- }
}
return 0;
}
if (pp1[offset] != pp2[offset])
return numcmp(pp1[offset], pp2[offset]);
return 0;
- } else if (p1->family == AF_LINKSTATE) {
- pp1 = (const uint8_t *)p1->u.prefix_linkstate.ptr;
- pp2 = (const uint8_t *)p2->u.prefix_linkstate.ptr;
-
- if (p1->u.prefix_linkstate.nlri_type !=
- p2->u.prefix_linkstate.nlri_type)
- return 1;
-
- if (p1->prefixlen != p2->prefixlen)
- return numcmp(p1->prefixlen, p2->prefixlen);
-
- offset = p1->prefixlen;
- while (offset--)
- if (pp1[offset] != pp2[offset])
- return numcmp(pp1[offset], pp2[offset]);
- return 0;
}
pp1 = p1->u.val;
pp2 = p2->u.val;
return str;
}
-const char *bgp_linkstate_nlri_type_2str(uint16_t nlri_type)
-{
- switch (nlri_type) {
- case BGP_LINKSTATE_NODE:
- return "Node";
- case BGP_LINKSTATE_LINK:
- return "Link";
- case BGP_LINKSTATE_PREFIX4:
- return "IPv4-Prefix";
- case BGP_LINKSTATE_PREFIX6:
- return "IPv6-Prefix";
- }
-
- return "Unknown";
-}
-
const char *prefix2str(union prefixconstptr pu, char *str, int size)
{
const struct prefix *p = pu.p;
strlcpy(str, "FS prefix", size);
break;
- case AF_LINKSTATE:
- if (prefix_linkstate_display_hook)
- snprintf(str, size, "%s/%d",
- prefix_linkstate_display_hook(
- buf, sizeof(buf),
- p->u.prefix_linkstate.nlri_type,
- p->u.prefix_linkstate.ptr,
- p->prefixlen),
- p->prefixlen);
- else
- snprintf(str, size, "%s/%d",
- bgp_linkstate_nlri_type_2str(
- p->u.prefix_linkstate.nlri_type),
- p->prefixlen);
- break;
-
default:
strlcpy(str, "UNK prefix", size);
break;
prefix_mac2str(&p->u.prefix_eth, buf, sizeof(buf));
return bputs(fbuf, buf);
- case AF_LINKSTATE:
- if (prefix_linkstate_display_hook)
- prefix_linkstate_display_hook(
- buf, sizeof(buf),
- p->u.prefix_linkstate.nlri_type,
- p->u.prefix_linkstate.ptr, p->prefixlen);
- else
- snprintf(buf, sizeof(buf), "%s",
- bgp_linkstate_nlri_type_2str(
- p->u.prefix_linkstate.nlri_type));
- return bputs(fbuf, buf);
default:
return bprintfrr(fbuf, "{prefix.af=%dPF}", p->family);
}
return sg_str;
}
-
-void prefix_linkstate_ptr_free(struct prefix *p)
-{
- void *temp;
-
- if (!p || p->family != AF_LINKSTATE || !p->u.prefix_linkstate.ptr)
- return;
-
- temp = (void *)p->u.prefix_linkstate.ptr;
- XFREE(MTYPE_PREFIX_LINKSTATE, temp);
- p->u.prefix_linkstate.ptr = (uintptr_t)NULL;
-}
-
-
struct prefix *prefix_new(void)
{
struct prefix *p;
unsigned prefix_hash_key(const void *pp)
{
struct prefix copy;
- uint32_t len;
- void *temp;
-
- /* make sure *all* unused bits are zero, particularly including
- * alignment /
- * padding and unused prefix bytes. */
- memset(©, 0, sizeof(copy));
- prefix_copy(©, (struct prefix *)pp);
if (((struct prefix *)pp)->family == AF_FLOWSPEC) {
+ uint32_t len;
+ void *temp;
+
+ /* make sure *all* unused bits are zero,
+ * particularly including alignment /
+ * padding and unused prefix bytes.
+ */
+ memset(©, 0, sizeof(copy));
+ prefix_copy(©, (struct prefix *)pp);
len = jhash((void *)copy.u.prefix_flowspec.ptr,
copy.u.prefix_flowspec.prefixlen,
0x55aa5a5a);
XFREE(MTYPE_PREFIX_FLOWSPEC, temp);
copy.u.prefix_flowspec.ptr = (uintptr_t)NULL;
return len;
- } else if (((struct prefix *)pp)->family == AF_LINKSTATE) {
- len = jhash((void *)copy.u.prefix_linkstate.ptr, copy.prefixlen,
- 0x55aa5a5a);
- prefix_linkstate_ptr_free(©);
- return len;
}
-
+ /* make sure *all* unused bits are zero, particularly including
+ * alignment /
+ * padding and unused prefix bytes. */
+ memset(©, 0, sizeof(copy));
+ prefix_copy(©, (struct prefix *)pp);
return jhash(©,
offsetof(struct prefix, u.prefix) + PSIZE(copy.prefixlen),
0x55aa5a5a);
#define prefix_addr u._prefix_addr
};
-/* BGP Link-State NRLI types*/
-enum bgp_linkstate_nlri_type {
- /* RFC7752 Table 1 */
- BGP_LINKSTATE_NODE = 1,
- BGP_LINKSTATE_LINK = 2,
- BGP_LINKSTATE_PREFIX4 = 3, /* IPv4 Topology Prefix */
- BGP_LINKSTATE_PREFIX6 = 4, /* IPv6 Topology Prefix */
-};
-
/*
* A struct prefix contains an address family, a prefix length, and an
* address. This can represent either a 'network prefix' as defined
#define AF_FLOWSPEC (AF_MAX + 2)
#endif
-#if !defined(AF_LINKSTATE)
-#define AF_LINKSTATE (AF_MAX + 3)
-#endif
-
struct flowspec_prefix {
uint8_t family;
uint16_t prefixlen; /* length in bytes */
uintptr_t ptr;
};
-struct linkstate_prefix {
- uint16_t nlri_type;
- uintptr_t ptr;
-};
-
/* FRR generic prefix structure. */
struct prefix {
uint8_t family;
uintptr_t ptr;
struct evpn_addr prefix_evpn; /* AF_EVPN */
struct flowspec_prefix prefix_flowspec; /* AF_FLOWSPEC */
- struct linkstate_prefix prefix_linkstate; /* AF_LINKSTATE */
} u __attribute__((aligned(8)));
};
struct flowspec_prefix prefix __attribute__((aligned(8)));
};
-
-/* Prefix for a BGP-LS entry */
-struct prefix_bgpls {
- uint8_t family;
- uint16_t prefixlen;
- struct linkstate_prefix prefix __attribute__((aligned(8)));
-};
-
struct prefix_sg {
uint8_t family;
uint16_t prefixlen;
#define s6_addr32 __u6_addr.__u6_addr32
#endif /*s6_addr32*/
-extern void prefix_set_linkstate_display_hook(
- char *(*func)(char *buf, size_t size, uint16_t nlri_type, uintptr_t ptr,
- uint16_t len));
-
/* Prototypes. */
extern int str2family(const char *string);
extern int afi2family(afi_t afi);
*/
extern unsigned int prefix_bit(const uint8_t *prefix, const uint16_t bit_index);
-extern void prefix_linkstate_ptr_free(struct prefix *p);
-
extern struct prefix *prefix_new(void);
extern void prefix_free(struct prefix **p);
/*
extern const char *prefix_sg2str(const struct prefix_sg *sg, char *str);
extern const char *prefix2str(union prefixconstptr upfx, char *buffer,
int size);
-extern const char *bgp_linkstate_nlri_type_2str(uint16_t nlri_type);
extern int evpn_type5_prefix_match(const struct prefix *evpn_pfx,
const struct prefix *match_pfx);
extern int prefix_match(union prefixconstptr unet, union prefixconstptr upfx);