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
;
24 static inline struct mpls_shim_hdr
*mpls_hdr(const struct sk_buff
*skb
)
26 return (struct mpls_shim_hdr
*)skb_network_header(skb
);
29 static inline struct mpls_shim_hdr
mpls_entry_encode(u32 label
, unsigned ttl
, unsigned tc
, bool bos
)
31 struct mpls_shim_hdr result
;
32 result
.label_stack_entry
=
33 cpu_to_be32((label
<< MPLS_LS_LABEL_SHIFT
) |
34 (tc
<< MPLS_LS_TC_SHIFT
) |
35 (bos
? (1 << MPLS_LS_S_SHIFT
) : 0) |
36 (ttl
<< MPLS_LS_TTL_SHIFT
));
40 static inline struct mpls_entry_decoded
mpls_entry_decode(struct mpls_shim_hdr
*hdr
)
42 struct mpls_entry_decoded result
;
43 unsigned entry
= be32_to_cpu(hdr
->label_stack_entry
);
45 result
.label
= (entry
& MPLS_LS_LABEL_MASK
) >> MPLS_LS_LABEL_SHIFT
;
46 result
.ttl
= (entry
& MPLS_LS_TTL_MASK
) >> MPLS_LS_TTL_SHIFT
;
47 result
.tc
= (entry
& MPLS_LS_TC_MASK
) >> MPLS_LS_TC_SHIFT
;
48 result
.bos
= (entry
& MPLS_LS_S_MASK
) >> MPLS_LS_S_SHIFT
;
53 int nla_put_labels(struct sk_buff
*skb
, int attrtype
, u8 labels
, const u32 label
[]);
54 int nla_get_labels(const struct nlattr
*nla
, u32 max_labels
, u32
*labels
, u32 label
[]);
56 #endif /* MPLS_INTERNAL_H */