
Type: refactor Change-Id: I54df533a8f863c4e49742903cf2457f18b4fc506 Signed-off-by: Neale Ranns <nranns@cisco.com>
645 lines
23 KiB
C
645 lines
23 KiB
C
/*
|
|
* Copyright (c) 2016 Cisco and/or its affiliates.
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at:
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef VNET_LISP_GPE_LISP_CP_MESSAGES_H_
|
|
#define VNET_LISP_GPE_LISP_CP_MESSAGES_H_
|
|
|
|
#include <vnet/vnet.h>
|
|
|
|
#define MAX_IP_PKT_LEN 4096
|
|
#define MAX_IP_HDR_LEN 40 /* without options or IPv6 hdr extensions */
|
|
#define UDP_HDR_LEN 8
|
|
#define LISP_DATA_HDR_LEN 8
|
|
#define LISP_ECM_HDR_LEN 4
|
|
#define MAX_LISP_MSG_ENCAP_LEN 2*(MAX_IP_HDR_LEN + UDP_HDR_LEN)+ LISP_ECM_HDR_LEN
|
|
#define MAX_LISP_PKT_ENCAP_LEN MAX_IP_HDR_LEN + UDP_HDR_LEN + LISP_DATA_HDR_LEN
|
|
|
|
#define LISP_CONTROL_PORT 4342
|
|
|
|
/*
|
|
* EID RECORD FIELD
|
|
*/
|
|
|
|
/*
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* / | Reserved | EID mask-len | EID-prefix-AFI |
|
|
* Rec +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* \ | EID-prefix ... |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
*/
|
|
|
|
|
|
typedef struct _eid_prefix_record_hdr
|
|
{
|
|
u8 reserved;
|
|
u8 eid_prefix_length;
|
|
} __attribute__ ((__packed__)) eid_record_hdr_t;
|
|
|
|
void eid_rec_hdr_init (eid_record_hdr_t * ptr);
|
|
|
|
#define EID_REC_CAST(h_) ((eid_record_hdr_t *)(h_))
|
|
#define EID_REC_MLEN(h_) EID_REC_CAST((h_))->eid_prefix_length
|
|
#define EID_REC_ADDR(h) (u8 *)(h) + sizeof(eid_record_hdr_t)
|
|
|
|
/* LISP Types */
|
|
typedef enum
|
|
{
|
|
NOT_LISP_MSG,
|
|
LISP_MAP_REQUEST = 1,
|
|
LISP_MAP_REPLY,
|
|
LISP_MAP_REGISTER,
|
|
LISP_MAP_NOTIFY,
|
|
LISP_INFO_NAT = 7,
|
|
LISP_ENCAP_CONTROL_TYPE = 8,
|
|
LISP_MSG_TYPES
|
|
} lisp_msg_type_e;
|
|
|
|
/*
|
|
* ENCAPSULATED CONTROL MESSAGE
|
|
*/
|
|
|
|
/*
|
|
* 0 1 2 3
|
|
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* / | IPv4 or IPv6 Header |
|
|
* OH | (uses RLOC addresses) |
|
|
* \ | |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* / | Source Port = xxxx | Dest Port = 4342 |
|
|
* UDP +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* \ | UDP Length | UDP Checksum |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* LH |Type=8 |S| Reserved |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* / | IPv4 or IPv6 Header |
|
|
* IH | (uses RLOC or EID addresses) |
|
|
* \ | |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* / | Source Port = xxxx | Dest Port = yyyy |
|
|
* UDP +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* \ | UDP Length | UDP Checksum |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* LCM | LISP Control Message |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
*/
|
|
|
|
|
|
/*
|
|
* Encapsulated control message header. This is followed by the IP
|
|
* header of the encapsulated LISP control message.
|
|
*
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* |Type=8 |S| Reserved |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
*/
|
|
|
|
typedef struct
|
|
{
|
|
#if CLIB_ARCH_IS_LITTLE_ENDIAN
|
|
u8 reserved:3;
|
|
u8 s_bit:1;
|
|
u8 type:4;
|
|
#else
|
|
u8 type:4;
|
|
u8 s_bit:1;
|
|
u8 reserved:3;
|
|
#endif
|
|
u8 reserved2[3];
|
|
} ecm_hdr_t;
|
|
|
|
char *ecm_hdr_to_char (ecm_hdr_t * h);
|
|
|
|
#define ECM_TYPE(h_) ((ecm_hdr_t *)(h_))->type
|
|
|
|
/*
|
|
* MAP-REQUEST MESSAGE
|
|
*/
|
|
|
|
/*
|
|
* Map-Request Message Format
|
|
*
|
|
* 0 1 2 3
|
|
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* |Type=1 |A|M|P|S|p|s| Reserved | IRC | Record Count |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | Nonce . . . |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | . . . Nonce |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | Source-EID-AFI | Source EID Address ... |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | ITR-RLOC-AFI 1 | ITR-RLOC Address 1 ... |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | ... |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | ITR-RLOC-AFI n | ITR-RLOC Address n ... |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* / | Reserved | EID mask-len | EID-prefix-AFI |
|
|
* Rec +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* \ | EID-prefix ... |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | Map-Reply Record ... |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | Mapping Protocol Data |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
*/
|
|
|
|
|
|
/*
|
|
* Fixed size portion of the map request. Variable size source EID
|
|
* address, originating ITR RLOC AFIs and addresses and then map
|
|
* request records follow.
|
|
*/
|
|
typedef struct
|
|
{
|
|
#if CLIB_ARCH_IS_LITTLE_ENDIAN
|
|
u8 solicit_map_request:1;
|
|
u8 rloc_probe:1;
|
|
u8 map_data_present:1;
|
|
u8 authoritative:1;
|
|
u8 type:4;
|
|
#else
|
|
u8 type:4;
|
|
u8 authoritative:1;
|
|
u8 map_data_present:1;
|
|
u8 rloc_probe:1;
|
|
u8 solicit_map_request:1;
|
|
#endif
|
|
#if CLIB_ARCH_IS_LITTLE_ENDIAN
|
|
u8 reserved1:6;
|
|
u8 smr_invoked:1;
|
|
u8 pitr:1;
|
|
#else
|
|
u8 pitr:1;
|
|
u8 smr_invoked:1;
|
|
u8 reserved1:6;
|
|
#endif
|
|
#if CLIB_ARCH_IS_LITTLE_ENDIAN
|
|
u8 additional_itr_rloc_count:5;
|
|
u8 reserved2:3;
|
|
#else
|
|
u8 reserved2:3;
|
|
u8 additional_itr_rloc_count:5;
|
|
#endif
|
|
u8 record_count;
|
|
u64 nonce;
|
|
} __attribute__ ((__packed__)) map_request_hdr_t;
|
|
|
|
void map_request_hdr_init (void *ptr);
|
|
char *map_request_hdr_to_char (map_request_hdr_t * h);
|
|
|
|
#define MREQ_TYPE(h_) (h_)->type
|
|
#define MREQ_HDR_CAST(h_) ((map_request_hdr_t *)(h_))
|
|
#define MREQ_REC_COUNT(h_) (MREQ_HDR_CAST(h_))->record_count
|
|
#define MREQ_RLOC_PROBE(h_) (MREQ_HDR_CAST(h_))->rloc_probe
|
|
#define MREQ_ITR_RLOC_COUNT(h_) (MREQ_HDR_CAST(h_))->additional_itr_rloc_count
|
|
#define MREQ_NONCE(h_) (MREQ_HDR_CAST(h_))->nonce
|
|
#define MREQ_SMR(h_) (MREQ_HDR_CAST(h_))->solicit_map_request
|
|
#define MREQ_SMR_INVOKED(h_) (MREQ_HDR_CAST(h_))->smr_invoked
|
|
|
|
/*
|
|
* MAP-REPLY MESSAGE
|
|
*/
|
|
|
|
/*
|
|
* Map-Reply Message Format
|
|
*
|
|
* 0 1 2 3
|
|
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* |Type=2 |P|E|S| Reserved | Record Count |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | Nonce . . . |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | . . . Nonce |
|
|
* +-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | | Record TTL |
|
|
* | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* R | Locator Count | EID mask-len | ACT |A| Reserved |
|
|
* e +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* c | Rsvd | Map-Version Number | EID-AFI |
|
|
* o +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* r | EID-prefix |
|
|
* d +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | /| Priority | Weight | M Priority | M Weight |
|
|
* | L +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | o | Unused Flags |L|p|R| Loc-AFI |
|
|
* | c +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | \| Locator |
|
|
* +-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | Mapping Protocol Data |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
*/
|
|
|
|
/*
|
|
* Fixed size portion of the map reply.
|
|
*/
|
|
typedef struct
|
|
{
|
|
#if CLIB_ARCH_IS_LITTLE_ENDIAN
|
|
u8 reserved1:1;
|
|
u8 security:1;
|
|
u8 echo_nonce:1;
|
|
u8 rloc_probe:1;
|
|
u8 type:4;
|
|
#else
|
|
u8 type:4;
|
|
u8 rloc_probe:1;
|
|
u8 echo_nonce:1;
|
|
u8 security:1;
|
|
u8 reserved1:1;
|
|
#endif
|
|
u8 reserved2;
|
|
u8 reserved3;
|
|
u8 record_count;
|
|
u64 nonce;
|
|
} __attribute__ ((__packed__)) map_reply_hdr_t;
|
|
|
|
void map_reply_hdr_init (void *ptr);
|
|
char *map_reply_hdr_to_char (map_reply_hdr_t * h);
|
|
|
|
#define MREP_TYPE(h_) MREP_HDR_CAST(h_)->type
|
|
#define MREP_HDR_CAST(h_) ((map_reply_hdr_t *)(h_))
|
|
#define MREP_REC_COUNT(h_) MREP_HDR_CAST(h_)->record_count
|
|
#define MREP_RLOC_PROBE(h_) MREP_HDR_CAST(h_)->rloc_probe
|
|
#define MREP_NONCE(h_) MREP_HDR_CAST(h_)->nonce
|
|
|
|
|
|
always_inline lisp_msg_type_e
|
|
lisp_msg_type (void *b)
|
|
{
|
|
ecm_hdr_t *hdr = b;
|
|
if (!hdr)
|
|
{
|
|
return (NOT_LISP_MSG);
|
|
}
|
|
return (hdr->type);
|
|
}
|
|
|
|
always_inline void
|
|
increment_record_count (void *b)
|
|
{
|
|
switch (lisp_msg_type (b))
|
|
{
|
|
case LISP_MAP_REQUEST:
|
|
MREQ_REC_COUNT (b) += 1;
|
|
break;
|
|
case LISP_MAP_REPLY:
|
|
MREP_REC_COUNT (b) += 1;
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
* LOCATOR FIELD
|
|
*
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* /| Priority | Weight | M Priority | M Weight |
|
|
* L +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* o | Unused Flags |L|p|R| Loc-AFI |
|
|
* c +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* \| Locator |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
*
|
|
* Fixed portion of the mapping record locator. Variable length
|
|
* locator address follows.
|
|
*/
|
|
typedef struct _locator_hdr
|
|
{
|
|
u8 priority;
|
|
u8 weight;
|
|
u8 mpriority;
|
|
u8 mweight;
|
|
u8 unused1;
|
|
#ifdef CLIB_ARCH_IS_LITTLE_ENDIAN
|
|
u8 reachable:1;
|
|
u8 probed:1;
|
|
u8 local:1;
|
|
u8 unused2:5;
|
|
#else
|
|
u8 unused2:5;
|
|
u8 local:1;
|
|
u8 probed:1;
|
|
u8 reachable:1;
|
|
#endif
|
|
} __attribute__ ((__packed__)) locator_hdr_t;
|
|
|
|
#define LOC_CAST(h_) ((locator_hdr_t *)(h_))
|
|
#define LOC_PROBED(h_) LOC_CAST(h_)->probed
|
|
#define LOC_PRIORITY(h_) LOC_CAST(h_)->priority
|
|
#define LOC_WEIGHT(h_) LOC_CAST(h_)->weight
|
|
#define LOC_MPRIORITY(h_) LOC_CAST(h_)->mpriority
|
|
#define LOC_MWEIGHT(h_) LOC_CAST(h_)->mweight
|
|
#define LOC_REACHABLE(h_) LOC_CAST(h_)->reachable
|
|
#define LOC_LOCAL(h_) LOC_CAST(h_)->local
|
|
#define LOC_ADDR(h_) ((u8 *)(h_) + sizeof(locator_hdr_t))
|
|
|
|
/*
|
|
* MAPPING RECORD
|
|
*
|
|
* Mapping record used in all LISP control messages.
|
|
*
|
|
* +---> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | | Record TTL |
|
|
* | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* R | Locator Count | EID mask-len | ACT |A| Reserved |
|
|
* e +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* c | Rsvd | Map-Version Number | EID-AFI |
|
|
* o +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* r | EID-prefix |
|
|
* d +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | /| Priority | Weight | M Priority | M Weight |
|
|
* | / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | Loc | Unused Flags |L|p|R| Loc-AFI |
|
|
* | \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | \| Locator |
|
|
* +---> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
*/
|
|
|
|
/*
|
|
* Fixed portion of the mapping record. EID prefix address and
|
|
* locators follow.
|
|
*/
|
|
|
|
typedef struct _mapping_record_hdr_t
|
|
{
|
|
u32 ttl;
|
|
u8 locator_count;
|
|
u8 eid_prefix_length;
|
|
#ifdef CLIB_ARCH_IS_LITTLE_ENDIAN
|
|
u8 reserved1:4;
|
|
u8 authoritative:1;
|
|
u8 action:3;
|
|
#else
|
|
u8 action:3;
|
|
u8 authoritative:1;
|
|
u8 reserved1:4;
|
|
#endif
|
|
u8 reserved2;
|
|
#ifdef CLIB_ARCH_IS_LITTLE_ENDIAN
|
|
u8 version_hi:4;
|
|
u8 reserved3:4;
|
|
#else
|
|
u8 reserved3:4;
|
|
u8 version_hi:4;
|
|
#endif
|
|
u8 version_low;
|
|
} __attribute__ ((__packed__)) mapping_record_hdr_t;
|
|
|
|
void mapping_record_init_hdr (mapping_record_hdr_t * h);
|
|
|
|
#define MAP_REC_EID_PLEN(h) ((mapping_record_hdr_t *)(h))->eid_prefix_length
|
|
#define MAP_REC_LOC_COUNT(h) ((mapping_record_hdr_t *)(h))->locator_count
|
|
#define MAP_REC_ACTION(h) ((mapping_record_hdr_t *)(h))->action
|
|
#define MAP_REC_AUTH(h) ((mapping_record_hdr_t *)(h))->authoritative
|
|
#define MAP_REC_TTL(h) ((mapping_record_hdr_t *)(h))->ttl
|
|
#define MAP_REC_EID(h) (u8 *)(h)+sizeof(mapping_record_hdr_t)
|
|
#define MAP_REC_VERSION(h) (h)->version_hi << 8 | (h)->version_low
|
|
|
|
typedef enum
|
|
{
|
|
LISP_NO_ACTION,
|
|
LISP_FORWARD_NATIVE,
|
|
LISP_SEND_MAP_REQUEST,
|
|
LISP_DROP
|
|
} lisp_action_e;
|
|
|
|
typedef enum lisp_authoritative
|
|
{
|
|
A_NO_AUTHORITATIVE = 0,
|
|
A_AUTHORITATIVE
|
|
} lisp_authoritative_e;
|
|
|
|
/*
|
|
* LISP Canonical Address Format Encodings
|
|
*
|
|
* 0 1 2 3
|
|
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | AFI = 16387 | Rsvd1 | Flags |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | Type | Rsvd2 | Length |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
*/
|
|
|
|
typedef struct _lcaf_hdr_t
|
|
{
|
|
u8 reserved1;
|
|
u8 flags;
|
|
u8 type;
|
|
u8 reserved2;
|
|
u16 len;
|
|
} __attribute__ ((__packed__)) lcaf_hdr_t;
|
|
|
|
#define LCAF_TYPE(h) ((lcaf_hdr_t *)(h))->type
|
|
#define LCAF_LENGTH(h) ((lcaf_hdr_t *)(h))->len
|
|
#define LCAF_RES2(h) ((lcaf_hdr_t *)(h))->reserved2
|
|
#define LCAF_FLAGS(h) ((lcaf_hdr_t *)(h))->flags
|
|
#define LCAF_PAYLOAD(h) (u8 *)(h)+sizeof(lcaf_hdr_t)
|
|
|
|
/*
|
|
* Source/Dest Key Canonical Address Format:
|
|
*
|
|
* 0 1 2 3
|
|
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | Reserved | Source-ML | Dest-ML |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
*/
|
|
typedef struct _lcaf_src_dst_hdr_t
|
|
{
|
|
u16 reserved;
|
|
u8 src_mask_len;
|
|
u8 dst_mask_len;
|
|
} __attribute__ ((__packed__)) lcaf_src_dst_hdr_t;
|
|
|
|
#define LCAF_SD_SRC_ML(_h) (_h)->src_mask_len
|
|
#define LCAF_SD_DST_ML(_h) (_h)->dst_mask_len
|
|
|
|
/*
|
|
* SPI LCAF
|
|
*
|
|
* 0 1 2 3
|
|
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | Service Path ID | Service index |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
*/
|
|
typedef struct _lcaf_spi_hdr_t
|
|
{
|
|
u32 spi_si;
|
|
} __attribute__ ((__packed__)) lcaf_spi_hdr_t;
|
|
|
|
#define LCAF_SPI_SI(_h) (_h)->spi_si
|
|
|
|
/*
|
|
* The Map-Register message format is:
|
|
*
|
|
* 0 1 2 3
|
|
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* |Type=3 |P| Reserved |M| Record Count |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | Nonce . . . |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | . . . Nonce |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | Key ID | Authentication Data Length |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* ~ Authentication Data ~
|
|
* +-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | | Record TTL |
|
|
* | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* R | Locator Count | EID mask-len | ACT |A| Reserved |
|
|
* e +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* c | Rsvd | Map-Version Number | EID-Prefix-AFI |
|
|
* o +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* r | EID-Prefix |
|
|
* d +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | /| Priority | Weight | M Priority | M Weight |
|
|
* | L +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | o | Unused Flags |L|p|R| Loc-AFI |
|
|
* | c +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | \| Locator |
|
|
* +-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
*/
|
|
typedef struct
|
|
{
|
|
#if CLIB_ARCH_IS_LITTLE_ENDIAN
|
|
u8 res1:3;
|
|
u8 proxy_map_reply:1;
|
|
u8 type:4;
|
|
#else
|
|
u8 type:4;
|
|
u8 proxy_map_reply:1;
|
|
u8 res1:3;
|
|
#endif
|
|
|
|
u8 res2;
|
|
|
|
#if CLIB_ARCH_IS_LITTLE_ENDIAN
|
|
u8 want_map_notify:1;
|
|
u8 res3:7;
|
|
#else
|
|
u8 res3:7;
|
|
u8 want_map_notify:1;
|
|
#endif
|
|
|
|
u8 record_count;
|
|
u64 nonce;
|
|
u16 key_id;
|
|
u16 auth_data_len;
|
|
u8 data[0];
|
|
} __attribute__ ((__packed__)) map_register_hdr_t;
|
|
|
|
#define MREG_TYPE(h_) (h_)->type
|
|
#define MREG_HDR_CAST(h_) ((map_register_hdr_t *)(h_))
|
|
#define MREG_PROXY_MR(h_) (MREG_HDR_CAST(h_))->proxy_map_reply
|
|
#define MREG_WANT_MAP_NOTIFY(h_) (MREG_HDR_CAST(h_))->want_map_notify
|
|
#define MREG_REC_COUNT(h_) (MREG_HDR_CAST(h_))->record_count
|
|
#define MREG_NONCE(h_) (MREG_HDR_CAST(h_))->nonce
|
|
#define MREG_KEY_ID(h_) (MREG_HDR_CAST(h_))->key_id
|
|
#define MREG_AUTH_DATA_LEN(h_) (MREG_HDR_CAST(h_))->auth_data_len
|
|
#define MREG_DATA(h_) (MREG_HDR_CAST(h_))->data
|
|
|
|
/*
|
|
* The Map-Notify message format is:
|
|
*
|
|
* 0 1 2 3
|
|
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* |Type=4 | Reserved | Record Count |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | Nonce . . . |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | . . . Nonce |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | Key ID | Authentication Data Length |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* ~ Authentication Data ~
|
|
* +-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | | Record TTL |
|
|
* | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* R | Locator Count | EID mask-len | ACT |A| Reserved |
|
|
* e +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* c | Rsvd | Map-Version Number | EID-Prefix-AFI |
|
|
* o +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* r | EID-Prefix |
|
|
* d +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | /| Priority | Weight | M Priority | M Weight |
|
|
* | L +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | o | Unused Flags |L|p|R| Loc-AFI |
|
|
* | c +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | \| Locator |
|
|
* +-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
*/
|
|
|
|
typedef struct
|
|
{
|
|
#if CLIB_ARCH_IS_LITTLE_ENDIAN
|
|
u8 res1:4;
|
|
u8 type:4;
|
|
#else
|
|
u8 type:4;
|
|
u8 res1:4;
|
|
#endif
|
|
|
|
u16 res2;
|
|
|
|
u8 record_count;
|
|
u64 nonce;
|
|
u16 key_id;
|
|
u16 auth_data_len;
|
|
u8 data[0];
|
|
} __attribute__ ((__packed__)) map_notify_hdr_t;
|
|
|
|
#define MNOTIFY_TYPE(h_) (h_)->type
|
|
#define MNOTIFY_HDR_CAST(h_) ((map_register_hdr_t *)(h_))
|
|
#define MNOTIFY_REC_COUNT(h_) (MREG_HDR_CAST(h_))->record_count
|
|
#define MNOTIFY_NONCE(h_) (MREG_HDR_CAST(h_))->nonce
|
|
#define MNOTIFY_KEY_ID(h_) (MREG_HDR_CAST(h_))->key_id
|
|
#define MNOTIFY_AUTH_DATA_LEN(h_) (MREG_HDR_CAST(h_))->auth_data_len
|
|
#define MNOTIFY_DATA(h_) (MREG_HDR_CAST(h_))->data
|
|
|
|
/*
|
|
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* |Ver|O|C|R|R|R|R|R|R| Length | MD type=0x1 | Next Protocol |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | Service Path Identifer | Service Index |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
*/
|
|
|
|
typedef struct
|
|
{
|
|
u32 header;
|
|
u32 spi_si;
|
|
} __attribute__ ((__packed__)) lisp_nsh_hdr_t;
|
|
|
|
#endif /* VNET_LISP_GPE_LISP_CP_MESSAGES_H_ */
|
|
|
|
/*
|
|
* fd.io coding-style-patch-verification: ON
|
|
*
|
|
* Local Variables:
|
|
* eval: (c-set-style "gnu")
|
|
* End:
|
|
*/
|