LCOV - code coverage report
Current view: top level - plugins/lisp/lisp-cp - lisp_cp_messages.h (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 0 15 0.0 %
Date: 2023-07-05 22:20:52 Functions: 0 2 0.0 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2016 Cisco and/or its affiliates.
       3             :  * Licensed under the Apache License, Version 2.0 (the "License");
       4             :  * you may not use this file except in compliance with the License.
       5             :  * You may obtain a copy of the License at:
       6             :  *
       7             :  *     http://www.apache.org/licenses/LICENSE-2.0
       8             :  *
       9             :  * Unless required by applicable law or agreed to in writing, software
      10             :  * distributed under the License is distributed on an "AS IS" BASIS,
      11             :  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      12             :  * See the License for the specific language governing permissions and
      13             :  * limitations under the License.
      14             :  */
      15             : 
      16             : #ifndef VNET_LISP_GPE_LISP_CP_MESSAGES_H_
      17             : #define VNET_LISP_GPE_LISP_CP_MESSAGES_H_
      18             : 
      19             : #include <vnet/vnet.h>
      20             : 
      21             : #define MAX_IP_PKT_LEN 4096
      22             : #define MAX_IP_HDR_LEN 40       /* without options or IPv6 hdr extensions */
      23             : #define UDP_HDR_LEN 8
      24             : #define LISP_DATA_HDR_LEN 8
      25             : #define LISP_ECM_HDR_LEN 4
      26             : #define MAX_LISP_MSG_ENCAP_LEN  2*(MAX_IP_HDR_LEN + UDP_HDR_LEN)+ LISP_ECM_HDR_LEN
      27             : #define MAX_LISP_PKT_ENCAP_LEN  MAX_IP_HDR_LEN + UDP_HDR_LEN + LISP_DATA_HDR_LEN
      28             : 
      29             : #define LISP_CONTROL_PORT 4342
      30             : 
      31             : /*
      32             :  * EID RECORD FIELD
      33             :  */
      34             : 
      35             : /*
      36             :  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      37             :  *    / |   Reserved    | EID mask-len  |        EID-prefix-AFI         |
      38             :  *  Rec +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      39             :  *    \ |                       EID-prefix  ...                         |
      40             :  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      41             :  */
      42             : 
      43             : 
      44             : typedef struct _eid_prefix_record_hdr
      45             : {
      46             :   u8 reserved;
      47             :   u8 eid_prefix_length;
      48             : } __attribute__ ((__packed__)) eid_record_hdr_t;
      49             : 
      50             : void eid_rec_hdr_init (eid_record_hdr_t * ptr);
      51             : 
      52             : #define EID_REC_CAST(h_) ((eid_record_hdr_t *)(h_))
      53             : #define EID_REC_MLEN(h_) EID_REC_CAST((h_))->eid_prefix_length
      54             : #define EID_REC_ADDR(h) (u8 *)(h) + sizeof(eid_record_hdr_t)
      55             : 
      56             : /* LISP Types */
      57             : typedef enum
      58             : {
      59             :   NOT_LISP_MSG,
      60             :   LISP_MAP_REQUEST = 1,
      61             :   LISP_MAP_REPLY,
      62             :   LISP_MAP_REGISTER,
      63             :   LISP_MAP_NOTIFY,
      64             :   LISP_INFO_NAT = 7,
      65             :   LISP_ENCAP_CONTROL_TYPE = 8,
      66             :   LISP_MSG_TYPES
      67             : } lisp_msg_type_e;
      68             : 
      69             : /*
      70             :  * ENCAPSULATED CONTROL MESSAGE
      71             :  */
      72             : 
      73             : /*
      74             :  *     0                   1                   2                   3
      75             :  *     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
      76             :  *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      77             :  *   / |                       IPv4 or IPv6 Header                     |
      78             :  * OH  |                      (uses RLOC addresses)                    |
      79             :  *   \ |                                                               |
      80             :  *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      81             :  *   / |       Source Port = xxxx      |       Dest Port = 4342        |
      82             :  * UDP +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      83             :  *   \ |           UDP Length          |        UDP Checksum           |
      84             :  *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      85             :  * LH  |Type=8 |S|                  Reserved                           |
      86             :  *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      87             :  *   / |                       IPv4 or IPv6 Header                     |
      88             :  * IH  |                  (uses RLOC or EID addresses)                 |
      89             :  *   \ |                                                               |
      90             :  *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      91             :  *   / |       Source Port = xxxx      |       Dest Port = yyyy        |
      92             :  * UDP +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      93             :  *   \ |           UDP Length          |        UDP Checksum           |
      94             :  *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      95             :  * LCM |                      LISP Control Message                     |
      96             :  *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      97             :  */
      98             : 
      99             : 
     100             : /*
     101             :  * Encapsulated control message header. This is followed by the IP
     102             :  * header of the encapsulated LISP control message.
     103             :  *
     104             :  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     105             :  *    |Type=8 |S|                 Reserved                            |
     106             :  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     107             :  */
     108             : 
     109             : typedef struct
     110             : {
     111             : #if CLIB_ARCH_IS_LITTLE_ENDIAN
     112             :   u8 reserved:3;
     113             :   u8 s_bit:1;
     114             :   u8 type:4;
     115             : #else
     116             :   u8 type:4;
     117             :   u8 s_bit:1;
     118             :   u8 reserved:3;
     119             : #endif
     120             :   u8 reserved2[3];
     121             : } ecm_hdr_t;
     122             : 
     123             : char *ecm_hdr_to_char (ecm_hdr_t * h);
     124             : 
     125             : #define ECM_TYPE(h_) ((ecm_hdr_t *)(h_))->type
     126             : 
     127             : /*
     128             :  * MAP-REQUEST MESSAGE
     129             :  */
     130             : 
     131             : /*
     132             :  * Map-Request Message Format
     133             :  *
     134             :  *       0                   1                   2                   3
     135             :  *       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
     136             :  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     137             :  *      |Type=1 |A|M|P|S|p|s|    Reserved     |   IRC   | Record Count  |
     138             :  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     139             :  *      |                         Nonce . . .                           |
     140             :  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     141             :  *      |                         . . . Nonce                           |
     142             :  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     143             :  *      |         Source-EID-AFI        |   Source EID Address  ...     |
     144             :  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     145             :  *      |         ITR-RLOC-AFI 1        |    ITR-RLOC Address 1  ...    |
     146             :  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     147             :  *      |                              ...                              |
     148             :  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     149             :  *      |         ITR-RLOC-AFI n        |    ITR-RLOC Address n  ...    |
     150             :  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     151             :  *    / |   Reserved    | EID mask-len  |        EID-prefix-AFI         |
     152             :  *  Rec +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     153             :  *    \ |                       EID-prefix  ...                         |
     154             :  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     155             :  *      |                   Map-Reply Record  ...                       |
     156             :  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     157             :  *      |                     Mapping Protocol Data                     |
     158             :  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     159             :  */
     160             : 
     161             : 
     162             : /*
     163             :  * Fixed size portion of the map request. Variable size source EID
     164             :  * address, originating ITR RLOC AFIs and addresses and then map
     165             :  * request records follow.
     166             :  */
     167             : typedef struct
     168             : {
     169             : #if CLIB_ARCH_IS_LITTLE_ENDIAN
     170             :   u8 solicit_map_request:1;
     171             :   u8 rloc_probe:1;
     172             :   u8 map_data_present:1;
     173             :   u8 authoritative:1;
     174             :   u8 type:4;
     175             : #else
     176             :   u8 type:4;
     177             :   u8 authoritative:1;
     178             :   u8 map_data_present:1;
     179             :   u8 rloc_probe:1;
     180             :   u8 solicit_map_request:1;
     181             : #endif
     182             : #if CLIB_ARCH_IS_LITTLE_ENDIAN
     183             :   u8 reserved1:6;
     184             :   u8 smr_invoked:1;
     185             :   u8 pitr:1;
     186             : #else
     187             :   u8 pitr:1;
     188             :   u8 smr_invoked:1;
     189             :   u8 reserved1:6;
     190             : #endif
     191             : #if CLIB_ARCH_IS_LITTLE_ENDIAN
     192             :   u8 additional_itr_rloc_count:5;
     193             :   u8 reserved2:3;
     194             : #else
     195             :   u8 reserved2:3;
     196             :   u8 additional_itr_rloc_count:5;
     197             : #endif
     198             :   u8 record_count;
     199             :   u64 nonce;
     200             : } __attribute__ ((__packed__)) map_request_hdr_t;
     201             : 
     202             : void map_request_hdr_init (void *ptr);
     203             : char *map_request_hdr_to_char (map_request_hdr_t * h);
     204             : 
     205             : #define MREQ_TYPE(h_) (h_)->type
     206             : #define MREQ_HDR_CAST(h_) ((map_request_hdr_t *)(h_))
     207             : #define MREQ_REC_COUNT(h_) (MREQ_HDR_CAST(h_))->record_count
     208             : #define MREQ_RLOC_PROBE(h_) (MREQ_HDR_CAST(h_))->rloc_probe
     209             : #define MREQ_ITR_RLOC_COUNT(h_) (MREQ_HDR_CAST(h_))->additional_itr_rloc_count
     210             : #define MREQ_NONCE(h_) (MREQ_HDR_CAST(h_))->nonce
     211             : #define MREQ_SMR(h_) (MREQ_HDR_CAST(h_))->solicit_map_request
     212             : #define MREQ_SMR_INVOKED(h_) (MREQ_HDR_CAST(h_))->smr_invoked
     213             : 
     214             : /*
     215             :  * MAP-REPLY MESSAGE
     216             :  */
     217             : 
     218             :  /*
     219             :   * Map-Reply Message Format
     220             :   *
     221             :   *       0                   1                   2                   3
     222             :   *       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
     223             :   *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     224             :   *      |Type=2 |P|E|S|         Reserved                | Record Count  |
     225             :   *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     226             :   *      |                         Nonce . . .                           |
     227             :   *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     228             :   *      |                         . . . Nonce                           |
     229             :   *  +-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     230             :   *  |   |                          Record  TTL                          |
     231             :   *  |   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     232             :   *  R   | Locator Count | EID mask-len  | ACT |A|      Reserved         |
     233             :   *  e   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     234             :   *  c   | Rsvd  |  Map-Version Number   |            EID-AFI            |
     235             :   *  o   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     236             :   *  r   |                          EID-prefix                           |
     237             :   *  d   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     238             :   *  |  /|    Priority   |    Weight     |  M Priority   |   M Weight    |
     239             :   *  | L +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     240             :   *  | o |        Unused Flags     |L|p|R|           Loc-AFI             |
     241             :   *  | c +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     242             :   *  |  \|                            Locator                            |
     243             :   *  +-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     244             :   *      |                     Mapping Protocol Data                     |
     245             :   *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     246             :   */
     247             : 
     248             :  /*
     249             :   * Fixed size portion of the map reply.
     250             :   */
     251             : typedef struct
     252             : {
     253             : #if CLIB_ARCH_IS_LITTLE_ENDIAN
     254             :   u8 reserved1:1;
     255             :   u8 security:1;
     256             :   u8 echo_nonce:1;
     257             :   u8 rloc_probe:1;
     258             :   u8 type:4;
     259             : #else
     260             :   u8 type:4;
     261             :   u8 rloc_probe:1;
     262             :   u8 echo_nonce:1;
     263             :   u8 security:1;
     264             :   u8 reserved1:1;
     265             : #endif
     266             :   u8 reserved2;
     267             :   u8 reserved3;
     268             :   u8 record_count;
     269             :   u64 nonce;
     270             : } __attribute__ ((__packed__)) map_reply_hdr_t;
     271             : 
     272             : void map_reply_hdr_init (void *ptr);
     273             : char *map_reply_hdr_to_char (map_reply_hdr_t * h);
     274             : 
     275             : #define MREP_TYPE(h_) MREP_HDR_CAST(h_)->type
     276             : #define MREP_HDR_CAST(h_) ((map_reply_hdr_t *)(h_))
     277             : #define MREP_REC_COUNT(h_) MREP_HDR_CAST(h_)->record_count
     278             : #define MREP_RLOC_PROBE(h_) MREP_HDR_CAST(h_)->rloc_probe
     279             : #define MREP_NONCE(h_) MREP_HDR_CAST(h_)->nonce
     280             : 
     281             : 
     282             : always_inline lisp_msg_type_e
     283           0 : lisp_msg_type (void *b)
     284             : {
     285           0 :   ecm_hdr_t *hdr = b;
     286           0 :   if (!hdr)
     287             :     {
     288           0 :       return (NOT_LISP_MSG);
     289             :     }
     290           0 :   return (hdr->type);
     291             : }
     292             : 
     293             : always_inline void
     294           0 : increment_record_count (void *b)
     295             : {
     296           0 :   switch (lisp_msg_type (b))
     297             :     {
     298           0 :     case LISP_MAP_REQUEST:
     299           0 :       MREQ_REC_COUNT (b) += 1;
     300           0 :       break;
     301           0 :     case LISP_MAP_REPLY:
     302           0 :       MREP_REC_COUNT (b) += 1;
     303           0 :       break;
     304           0 :     default:
     305           0 :       return;
     306             :     }
     307             : }
     308             : 
     309             : 
     310             : /*
     311             :  * LOCATOR FIELD
     312             :  *
     313             :  *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     314             :  *    /|    Priority   |    Weight     |  M Priority   |   M Weight    |
     315             :  *   L +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     316             :  *   o |        Unused Flags     |L|p|R|           Loc-AFI             |
     317             :  *   c +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     318             :  *    \|                            Locator                            |
     319             :  *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     320             :  *
     321             :  * Fixed portion of the mapping record locator. Variable length
     322             :  * locator address follows.
     323             :  */
     324             : typedef struct _locator_hdr
     325             : {
     326             :   u8 priority;
     327             :   u8 weight;
     328             :   u8 mpriority;
     329             :   u8 mweight;
     330             :   u8 unused1;
     331             : #ifdef CLIB_ARCH_IS_LITTLE_ENDIAN
     332             :   u8 reachable:1;
     333             :   u8 probed:1;
     334             :   u8 local:1;
     335             :   u8 unused2:5;
     336             : #else
     337             :   u8 unused2:5;
     338             :   u8 local:1;
     339             :   u8 probed:1;
     340             :   u8 reachable:1;
     341             : #endif
     342             : } __attribute__ ((__packed__)) locator_hdr_t;
     343             : 
     344             : #define LOC_CAST(h_) ((locator_hdr_t *)(h_))
     345             : #define LOC_PROBED(h_) LOC_CAST(h_)->probed
     346             : #define LOC_PRIORITY(h_) LOC_CAST(h_)->priority
     347             : #define LOC_WEIGHT(h_) LOC_CAST(h_)->weight
     348             : #define LOC_MPRIORITY(h_) LOC_CAST(h_)->mpriority
     349             : #define LOC_MWEIGHT(h_) LOC_CAST(h_)->mweight
     350             : #define LOC_REACHABLE(h_) LOC_CAST(h_)->reachable
     351             : #define LOC_LOCAL(h_) LOC_CAST(h_)->local
     352             : #define LOC_ADDR(h_) ((u8 *)(h_)  + sizeof(locator_hdr_t))
     353             : 
     354             : /*
     355             :  * MAPPING RECORD
     356             :  *
     357             :  * Mapping record used in all LISP control messages.
     358             :  *
     359             :  *  +--->  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     360             :  *  |      |                          Record  TTL                          |
     361             :  *  |      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     362             :  *  R      | Locator Count | EID mask-len  | ACT |A|       Reserved        |
     363             :  *  e      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     364             :  *  c      | Rsvd  |  Map-Version Number   |            EID-AFI            |
     365             :  *  o      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     366             :  *  r      |                          EID-prefix                           |
     367             :  *  d      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     368             :  *  |     /|    Priority   |    Weight     |  M Priority   |   M Weight    |
     369             :  *  |    / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     370             :  *  |  Loc |         Unused Flags    |L|p|R|           Loc-AFI             |
     371             :  *  |    \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     372             :  *  |     \|                             Locator                           |
     373             :  *  +--->  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     374             :  */
     375             : 
     376             : /*
     377             :  * Fixed portion of the mapping record. EID prefix address and
     378             :  * locators follow.
     379             :  */
     380             : 
     381             : typedef struct _mapping_record_hdr_t
     382             : {
     383             :   u32 ttl;
     384             :   u8 locator_count;
     385             :   u8 eid_prefix_length;
     386             : #ifdef CLIB_ARCH_IS_LITTLE_ENDIAN
     387             :   u8 reserved1:4;
     388             :   u8 authoritative:1;
     389             :   u8 action:3;
     390             : #else
     391             :   u8 action:3;
     392             :   u8 authoritative:1;
     393             :   u8 reserved1:4;
     394             : #endif
     395             :   u8 reserved2;
     396             : #ifdef CLIB_ARCH_IS_LITTLE_ENDIAN
     397             :   u8 version_hi:4;
     398             :   u8 reserved3:4;
     399             : #else
     400             :   u8 reserved3:4;
     401             :   u8 version_hi:4;
     402             : #endif
     403             :   u8 version_low;
     404             : } __attribute__ ((__packed__)) mapping_record_hdr_t;
     405             : 
     406             : void mapping_record_init_hdr (mapping_record_hdr_t * h);
     407             : 
     408             : #define MAP_REC_EID_PLEN(h) ((mapping_record_hdr_t *)(h))->eid_prefix_length
     409             : #define MAP_REC_LOC_COUNT(h) ((mapping_record_hdr_t *)(h))->locator_count
     410             : #define MAP_REC_ACTION(h) ((mapping_record_hdr_t *)(h))->action
     411             : #define MAP_REC_AUTH(h) ((mapping_record_hdr_t *)(h))->authoritative
     412             : #define MAP_REC_TTL(h) ((mapping_record_hdr_t *)(h))->ttl
     413             : #define MAP_REC_EID(h) (u8 *)(h)+sizeof(mapping_record_hdr_t)
     414             : #define MAP_REC_VERSION(h) (h)->version_hi << 8 | (h)->version_low
     415             : 
     416             : typedef enum
     417             : {
     418             :   LISP_NO_ACTION,
     419             :   LISP_FORWARD_NATIVE,
     420             :   LISP_SEND_MAP_REQUEST,
     421             :   LISP_DROP
     422             : } lisp_action_e;
     423             : 
     424             : typedef enum lisp_authoritative
     425             : {
     426             :   A_NO_AUTHORITATIVE = 0,
     427             :   A_AUTHORITATIVE
     428             : } lisp_authoritative_e;
     429             : 
     430             : /*
     431             :  * LISP Canonical Address Format Encodings
     432             :  *
     433             :  *   0                   1                   2                   3
     434             :  *   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
     435             :  *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     436             :  *  |           AFI = 16387         |     Rsvd1     |     Flags     |
     437             :  *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     438             :  *  |    Type       |     Rsvd2     |            Length             |
     439             :  *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     440             :  */
     441             : 
     442             : typedef struct _lcaf_hdr_t
     443             : {
     444             :   u8 reserved1;
     445             :   u8 flags;
     446             :   u8 type;
     447             :   u8 reserved2;
     448             :   u16 len;
     449             : } __attribute__ ((__packed__)) lcaf_hdr_t;
     450             : 
     451             : #define LCAF_TYPE(h) ((lcaf_hdr_t *)(h))->type
     452             : #define LCAF_LENGTH(h) ((lcaf_hdr_t *)(h))->len
     453             : #define LCAF_RES2(h) ((lcaf_hdr_t *)(h))->reserved2
     454             : #define LCAF_FLAGS(h) ((lcaf_hdr_t *)(h))->flags
     455             : #define LCAF_PAYLOAD(h) (u8 *)(h)+sizeof(lcaf_hdr_t)
     456             : 
     457             : /*
     458             :  * Source/Dest Key Canonical Address Format:
     459             :  *
     460             :  *   0                   1                   2                   3
     461             :  *   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
     462             :  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     463             :  *   |            Reserved           |   Source-ML   |    Dest-ML    |
     464             :  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     465             :  */
     466             : typedef struct _lcaf_src_dst_hdr_t
     467             : {
     468             :   u16 reserved;
     469             :   u8 src_mask_len;
     470             :   u8 dst_mask_len;
     471             : } __attribute__ ((__packed__)) lcaf_src_dst_hdr_t;
     472             : 
     473             : #define LCAF_SD_SRC_ML(_h) (_h)->src_mask_len
     474             : #define LCAF_SD_DST_ML(_h) (_h)->dst_mask_len
     475             : 
     476             : /*
     477             :  * SPI LCAF
     478             :  *
     479             :  *    0                   1                   2                   3
     480             :  *    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
     481             :  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     482             :  *   |              Service Path ID                  | Service index |
     483             :  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     484             :  */
     485             : typedef struct _lcaf_spi_hdr_t
     486             : {
     487             :   u32 spi_si;
     488             : } __attribute__ ((__packed__)) lcaf_spi_hdr_t;
     489             : 
     490             : #define LCAF_SPI_SI(_h) (_h)->spi_si
     491             : 
     492             : /*
     493             :  * The Map-Register message format is:
     494             :  *
     495             :  *       0                   1                   2                   3
     496             :  *       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
     497             :  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     498             :  *      |Type=3 |P|            Reserved               |M| Record Count  |
     499             :  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     500             :  *      |                         Nonce . . .                           |
     501             :  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     502             :  *      |                         . . . Nonce                           |
     503             :  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     504             :  *      |            Key ID             |  Authentication Data Length   |
     505             :  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     506             :  *      ~                     Authentication Data                       ~
     507             :  *  +-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     508             :  *  |   |                          Record TTL                           |
     509             :  *  |   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     510             :  *  R   | Locator Count | EID mask-len  | ACT |A|      Reserved         |
     511             :  *  e   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     512             :  *  c   | Rsvd  |  Map-Version Number   |        EID-Prefix-AFI         |
     513             :  *  o   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     514             :  *  r   |                          EID-Prefix                           |
     515             :  *  d   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     516             :  *  |  /|    Priority   |    Weight     |  M Priority   |   M Weight    |
     517             :  *  | L +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     518             :  *  | o |        Unused Flags     |L|p|R|           Loc-AFI             |
     519             :  *  | c +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     520             :  *  |  \|                             Locator                           |
     521             :  *  +-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     522             :  */
     523             : typedef struct
     524             : {
     525             : #if CLIB_ARCH_IS_LITTLE_ENDIAN
     526             :   u8 res1:3;
     527             :   u8 proxy_map_reply:1;
     528             :   u8 type:4;
     529             : #else
     530             :   u8 type:4;
     531             :   u8 proxy_map_reply:1;
     532             :   u8 res1:3;
     533             : #endif
     534             : 
     535             :   u8 res2;
     536             : 
     537             : #if CLIB_ARCH_IS_LITTLE_ENDIAN
     538             :   u8 want_map_notify:1;
     539             :   u8 res3:7;
     540             : #else
     541             :   u8 res3:7;
     542             :   u8 want_map_notify:1;
     543             : #endif
     544             : 
     545             :   u8 record_count;
     546             :   u64 nonce;
     547             :   u16 key_id;
     548             :   u16 auth_data_len;
     549             :   u8 data[0];
     550             : } __attribute__ ((__packed__)) map_register_hdr_t;
     551             : 
     552             : #define MREG_TYPE(h_) (h_)->type
     553             : #define MREG_HDR_CAST(h_) ((map_register_hdr_t *)(h_))
     554             : #define MREG_PROXY_MR(h_) (MREG_HDR_CAST(h_))->proxy_map_reply
     555             : #define MREG_WANT_MAP_NOTIFY(h_) (MREG_HDR_CAST(h_))->want_map_notify
     556             : #define MREG_REC_COUNT(h_) (MREG_HDR_CAST(h_))->record_count
     557             : #define MREG_NONCE(h_) (MREG_HDR_CAST(h_))->nonce
     558             : #define MREG_KEY_ID(h_) (MREG_HDR_CAST(h_))->key_id
     559             : #define MREG_AUTH_DATA_LEN(h_) (MREG_HDR_CAST(h_))->auth_data_len
     560             : #define MREG_DATA(h_) (MREG_HDR_CAST(h_))->data
     561             : 
     562             : /*
     563             :  * The Map-Notify message format is:
     564             :  *
     565             :  *       0                   1                   2                   3
     566             :  *       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
     567             :  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     568             :  *      |Type=4 |              Reserved                 | Record Count  |
     569             :  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     570             :  *      |                         Nonce . . .                           |
     571             :  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     572             :  *      |                         . . . Nonce                           |
     573             :  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     574             :  *      |            Key ID             |  Authentication Data Length   |
     575             :  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     576             :  *      ~                     Authentication Data                       ~
     577             :  *  +-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     578             :  *  |   |                          Record TTL                           |
     579             :  *  |   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     580             :  *  R   | Locator Count | EID mask-len  | ACT |A|      Reserved         |
     581             :  *  e   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     582             :  *  c   | Rsvd  |  Map-Version Number   |         EID-Prefix-AFI        |
     583             :  *  o   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     584             :  *  r   |                          EID-Prefix                           |
     585             :  *  d   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     586             :  *  |  /|    Priority   |    Weight     |  M Priority   |   M Weight    |
     587             :  *  | L +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     588             :  *  | o |        Unused Flags     |L|p|R|           Loc-AFI             |
     589             :  *  | c +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     590             :  *  |  \|                             Locator                           |
     591             :  *  +-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     592             : */
     593             : 
     594             : typedef struct
     595             : {
     596             : #if CLIB_ARCH_IS_LITTLE_ENDIAN
     597             :   u8 res1:4;
     598             :   u8 type:4;
     599             : #else
     600             :   u8 type:4;
     601             :   u8 res1:4;
     602             : #endif
     603             : 
     604             :   u16 res2;
     605             : 
     606             :   u8 record_count;
     607             :   u64 nonce;
     608             :   u16 key_id;
     609             :   u16 auth_data_len;
     610             :   u8 data[0];
     611             : } __attribute__ ((__packed__)) map_notify_hdr_t;
     612             : 
     613             : #define MNOTIFY_TYPE(h_) (h_)->type
     614             : #define MNOTIFY_HDR_CAST(h_) ((map_register_hdr_t *)(h_))
     615             : #define MNOTIFY_REC_COUNT(h_) (MREG_HDR_CAST(h_))->record_count
     616             : #define MNOTIFY_NONCE(h_) (MREG_HDR_CAST(h_))->nonce
     617             : #define MNOTIFY_KEY_ID(h_) (MREG_HDR_CAST(h_))->key_id
     618             : #define MNOTIFY_AUTH_DATA_LEN(h_) (MREG_HDR_CAST(h_))->auth_data_len
     619             : #define MNOTIFY_DATA(h_) (MREG_HDR_CAST(h_))->data
     620             : 
     621             : /*
     622             :  *   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
     623             :  *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     624             :  *  |Ver|O|C|R|R|R|R|R|R|   Length  |  MD type=0x1  | Next Protocol |
     625             :  *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     626             :  *  |          Service Path Identifer               | Service Index |
     627             :  *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     628             :  */
     629             : 
     630             : typedef struct
     631             : {
     632             :   u32 header;
     633             :   u32 spi_si;
     634             : } __attribute__ ((__packed__)) lisp_nsh_hdr_t;
     635             : 
     636             : #endif /* VNET_LISP_GPE_LISP_CP_MESSAGES_H_ */
     637             : 
     638             : /*
     639             :  * fd.io coding-style-patch-verification: ON
     640             :  *
     641             :  * Local Variables:
     642             :  * eval: (c-set-style "gnu")
     643             :  * End:
     644             :  */

Generated by: LCOV version 1.14