Line data Source code
1 : /* SPDX-License-Identifier: GPL-2.0-only */ 2 : /* 3 : * Copyright (c) 2014 Nicira, Inc. 4 : */ 5 : 6 : #ifndef _NET_MPLS_H 7 : #define _NET_MPLS_H 1 8 : 9 : #include <linux/if_ether.h> 10 : #include <linux/netdevice.h> 11 : #include <linux/mpls.h> 12 : 13 : #define MPLS_HLEN 4 14 : 15 : struct mpls_shim_hdr { 16 : __be32 label_stack_entry; 17 : }; 18 : 19 0 : static inline bool eth_p_mpls(__be16 eth_type) 20 : { 21 0 : return eth_type == htons(ETH_P_MPLS_UC) || 22 0 : eth_type == htons(ETH_P_MPLS_MC); 23 : } 24 : 25 0 : static inline struct mpls_shim_hdr *mpls_hdr(const struct sk_buff *skb) 26 : { 27 0 : return (struct mpls_shim_hdr *)skb_network_header(skb); 28 : } 29 : 30 : static inline struct mpls_shim_hdr mpls_entry_encode(u32 label, 31 : unsigned int ttl, 32 : unsigned int tc, 33 : bool bos) 34 : { 35 : struct mpls_shim_hdr result; 36 : 37 : result.label_stack_entry = 38 : cpu_to_be32((label << MPLS_LS_LABEL_SHIFT) | 39 : (tc << MPLS_LS_TC_SHIFT) | 40 : (bos ? (1 << MPLS_LS_S_SHIFT) : 0) | 41 : (ttl << MPLS_LS_TTL_SHIFT)); 42 : return result; 43 : } 44 : 45 : #endif