VPP-197: LISP Source/Dest control plane support
[vpp.git] / vnet / vnet / lisp-cp / lisp_types.h
index 235d470..2587fce 100644 (file)
@@ -57,6 +57,8 @@ typedef CLIB_PACKED(struct ip_prefix
 #define ip_prefix_v4(_a) ip_addr_v4(&ip_prefix_addr(_a))
 #define ip_prefix_v6(_a) ip_addr_v6(&ip_prefix_addr(_a))
 
+void ip_prefix_normalize(ip_prefix_t * a);
+
 typedef enum
 {
   /* NOTE: ip addresses are left out on purpose. Use max masked ip-prefixes
@@ -64,6 +66,7 @@ typedef enum
   GID_ADDR_IP_PREFIX,
   GID_ADDR_LCAF,
   GID_ADDR_MAC,
+  GID_ADDR_SRC_DST,
   GID_ADDR_NO_ADDRESS,
   GID_ADDR_TYPES
 } gid_address_type_t;
@@ -74,19 +77,46 @@ typedef enum
   LCAF_NULL_BODY = 0,
   LCAF_AFI_LIST_TYPE,
   LCAF_INSTANCE_ID,
+  LCAF_SOURCE_DEST = 12,
   LCAF_TYPES
 } lcaf_type_t;
 
-struct _gid_address_t;
+typedef enum
+{
+  FID_ADDR_IP_PREF,
+  FID_ADDR_MAC
+} fid_addr_type_t;
 
+/* flat address type */
 typedef struct
 {
-  u8 src_len;
-  u8 dst_len;
-  struct _gid_address_t *src;
-  struct _gid_address_t *dst;
+  union
+  {
+    ip_prefix_t ippref;
+    u8 mac[6];
+  };
+  u8 type; /* fid_addr_type_t */
+} fid_address_t;
+
+typedef fid_address_t dp_address_t;
+
+#define fid_addr_ippref(_a) (_a)->ippref
+#define fid_addr_mac(_a) (_a)->mac
+#define fid_addr_type(_a) (_a)->type
+
+typedef struct
+{
+  fid_address_t src;
+  fid_address_t dst;
 } source_dest_t;
 
+#define sd_dst(_a) (_a)->dst
+#define sd_src(_a) (_a)->src
+#define sd_src_ippref(_a) fid_addr_ippref(&sd_src(_a))
+#define sd_dst_ippref(_a) fid_addr_ippref(&sd_dst(_a))
+#define sd_src_mac(_a) fid_addr_mac(&sd_src(_a))
+#define sd_dst_mac(_a) fid_addr_mac(&sd_dst(_a))
+
 typedef struct
 {
   u8 vni_mask_len;
@@ -121,6 +151,7 @@ typedef struct _gid_address_t
     ip_prefix_t ippref;
     lcaf_t lcaf;
     u8 mac[6];
+    source_dest_t sd;
   };
   u8 type;
   u32 vni;
@@ -131,6 +162,8 @@ u8 * format_ip_address (u8 * s, va_list * args);
 uword unformat_ip_address (unformat_input_t * input, va_list * args);
 u8 * format_ip_prefix (u8 * s, va_list * args);
 uword unformat_ip_prefix (unformat_input_t * input, va_list * args);
+u8 * format_mac_address (u8 * s, va_list * args);
+uword unformat_mac_address (unformat_input_t * input, va_list * args);
 
 u16 ip4_address_size_to_put ();
 u16 ip6_address_size_to_put ();
@@ -147,8 +180,8 @@ typedef enum {
     LISP_AFI_NO_ADDR,
     LISP_AFI_IP,
     LISP_AFI_IP6,
-    LISP_AFI_MAC = 6,
-    LISP_AFI_LCAF = 16387
+    LISP_AFI_LCAF = 16387,
+    LISP_AFI_MAC = 16389
 } lisp_afi_e;
 
 u8 *format_gid_address (u8 * s, va_list * args);
@@ -162,6 +195,7 @@ u8 gid_address_len (gid_address_t *a);
 void * gid_address_cast (gid_address_t * gid, gid_address_type_t type);
 void gid_address_copy(gid_address_t * dst, gid_address_t * src);
 u32 gid_address_parse (u8 * offset, gid_address_t *a);
+void gid_address_ip_set(gid_address_t * dst, void * src, u8 version);
 
 #define gid_address_type(_a) (_a)->type
 #define gid_address_ippref(_a) (_a)->ippref
@@ -172,12 +206,20 @@ u32 gid_address_parse (u8 * offset, gid_address_t *a);
 #define gid_address_mac(_a) (_a)->mac
 #define gid_address_vni(_a) (_a)->vni
 #define gid_address_vni_mask(_a) (_a)->vni_mask
+#define gid_address_sd_dst_ippref(_a) sd_dst_ippref(&(_a)->sd)
+#define gid_address_sd_src_ippref(_a) sd_src_ippref(&(_a)->sd)
+#define gid_address_sd_dst_mac(_a) sd_dst_mac(&(_a)->sd)
+#define gid_address_sd_src_mac(_a) sd_src_mac(&(_a)->sd)
+#define gid_address_sd(_a) (_a)->sd
+#define gid_address_sd_src(_a) sd_src(&gid_address_sd(_a))
+#define gid_address_sd_dst(_a) sd_dst(&gid_address_sd(_a))
 
 /* 'sub'address functions */
 #define foreach_gid_address_type_fcns  \
   _(ip_prefix)                    \
   _(lcaf)                         \
-  _(mac)
+  _(mac)                          \
+  _(sd)
 
 #define _(_n)                                 \
 u16    _n ## _size_to_write (void * pref);    \
@@ -189,6 +231,8 @@ void   _n ## _copy (void * dst , void * src);
 foreach_gid_address_type_fcns
 #undef _
 
+#define MAC_BIT_MASK (((u64)1 << 48) - 1)
+
 typedef struct
 {
   /* mark locator as local as opposed to remote */
@@ -233,6 +277,17 @@ typedef struct
   u8 local;
 } mapping_t;
 
-lcaf_t lcaf_iid_init (u32 vni);
+uword
+unformat_negative_mapping_action (unformat_input_t * input, va_list * args);
+
+typedef struct locator_pair
+{
+  /* local and remote locators (underlay attachment points) */
+  ip_address_t lcl_loc;
+  ip_address_t rmt_loc;
+
+  u8 priority;
+  u8 weight;
+} locator_pair_t;
 
 #endif /* VNET_LISP_GPE_LISP_TYPES_H_ */