2 * Copyright (c) 2010, 2011, 2013, 2015 Nicira, Inc.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at:
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #ifndef NETDEV_VPORT_NATIVE_TNL_H
18 #define NETDEV_VPORT_NATIVE_TNL_H 1
23 #include "dp-packet.h"
28 struct ovs_action_push_tnl
;
29 struct netdev_tnl_build_header_params
;
32 netdev_gre_build_header(const struct netdev
*netdev
,
33 struct ovs_action_push_tnl
*data
,
34 const struct netdev_tnl_build_header_params
*params
);
37 netdev_gre_push_header(struct dp_packet
*packet
,
38 const struct ovs_action_push_tnl
*data
);
40 netdev_gre_pop_header(struct dp_packet
*packet
);
43 netdev_tnl_push_udp_header(struct dp_packet
*packet
,
44 const struct ovs_action_push_tnl
*data
);
46 netdev_geneve_build_header(const struct netdev
*netdev
,
47 struct ovs_action_push_tnl
*data
,
48 const struct netdev_tnl_build_header_params
*params
);
51 netdev_geneve_pop_header(struct dp_packet
*packet
);
54 netdev_vxlan_build_header(const struct netdev
*netdev
,
55 struct ovs_action_push_tnl
*data
,
56 const struct netdev_tnl_build_header_params
*params
);
59 netdev_vxlan_pop_header(struct dp_packet
*packet
);
62 netdev_tnl_is_header_ipv6(const void *header
)
64 const struct eth_header
*eth
;
66 return eth
->eth_type
== htons(ETH_TYPE_IPV6
);
69 static inline struct ip_header
*
70 netdev_tnl_ip_hdr(void *eth
)
72 return (void *)((char *)eth
+ sizeof (struct eth_header
));
75 static inline struct ovs_16aligned_ip6_hdr
*
76 netdev_tnl_ipv6_hdr(void *eth
)
78 return (void *)((char *)eth
+ sizeof (struct eth_header
));
82 netdev_tnl_ip_build_header(struct ovs_action_push_tnl
*data
,
83 const struct netdev_tnl_build_header_params
*params
,
86 extern uint16_t tnl_udp_port_min
;
87 extern uint16_t tnl_udp_port_max
;
89 static inline ovs_be16
90 netdev_tnl_get_src_port(struct dp_packet
*packet
)
94 hash
= dp_packet_get_rss_hash(packet
);
96 return htons((((uint64_t) hash
* (tnl_udp_port_max
- tnl_udp_port_min
)) >> 32) +
101 netdev_tnl_ip_extract_tnl_md(struct dp_packet
*packet
, struct flow_tnl
*tnl
,
104 netdev_tnl_push_ip_header(struct dp_packet
*packet
,
105 const void *header
, int size
, int *ip_tot_size
);
107 netdev_tnl_egress_port_range(struct unixctl_conn
*conn
, int argc
,
108 const char *argv
[], void *aux OVS_UNUSED
);