]>
git.proxmox.com Git - ovs.git/blob - datapath/linux/compat/include/net/dst_metadata.h
1 #ifndef __NET_DST_METADATA_WRAPPER_H
2 #define __NET_DST_METADATA_WRAPPER_H 1
4 #ifdef USE_UPSTREAM_TUNNEL
5 #include_next <net/dst_metadata.h>
7 #include <linux/skbuff.h>
9 #include <net/dsfield.h>
12 #include <net/ip_tunnels.h>
20 struct net_device
*lower_dev
;
26 enum metadata_type type
;
28 struct ip_tunnel_info tun_info
;
29 struct hw_port_info port_info
;
34 #define DST_METADATA 0x0080
37 extern struct dst_ops md_dst_ops
;
39 static void rpl__metadata_dst_init(struct metadata_dst
*md_dst
,
40 enum metadata_type type
, u8 optslen
)
43 struct dst_entry
*dst
;
46 dst_init(dst
, &md_dst_ops
, NULL
, 1, DST_OBSOLETE_NONE
,
47 DST_METADATA
| DST_NOCOUNT
);
51 dst
->input
= dst_md_discard
;
52 dst
->output
= dst_md_discard_out
;
54 memset(dst
+ 1, 0, sizeof(*md_dst
) + optslen
- sizeof(*dst
));
59 metadata_dst
*__rpl_metadata_dst_alloc(u8 optslen
,
60 enum metadata_type type
,
63 struct metadata_dst
*md_dst
;
65 md_dst
= kmalloc(sizeof(*md_dst
) + optslen
, flags
);
69 rpl__metadata_dst_init(md_dst
, type
, optslen
);
73 static inline struct metadata_dst
*rpl_tun_rx_dst(int md_size
)
75 struct metadata_dst
*tun_dst
;
77 tun_dst
= __rpl_metadata_dst_alloc(md_size
, METADATA_IP_TUNNEL
,
82 tun_dst
->u
.tun_info
.options_len
= 0;
83 tun_dst
->u
.tun_info
.mode
= 0;
86 static inline struct metadata_dst
*rpl__ip_tun_set_dst(__be32 saddr
,
94 struct metadata_dst
*tun_dst
;
96 tun_dst
= rpl_tun_rx_dst(md_size
);
100 ip_tunnel_key_init(&tun_dst
->u
.tun_info
.key
,
101 saddr
, daddr
, tos
, ttl
,
102 0, 0, tp_dst
, tunnel_id
, flags
);
106 static inline struct metadata_dst
*rpl_ip_tun_rx_dst(struct sk_buff
*skb
,
111 const struct iphdr
*iph
= ip_hdr(skb
);
113 return rpl__ip_tun_set_dst(iph
->saddr
, iph
->daddr
, iph
->tos
, iph
->ttl
,
114 0, flags
, tunnel_id
, md_size
);
118 struct metadata_dst
*rpl__ipv6_tun_set_dst(const struct in6_addr
*saddr
,
119 const struct in6_addr
*daddr
,
127 struct metadata_dst
*tun_dst
;
128 struct ip_tunnel_info
*info
;
130 tun_dst
= rpl_tun_rx_dst(md_size
);
134 info
= &tun_dst
->u
.tun_info
;
135 info
->mode
= IP_TUNNEL_INFO_IPV6
;
136 info
->key
.tun_flags
= flags
;
137 info
->key
.tun_id
= tunnel_id
;
138 info
->key
.tp_src
= 0;
139 info
->key
.tp_dst
= tp_dst
;
141 info
->key
.u
.ipv6
.src
= *saddr
;
142 info
->key
.u
.ipv6
.dst
= *daddr
;
146 info
->key
.label
= label
;
151 static inline struct metadata_dst
*rpl_ipv6_tun_rx_dst(struct sk_buff
*skb
,
156 const struct ipv6hdr
*ip6h
= ipv6_hdr(skb
);
158 return rpl__ipv6_tun_set_dst(&ip6h
->saddr
, &ip6h
->daddr
,
159 ipv6_get_dsfield(ip6h
), ip6h
->hop_limit
,
160 0, ip6_flowlabel(ip6h
), flags
, tunnel_id
,
164 static void __metadata_dst_init(struct metadata_dst
*md_dst
, u8 optslen
)
166 struct dst_entry
*dst
;
171 dst_init(dst
, &md_dst_ops
, NULL
, 1, DST_OBSOLETE_NONE
,
172 DST_METADATA
| DST_NOCACHE
| DST_NOCOUNT
);
174 dst
->input
= dst_md_discard
;
175 dst
->output
= dst_md_discard_out
;
178 memset(dst
+ 1, 0, sizeof(*md_dst
) + optslen
- sizeof(*dst
));
181 static inline struct metadata_dst
*metadata_dst_alloc(u8 optslen
, gfp_t flags
)
183 struct metadata_dst
*md_dst
;
185 md_dst
= kmalloc(sizeof(*md_dst
) + optslen
, flags
);
189 __metadata_dst_init(md_dst
, optslen
);
193 #define skb_tunnel_info ovs_skb_tunnel_info
195 static inline void ovs_tun_rx_dst(struct metadata_dst
*md_dst
, int optslen
)
197 /* No need to allocate for OVS backport case. */
199 struct metadata_dst
*tun_dst
;
200 struct ip_tunnel_info
*info
;
202 tun_dst
= metadata_dst_alloc(md_size
, GFP_ATOMIC
);
206 __metadata_dst_init(md_dst
, optslen
);
209 static inline void ovs_ip_tun_rx_dst(struct metadata_dst
*md_dst
,
210 struct sk_buff
*skb
, __be16 flags
,
211 __be64 tunnel_id
, int md_size
)
213 const struct iphdr
*iph
= ip_hdr(skb
);
215 ovs_tun_rx_dst(md_dst
, md_size
);
216 ip_tunnel_key_init(&md_dst
->u
.tun_info
.key
,
217 iph
->saddr
, iph
->daddr
, iph
->tos
, iph
->ttl
, 0,
218 0, 0, tunnel_id
, flags
);
221 static inline void ovs_ipv6_tun_rx_dst(struct metadata_dst
*md_dst
,
227 struct ip_tunnel_info
*info
= &md_dst
->u
.tun_info
;
228 const struct ipv6hdr
*ip6h
= ipv6_hdr(skb
);
230 ovs_tun_rx_dst(md_dst
, md_size
);
231 info
->mode
= IP_TUNNEL_INFO_IPV6
;
232 info
->key
.tun_flags
= flags
;
233 info
->key
.tun_id
= tunnel_id
;
234 info
->key
.tp_src
= 0;
235 info
->key
.tp_dst
= 0;
237 info
->key
.u
.ipv6
.src
= ip6h
->saddr
;
238 info
->key
.u
.ipv6
.dst
= ip6h
->daddr
;
240 info
->key
.tos
= ipv6_get_dsfield(ip6h
);
241 info
->key
.ttl
= ip6h
->hop_limit
;
242 info
->key
.label
= ip6_flowlabel(ip6h
);
245 #endif /* USE_UPSTREAM_TUNNEL */
247 void ovs_ip_tunnel_rcv(struct net_device
*dev
, struct sk_buff
*skb
,
248 struct metadata_dst
*tun_dst
);
250 static inline struct metadata_dst
*
251 rpl_metadata_dst_alloc(u8 optslen
, enum metadata_type type
, gfp_t flags
)
253 #if defined(HAVE_METADATA_DST_ALLOC_WITH_METADATA_TYPE) && defined(USE_UPSTREAM_TUNNEL)
254 return metadata_dst_alloc(optslen
, type
, flags
);
256 return metadata_dst_alloc(optslen
, flags
);
259 #define metadata_dst_alloc rpl_metadata_dst_alloc
261 static inline bool rpl_skb_valid_dst(const struct sk_buff
*skb
)
263 struct dst_entry
*dst
= skb_dst(skb
);
265 return dst
&& !(dst
->flags
& DST_METADATA
);
267 #define skb_valid_dst rpl_skb_valid_dst
269 #endif /* __NET_DST_METADATA_WRAPPER_H */