]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/prefix.h
zebra, lib: fix the ZEBRA_INTERFACE_VRF_UPDATE zapi message
[mirror_frr.git] / lib / prefix.h
index 4efbc5a95c336cfbdc8f631a9e31a142117c7883..4247569137dd4a4b5a3e3e917e9e6c0190d670ad 100644 (file)
@@ -39,6 +39,9 @@
 #define ETH_ALEN 6
 #endif
 
+#define ESI_BYTES 10
+#define ESI_STR_LEN (3 * ESI_BYTES)
+
 #define ETHER_ADDR_STRLEN (3*ETH_ALEN)
 /*
  * there isn't a portable ethernet address type. We define our
@@ -56,26 +59,56 @@ struct ethaddr {
 #define PREFIX_LEN_ROUTE_TYPE_5_IPV4 (18*8)
 #define PREFIX_LEN_ROUTE_TYPE_5_IPV6 (30*8)
 
-/* EVPN address (RFC 7432) */
-struct evpn_addr {
-       uint8_t route_type;
+typedef struct esi_t_ {
+       uint8_t val[10];
+} esi_t;
+
+struct evpn_ead_addr {
+       esi_t esi;
+       uint32_t eth_tag;
+};
+
+struct evpn_macip_addr {
+       uint32_t eth_tag;
        uint8_t ip_prefix_length;
        struct ethaddr mac;
+       struct ipaddr ip;
+};
+
+struct evpn_imet_addr {
        uint32_t eth_tag;
+       uint8_t ip_prefix_length;
+       struct ipaddr ip;
+};
+
+struct evpn_es_addr {
+       esi_t esi;
+       uint8_t ip_prefix_length;
+       struct ipaddr ip;
+};
+
+struct evpn_prefix_addr {
+       uint32_t eth_tag;
+       uint8_t ip_prefix_length;
        struct ipaddr ip;
-#if 0
-  union
-  {
-    uint8_t addr;
-    struct in_addr v4_addr;
-    struct in6_addr v6_addr;
-  } ip;
-#endif
 };
 
-#define IS_EVPN_PREFIX_IPADDR_NONE(evp)  IS_IPADDR_NONE(&(evp)->prefix.ip)
-#define IS_EVPN_PREFIX_IPADDR_V4(evp)    IS_IPADDR_V4(&(evp)->prefix.ip)
-#define IS_EVPN_PREFIX_IPADDR_V6(evp)    IS_IPADDR_V6(&(evp)->prefix.ip)
+/* EVPN address (RFC 7432) */
+struct evpn_addr {
+       uint8_t route_type;
+       union {
+               struct evpn_ead_addr _ead_addr;
+               struct evpn_macip_addr _macip_addr;
+               struct evpn_imet_addr _imet_addr;
+               struct evpn_es_addr _es_addr;
+               struct evpn_prefix_addr _prefix_addr;
+       } u;
+#define ead_addr u._ead_addr
+#define macip_addr u._macip_addr
+#define imet_addr u._imet_addr
+#define es_addr u._es_addr
+#define prefix_addr u._prefix_addr
+};
 
 /*
  * A struct prefix contains an address family, a prefix length, and an
@@ -177,6 +210,45 @@ struct prefix_evpn {
        struct evpn_addr prefix __attribute__((aligned(8)));
 };
 
+static inline int is_evpn_prefix_ipaddr_none(const struct prefix_evpn *evp)
+{
+       if (evp->prefix.route_type == 2)
+               return IS_IPADDR_NONE(&(evp)->prefix.macip_addr.ip);
+       if (evp->prefix.route_type == 3)
+               return IS_IPADDR_NONE(&(evp)->prefix.imet_addr.ip);
+       if (evp->prefix.route_type == 4)
+               return IS_IPADDR_NONE(&(evp)->prefix.es_addr.ip);
+       if (evp->prefix.route_type == 5)
+               return IS_IPADDR_NONE(&(evp)->prefix.prefix_addr.ip);
+       return 0;
+}
+
+static inline int is_evpn_prefix_ipaddr_v4(const struct prefix_evpn *evp)
+{
+       if (evp->prefix.route_type == 2)
+               return IS_IPADDR_V4(&(evp)->prefix.macip_addr.ip);
+       if (evp->prefix.route_type == 3)
+               return IS_IPADDR_V4(&(evp)->prefix.imet_addr.ip);
+       if (evp->prefix.route_type == 4)
+               return IS_IPADDR_V4(&(evp)->prefix.es_addr.ip);
+       if (evp->prefix.route_type == 5)
+               return IS_IPADDR_V4(&(evp)->prefix.prefix_addr.ip);
+       return 0;
+}
+
+static inline int is_evpn_prefix_ipaddr_v6(const struct prefix_evpn *evp)
+{
+       if (evp->prefix.route_type == 2)
+               return IS_IPADDR_V6(&(evp)->prefix.macip_addr.ip);
+       if (evp->prefix.route_type == 3)
+               return IS_IPADDR_V6(&(evp)->prefix.imet_addr.ip);
+       if (evp->prefix.route_type == 4)
+               return IS_IPADDR_V6(&(evp)->prefix.es_addr.ip);
+       if (evp->prefix.route_type == 5)
+               return IS_IPADDR_V6(&(evp)->prefix.prefix_addr.ip);
+       return 0;
+}
+
 /* Prefix for a generic pointer */
 struct prefix_ptr {
        uint8_t family;
@@ -290,6 +362,7 @@ static inline void ipv4_addr_copy(struct in_addr *dst,
 extern int str2family(const char *);
 extern int afi2family(afi_t);
 extern afi_t family2afi(int);
+extern const char *family2str(int family);
 extern const char *safi2str(safi_t safi);
 extern const char *afi2str(afi_t afi);
 
@@ -368,6 +441,11 @@ extern char *prefix_mac2str(const struct ethaddr *mac, char *buf, int size);
 
 extern unsigned prefix_hash_key(void *pp);
 
+extern int str_to_esi(const char *str, esi_t *esi);
+extern char *esi_to_str(const esi_t *esi, char *buf, int size);
+extern void prefix_hexdump(const struct prefix *p);
+extern void prefix_evpn_hexdump(const struct prefix_evpn *p);
+
 static inline int ipv6_martian(struct in6_addr *addr)
 {
        struct in6_addr localhost_addr;
@@ -380,7 +458,6 @@ static inline int ipv6_martian(struct in6_addr *addr)
        return 0;
 }
 
-extern int all_digit(const char *);
 extern int macstr2prefix_evpn(const char *str, struct prefix_evpn *p);
 
 /* NOTE: This routine expects the address argument in network byte order. */
@@ -418,5 +495,4 @@ static inline int is_host_route(struct prefix *p)
                return (p->prefixlen == IPV6_MAX_BITLEN);
        return 0;
 }
-
 #endif /* _ZEBRA_PREFIX_H */