FD.io VPP  v21.10.1-2-g0a485f517
Vector Packet Processing
packet.h
Go to the documentation of this file.
1 /*
2  * MPLS packet format
3  *
4  * Copyright (c) 2012 Cisco and/or its affiliates.
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 #ifndef included_vnet_mpls_packet_h
19 #define included_vnet_mpls_packet_h
20 
21 #include <vnet/ip/ip_packet.h>
22 
23 /**
24  * A label value only, i.e. 20bits.
25  */
26 typedef u32 mpls_label_t;
27 
28 typedef struct {
29  /* Label: top 20 bits [in network byte order] */
30  /* Experimental: 3 bits ... */
31  /* S (bottom of label stack): 1 bit */
32  /* TTL: 8 bits */
35 
36 typedef enum mpls_eos_bit_t_
37 {
39  MPLS_EOS = 1,
41 
42 #define MPLS_EOS_BITS { \
43  [MPLS_NON_EOS] = "neos", \
44  [MPLS_EOS] = "eos", \
45 }
46 
47 /**
48  * The Default TTL added to MPLS label headers when no other value is available
49  */
50 #define MPLS_LABEL_DEFAULT_TTL 64
51 
52 /**
53  * The Default EXP added to MPLS label headers when no other value is available
54  */
55 #define MPLS_LABEL_DEFAULT_EXP 0
56 
57 /**
58  * When in uniform mode convert an IPv[46] DSCP value to an MPLS EXP value
59  */
60 static inline u8 ip_dscp_to_mpls_exp (ip_dscp_t tos)
61 {
62  return (tos >> 5);
63 }
64 
65 /**
66  * When in uniform mode convert an MPLS EXP value to an IPv[46] DSCP value
67  */
68 static inline u8 mpls_exp_to_ip_dscp (u8 exp)
69 {
70  return (exp << 5);
71 }
72 
73 #define FOR_EACH_MPLS_EOS_BIT(_eos) \
74  for (_eos = MPLS_NON_EOS; _eos <= MPLS_EOS; _eos++)
75 
76 #define MPLS_ENTRY_LABEL_OFFSET 0
77 #define MPLS_ENTRY_LABEL_SHIFT 12
78 #define MPLS_ENTRY_LABEL_MASK 0x000fffff
79 #define MPLS_ENTRY_LABEL_BITS \
80  (MPLS_ENTRY_LABEL_MASK << MPLS_ENTRY_LABEL_SHIFT)
81 
82 #define MPLS_ENTRY_EXP_OFFSET 2 /* byte offset to EXP bits */
83 #define MPLS_ENTRY_EXP_SHIFT 9
84 #define MPLS_ENTRY_EXP_MASK 0x07
85 #define MPLS_ENTRY_EXP(mpls) \
86  (((mpls)>>MPLS_ENTRY_EXP_SHIFT) & MPLS_ENTRY_EXP_MASK)
87 #define MPLS_ENTRY_EXP_BITS \
88  (MPLS_ENTRY_EXP_MASK << MPLS_ENTRY_EXP_SHIFT)
89 
90 #define MPLS_ENTRY_EOS_OFFSET 2 /* byte offset to EOS bit */
91 #define MPLS_ENTRY_EOS_SHIFT 8
92 #define MPLS_ENTRY_EOS_MASK 0x01 /* EOS bit in its byte */
93 #define MPLS_ENTRY_EOS(mpls) \
94  (((mpls) >> MPLS_ENTRY_EOS_SHIFT) & MPLS_ENTRY_EOS_MASK)
95 #define MPLS_ENTRY_EOS_BIT (MPLS_ENTRY_EOS_MASK << MPLS_ENTRY_EOS_SHIFT)
96 
97 #define MPLS_ENTRY_TTL_OFFSET 3 /* byte offset to ttl field */
98 #define MPLS_ENTRY_TTL_SHIFT 0
99 #define MPLS_ENTRY_TTL_MASK 0xff
100 #define MPLS_ENTRY_TTL(mpls) \
101  (((mpls) >> MPLS_ENTRY_TTL_SHIFT) & MPLS_ENTRY_TTL_MASK)
102 #define MPLS_ENTRY_TTL_BITS \
103  (MPLS_ENTRY_TTL_MASK << MPLS_ENTRY_TTL_SHIFT)
104 
105 static inline u32 vnet_mpls_uc_get_label (mpls_label_t label_exp_s_ttl)
106 {
107  return (label_exp_s_ttl>>MPLS_ENTRY_LABEL_SHIFT);
108 }
109 
110 static inline u32 vnet_mpls_uc_get_exp (mpls_label_t label_exp_s_ttl)
111 {
112  return (MPLS_ENTRY_EXP(label_exp_s_ttl));
113 }
114 
115 static inline u32 vnet_mpls_uc_get_s (mpls_label_t label_exp_s_ttl)
116 {
117  return (MPLS_ENTRY_EOS(label_exp_s_ttl));
118 }
119 
120 static inline u32 vnet_mpls_uc_get_ttl (mpls_label_t label_exp_s_ttl)
121 {
122  return (MPLS_ENTRY_TTL(label_exp_s_ttl));
123 }
124 
125 static inline void vnet_mpls_uc_set_label (mpls_label_t *label_exp_s_ttl,
126  u32 value)
127 {
128  *label_exp_s_ttl = (((*label_exp_s_ttl) & ~(MPLS_ENTRY_LABEL_BITS)) |
130 }
131 
132 static inline void vnet_mpls_uc_set_exp (mpls_label_t *label_exp_s_ttl,
133  u32 exp)
134 {
135  *label_exp_s_ttl = (((*label_exp_s_ttl) & ~(MPLS_ENTRY_EXP_BITS)) |
137 }
138 
139 static inline void vnet_mpls_uc_set_s (mpls_label_t *label_exp_s_ttl,
140  u32 eos)
141 {
142  *label_exp_s_ttl = (((*label_exp_s_ttl) & ~(MPLS_ENTRY_EOS_BIT)) |
144 }
145 
146 static inline void vnet_mpls_uc_set_ttl (mpls_label_t *label_exp_s_ttl,
147  u32 ttl)
148 {
149  *label_exp_s_ttl = (((*label_exp_s_ttl) & ~(MPLS_ENTRY_TTL_BITS)) |
150  ((ttl & MPLS_ENTRY_TTL_MASK)));
151 }
152 
153 #endif /* included_vnet_mpls_packet_h */
vnet_mpls_uc_get_s
static u32 vnet_mpls_uc_get_s(mpls_label_t label_exp_s_ttl)
Definition: packet.h:115
ip_dscp_t
enum ip_dscp_t_ ip_dscp_t
MPLS_ENTRY_LABEL_MASK
#define MPLS_ENTRY_LABEL_MASK
Definition: packet.h:78
ttl
u8 ttl
Definition: fib_types.api:26
MPLS_ENTRY_EOS_MASK
#define MPLS_ENTRY_EOS_MASK
Definition: packet.h:92
exp
u8 exp
Definition: fib_types.api:27
MPLS_ENTRY_LABEL_BITS
#define MPLS_ENTRY_LABEL_BITS
Definition: packet.h:79
mpls_unicast_header_t
Definition: packet.h:28
MPLS_EOS
@ MPLS_EOS
Definition: packet.h:39
vnet_mpls_uc_get_label
static u32 vnet_mpls_uc_get_label(mpls_label_t label_exp_s_ttl)
Definition: packet.h:105
ip_packet.h
vnet_mpls_uc_set_label
static void vnet_mpls_uc_set_label(mpls_label_t *label_exp_s_ttl, u32 value)
Definition: packet.h:125
MPLS_ENTRY_EOS_SHIFT
#define MPLS_ENTRY_EOS_SHIFT
Definition: packet.h:91
MPLS_ENTRY_EXP_BITS
#define MPLS_ENTRY_EXP_BITS
Definition: packet.h:87
vnet_mpls_uc_set_s
static void vnet_mpls_uc_set_s(mpls_label_t *label_exp_s_ttl, u32 eos)
Definition: packet.h:139
MPLS_ENTRY_EOS
#define MPLS_ENTRY_EOS(mpls)
Definition: packet.h:93
vnet_mpls_uc_get_exp
static u32 vnet_mpls_uc_get_exp(mpls_label_t label_exp_s_ttl)
Definition: packet.h:110
mpls_exp_to_ip_dscp
static u8 mpls_exp_to_ip_dscp(u8 exp)
When in uniform mode convert an MPLS EXP value to an IPv[46] DSCP value.
Definition: packet.h:68
vnet_mpls_uc_set_exp
static void vnet_mpls_uc_set_exp(mpls_label_t *label_exp_s_ttl, u32 exp)
Definition: packet.h:132
MPLS_ENTRY_TTL
#define MPLS_ENTRY_TTL(mpls)
Definition: packet.h:100
MPLS_ENTRY_EXP
#define MPLS_ENTRY_EXP(mpls)
Definition: packet.h:85
ip_dscp_to_mpls_exp
static u8 ip_dscp_to_mpls_exp(ip_dscp_t tos)
When in uniform mode convert an IPv[46] DSCP value to an MPLS EXP value.
Definition: packet.h:60
MPLS_ENTRY_EOS_BIT
#define MPLS_ENTRY_EOS_BIT
Definition: packet.h:95
MPLS_NON_EOS
@ MPLS_NON_EOS
Definition: packet.h:38
u32
unsigned int u32
Definition: types.h:88
vnet_mpls_uc_set_ttl
static void vnet_mpls_uc_set_ttl(mpls_label_t *label_exp_s_ttl, u32 ttl)
Definition: packet.h:146
MPLS_ENTRY_EXP_SHIFT
#define MPLS_ENTRY_EXP_SHIFT
Definition: packet.h:83
value
u8 value
Definition: qos.api:54
MPLS_ENTRY_TTL_BITS
#define MPLS_ENTRY_TTL_BITS
Definition: packet.h:102
MPLS_ENTRY_EXP_MASK
#define MPLS_ENTRY_EXP_MASK
Definition: packet.h:84
mpls_unicast_header_t::label_exp_s_ttl
mpls_label_t label_exp_s_ttl
Definition: packet.h:33
mpls_eos_bit_t_
mpls_eos_bit_t_
Definition: packet.h:36
MPLS_ENTRY_TTL_MASK
#define MPLS_ENTRY_TTL_MASK
Definition: packet.h:99
u8
unsigned char u8
Definition: types.h:56
mpls_label_t
u32 mpls_label_t
A label value only, i.e.
Definition: packet.h:26
vnet_mpls_uc_get_ttl
static u32 vnet_mpls_uc_get_ttl(mpls_label_t label_exp_s_ttl)
Definition: packet.h:120
mpls_eos_bit_t
enum mpls_eos_bit_t_ mpls_eos_bit_t
MPLS_ENTRY_LABEL_SHIFT
#define MPLS_ENTRY_LABEL_SHIFT
Definition: packet.h:77