LCOV - code coverage report
Current view: top level - plugins/geneve - geneve_packet.h (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 41 41 100.0 %
Date: 2023-10-26 01:39:38 Functions: 12 12 100.0 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2017 SUSE LLC.
       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 included_vnet_geneve_packet_h
      17             : #define included_vnet_geneve_packet_h
      18             : 
      19             : /*
      20             :  *
      21             :  * As per draft https://tools.ietf.org/html/draft-ietf-nvo3-geneve-05
      22             :  *
      23             :  * Section 3.5
      24             :  *
      25             :  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      26             :  * |          Option Class         |      Type     |R|R|R| Length  |
      27             :  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      28             :  * |                      Variable Option Data                     |
      29             :  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      30             :  */
      31             : #define GENEVE_MAX_OPT_LENGTH 128
      32             : 
      33             : /*
      34             :  *
      35             :  * As per draft https://tools.ietf.org/html/draft-ietf-nvo3-geneve-05
      36             :  *
      37             :  * Section 7
      38             :  *
      39             :  * +----------------+--------------------------------------+
      40             :  * | Option Class   | Description                          |
      41             :  * +----------------+--------------------------------------+
      42             :  * | 0x0000..0x00FF | Unassigned - IETF Review             |
      43             :  * | 0x0100         | Linux                                |
      44             :  * | 0x0101         | Open vSwitch                         |
      45             :  * | 0x0102         | Open Virtual Networking (OVN)        |
      46             :  * | 0x0103         | In-band Network Telemetry (INT)      |
      47             :  * | 0x0104         | VMware                               |
      48             :  * | 0x0105..0xFFEF | Unassigned - First Come First Served |
      49             :  * | 0xFFF0..FFFF   | Experimental                         |
      50             :  * +----------------+--------------------------------------+
      51             : */
      52             : #define LINUX_OPT_CLASS  0x0100
      53             : #define OVS_OPT_CLASS    0x0101
      54             : #define OVN_OPT_CLASS    0x0102
      55             : #define INT_OPT_CLASS    0x0103
      56             : #define VMWARE_OPT_CLASS 0x0104
      57             : 
      58             : /*
      59             :  * 0                   1                   2                   3
      60             :  * 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
      61             :  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      62             :  * |          Option Class         |      Type     |R|R|R| Length  |
      63             :  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      64             :  * |                      Variable Option Data                     |
      65             :  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      66             :  */
      67             : typedef struct
      68             : {
      69             :   u16 opt_class;
      70             :   u8 type;
      71             :   /* The 3 reserved bits are for future use;
      72             :    * Need to be 0 on sending and ignored on receipt.
      73             :    */
      74             :   u8 res;
      75             :   /* Length is expressed in 4-bytes multiples excluding the options header. */
      76             :   u8 length;
      77             :   u32 opt_data[];
      78             : } geneve_options_t;
      79             : 
      80             : /*
      81             :  *
      82             :  * As per draft https://tools.ietf.org/html/draft-ietf-nvo3-geneve-05
      83             :  *
      84             :  * Section 3/3.4
      85             :  *
      86             :  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      87             :  * |Ver|  Opt Len  |O|C|    Rsvd.  |          Protocol Type        |
      88             :  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      89             :  * |        Virtual Network Identifier (VNI)       |    Reserved   |
      90             :  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      91             :  * |                    Variable Length Options                    |
      92             :  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      93             :  *
      94             :  */
      95             : #define GENEVE_BASE_HEADER_LENGTH   8   // GENEVE BASE HEADER in bytes
      96             : #define GENEVE_MAX_TOTAL_HDR_LENGTH 260
      97             : 
      98             : #define GENEVE_VERSION 0
      99             : #define GENEVE_ETH_PROTOCOL 0x6558
     100             : 
     101             : typedef struct
     102             : {
     103             :   /*
     104             :    * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     105             :    * |Ver|  Opt Len  |O|C|    Rsvd.  |          Protocol Type        |
     106             :    * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     107             :    */
     108             :   u32 first_word;
     109             : 
     110             :   /*
     111             :    * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     112             :    * |        Virtual Network Identifier (VNI)       |    Reserved   |
     113             :    * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     114             :    */
     115             :   u32 vni_rsvd;
     116             :   geneve_options_t opts[];
     117             : } geneve_header_t;
     118             : 
     119             : #define GENEVE_VERSION_SHIFT    30
     120             : #define GENEVE_OPTLEN_SHIFT             24
     121             : #define GENEVE_O_BIT_SHIFT              23
     122             : #define GENEVE_C_BIT_SHIFT              22
     123             : #define GENEVE_6_RESERVED_SHIFT 16
     124             : #define GENEVE_VNI_SHIFT                8
     125             : 
     126             : #define GENEVE_VERSION_MASK             0xC0000000
     127             : #define GENEVE_OPTLEN_MASK              0x3F000000
     128             : #define GENEVE_O_BIT_MASK               0x00800000
     129             : #define GENEVE_C_BIT_MASK               0x00400000
     130             : #define GENEVE_6_RESERVED_MASK  0x003F0000
     131             : #define GENEVE_PROTOCOL_MASK    0x0000FFFF
     132             : #define GENEVE_VNI_MASK                 0xFFFFFF00
     133             : 
     134             : /*
     135             :  * Return the VNI in host-byte order
     136             :  */
     137             : static inline u32
     138          24 : vnet_get_geneve_vni (geneve_header_t * h)
     139             : {
     140          24 :   return ((clib_net_to_host_u32 (h->vni_rsvd) & GENEVE_VNI_MASK) >>
     141             :           GENEVE_VNI_SHIFT);
     142             : }
     143             : 
     144             : static inline u32
     145          34 : vnet_get_geneve_vni_network_order (geneve_header_t * h)
     146             : {
     147          34 :   return (h->vni_rsvd & clib_net_to_host_u32 (GENEVE_VNI_MASK));
     148             : }
     149             : 
     150             : static inline void
     151          43 : vnet_set_geneve_vni (geneve_header_t * h, u32 vni)
     152             : {
     153          43 :   h->vni_rsvd &= ~(GENEVE_VNI_MASK);
     154          43 :   h->vni_rsvd |=
     155          43 :     clib_host_to_net_u32 ((vni << GENEVE_VNI_SHIFT) & GENEVE_VNI_MASK);
     156          43 : }
     157             : 
     158             : static inline u8
     159          24 : vnet_get_geneve_version (geneve_header_t * h)
     160             : {
     161          24 :   return ((h->first_word & GENEVE_VERSION_MASK) >> GENEVE_VERSION_SHIFT);
     162             : }
     163             : 
     164             : static inline void
     165          43 : vnet_set_geneve_version (geneve_header_t * h, u8 version)
     166             : {
     167          43 :   h->first_word &= ~(GENEVE_VERSION_MASK);
     168          43 :   h->first_word |= ((version << GENEVE_VERSION_SHIFT) & GENEVE_VERSION_MASK);
     169          43 : }
     170             : 
     171             : static inline u8
     172          24 : vnet_get_geneve_options_len (geneve_header_t * h)
     173             : {
     174          24 :   return ((h->first_word & GENEVE_OPTLEN_MASK) >> GENEVE_OPTLEN_SHIFT) << 2;
     175             : }
     176             : 
     177             : static inline void
     178          43 : vnet_set_geneve_options_len (geneve_header_t * h, u8 len)
     179             : {
     180          43 :   ASSERT ((len & 0x3) == 0);
     181          43 :   h->first_word &= ~(GENEVE_OPTLEN_MASK);
     182          43 :   h->first_word |= ((len << (GENEVE_OPTLEN_SHIFT - 2)) & GENEVE_OPTLEN_MASK);
     183          43 : }
     184             : 
     185             : static inline u8
     186             : vnet_get_geneve_oamframe_bit (geneve_header_t * h)
     187             : {
     188             :   return ((h->first_word & GENEVE_O_BIT_MASK) >> GENEVE_O_BIT_SHIFT);
     189             : }
     190             : 
     191             : static inline void
     192          43 : vnet_set_geneve_oamframe_bit (geneve_header_t * h, u8 oam)
     193             : {
     194          43 :   h->first_word &= ~(GENEVE_O_BIT_MASK);
     195          43 :   h->first_word |= ((oam << GENEVE_O_BIT_SHIFT) & GENEVE_O_BIT_MASK);
     196          43 : }
     197             : 
     198             : static inline u8
     199             : vnet_get_geneve_critical_bit (geneve_header_t * h)
     200             : {
     201             :   return ((h->first_word & GENEVE_C_BIT_MASK) >> GENEVE_C_BIT_SHIFT);
     202             : }
     203             : 
     204             : static inline void
     205          43 : vnet_set_geneve_critical_bit (geneve_header_t * h, u8 critical_opts)
     206             : {
     207          43 :   h->first_word &= ~(GENEVE_C_BIT_MASK);
     208          43 :   h->first_word |=
     209          43 :     ((critical_opts << GENEVE_C_BIT_SHIFT) & GENEVE_C_BIT_MASK);
     210          43 : }
     211             : 
     212             : static inline u16
     213             : vnet_get_geneve_protocol (geneve_header_t * h)
     214             : {
     215             :   return (h->first_word & GENEVE_PROTOCOL_MASK);
     216             : }
     217             : 
     218             : static inline void
     219          43 : vnet_set_geneve_protocol (geneve_header_t * h, u16 protocol)
     220             : {
     221          43 :   h->first_word &= ~(GENEVE_PROTOCOL_MASK);
     222          43 :   h->first_word |= (protocol & GENEVE_PROTOCOL_MASK);
     223          43 : }
     224             : 
     225             : static inline void
     226          24 : vnet_geneve_hdr_1word_ntoh (geneve_header_t * h)
     227             : {
     228          24 :   h->first_word = clib_net_to_host_u32 (h->first_word);
     229          24 : }
     230             : 
     231             : static inline void
     232          43 : vnet_geneve_hdr_1word_hton (geneve_header_t * h)
     233             : {
     234          43 :   h->first_word = clib_host_to_net_u32 (h->first_word);
     235          43 : }
     236             : 
     237             : #endif
     238             : 
     239             : /*
     240             :  * fd.io coding-style-patch-verification: ON
     241             :  *
     242             :  * Local Variables:
     243             :  * eval: (c-set-style "gnu")
     244             :  * End:
     245             :  */

Generated by: LCOV version 1.14