1 #ifndef MPLS_INTERNAL_H
2 #define MPLS_INTERNAL_H
4 #define LABEL_IPV4_EXPLICIT_NULL 0 /* RFC3032 */
5 #define LABEL_ROUTER_ALERT_LABEL 1 /* RFC3032 */
6 #define LABEL_IPV6_EXPLICIT_NULL 2 /* RFC3032 */
7 #define LABEL_IMPLICIT_NULL 3 /* RFC3032 */
8 #define LABEL_ENTROPY_INDICATOR 7 /* RFC6790 */
9 #define LABEL_GAL 13 /* RFC5586 */
10 #define LABEL_OAM_ALERT 14 /* RFC3429 */
11 #define LABEL_EXTENSION 15 /* RFC7274 */
14 struct mpls_shim_hdr
{
15 __be32 label_stack_entry
;
18 struct mpls_entry_decoded
{
27 static inline struct mpls_shim_hdr
*mpls_hdr(const struct sk_buff
*skb
)
29 return (struct mpls_shim_hdr
*)skb_network_header(skb
);
32 static inline struct mpls_shim_hdr
mpls_entry_encode(u32 label
, unsigned ttl
, unsigned tc
, bool bos
)
34 struct mpls_shim_hdr result
;
35 result
.label_stack_entry
=
36 cpu_to_be32((label
<< MPLS_LS_LABEL_SHIFT
) |
37 (tc
<< MPLS_LS_TC_SHIFT
) |
38 (bos
? (1 << MPLS_LS_S_SHIFT
) : 0) |
39 (ttl
<< MPLS_LS_TTL_SHIFT
));
43 static inline struct mpls_entry_decoded
mpls_entry_decode(struct mpls_shim_hdr
*hdr
)
45 struct mpls_entry_decoded result
;
46 unsigned entry
= be32_to_cpu(hdr
->label_stack_entry
);
48 result
.label
= (entry
& MPLS_LS_LABEL_MASK
) >> MPLS_LS_LABEL_SHIFT
;
49 result
.ttl
= (entry
& MPLS_LS_TTL_MASK
) >> MPLS_LS_TTL_SHIFT
;
50 result
.tc
= (entry
& MPLS_LS_TC_MASK
) >> MPLS_LS_TC_SHIFT
;
51 result
.bos
= (entry
& MPLS_LS_S_MASK
) >> MPLS_LS_S_SHIFT
;
56 int nla_put_labels(struct sk_buff
*skb
, int attrtype
, u8 labels
, const u32 label
[]);
57 int nla_get_labels(const struct nlattr
*nla
, u32 max_labels
, u32
*labels
, u32 label
[]);
59 #endif /* MPLS_INTERNAL_H */