1 #ifndef MPLS_INTERNAL_H
2 #define MPLS_INTERNAL_H
5 __be32 label_stack_entry
;
8 struct mpls_entry_decoded
{
18 struct ctl_table_header
*sysctl
;
23 static inline struct mpls_shim_hdr
*mpls_hdr(const struct sk_buff
*skb
)
25 return (struct mpls_shim_hdr
*)skb_network_header(skb
);
28 static inline struct mpls_shim_hdr
mpls_entry_encode(u32 label
, unsigned ttl
, unsigned tc
, bool bos
)
30 struct mpls_shim_hdr result
;
31 result
.label_stack_entry
=
32 cpu_to_be32((label
<< MPLS_LS_LABEL_SHIFT
) |
33 (tc
<< MPLS_LS_TC_SHIFT
) |
34 (bos
? (1 << MPLS_LS_S_SHIFT
) : 0) |
35 (ttl
<< MPLS_LS_TTL_SHIFT
));
39 static inline struct mpls_entry_decoded
mpls_entry_decode(struct mpls_shim_hdr
*hdr
)
41 struct mpls_entry_decoded result
;
42 unsigned entry
= be32_to_cpu(hdr
->label_stack_entry
);
44 result
.label
= (entry
& MPLS_LS_LABEL_MASK
) >> MPLS_LS_LABEL_SHIFT
;
45 result
.ttl
= (entry
& MPLS_LS_TTL_MASK
) >> MPLS_LS_TTL_SHIFT
;
46 result
.tc
= (entry
& MPLS_LS_TC_MASK
) >> MPLS_LS_TC_SHIFT
;
47 result
.bos
= (entry
& MPLS_LS_S_MASK
) >> MPLS_LS_S_SHIFT
;
52 int nla_put_labels(struct sk_buff
*skb
, int attrtype
, u8 labels
, const u32 label
[]);
53 int nla_get_labels(const struct nlattr
*nla
, u32 max_labels
, u32
*labels
, u32 label
[]);
55 #endif /* MPLS_INTERNAL_H */