Branch data Line data Source code
1 : : /*
2 : : * Copyright (c) 2010, 2011, 2013, 2015 Nicira, Inc.
3 : : *
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:
7 : : *
8 : : * http://www.apache.org/licenses/LICENSE-2.0
9 : : *
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.
15 : : */
16 : :
17 : : #ifndef NETDEV_VPORT_NATIVE_TNL_H
18 : : #define NETDEV_VPORT_NATIVE_TNL_H 1
19 : :
20 : : #include <stdbool.h>
21 : : #include <stddef.h>
22 : : #include "compiler.h"
23 : : #include "dp-packet.h"
24 : : #include "packets.h"
25 : : #include "unixctl.h"
26 : :
27 : : struct netdev;
28 : : struct ovs_action_push_tnl;
29 : : struct netdev_tnl_build_header_params;
30 : :
31 : : int
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);
35 : :
36 : : void
37 : : netdev_gre_push_header(struct dp_packet *packet,
38 : : const struct ovs_action_push_tnl *data);
39 : : struct dp_packet *
40 : : netdev_gre_pop_header(struct dp_packet *packet);
41 : :
42 : : void
43 : : netdev_tnl_push_udp_header(struct dp_packet *packet,
44 : : const struct ovs_action_push_tnl *data);
45 : : int
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);
49 : :
50 : : struct dp_packet *
51 : : netdev_geneve_pop_header(struct dp_packet *packet);
52 : :
53 : : int
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);
57 : :
58 : : struct dp_packet *
59 : : netdev_vxlan_pop_header(struct dp_packet *packet);
60 : :
61 : : static inline bool
62 : 5672 : netdev_tnl_is_header_ipv6(const void *header)
63 : : {
64 : : const struct eth_header *eth;
65 : 5672 : eth = header;
66 : 5672 : return eth->eth_type == htons(ETH_TYPE_IPV6);
67 : : }
68 : :
69 : : static inline struct ip_header *
70 : 3781 : netdev_tnl_ip_hdr(void *eth)
71 : : {
72 : 3781 : return (void *)((char *)eth + sizeof (struct eth_header));
73 : : }
74 : :
75 : : static inline struct ovs_16aligned_ip6_hdr *
76 : 2 : netdev_tnl_ipv6_hdr(void *eth)
77 : : {
78 : 2 : return (void *)((char *)eth + sizeof (struct eth_header));
79 : : }
80 : :
81 : : void *
82 : : netdev_tnl_ip_build_header(struct ovs_action_push_tnl *data,
83 : : const struct netdev_tnl_build_header_params *params,
84 : : uint8_t next_proto);
85 : :
86 : : extern uint16_t tnl_udp_port_min;
87 : : extern uint16_t tnl_udp_port_max;
88 : :
89 : : static inline ovs_be16
90 : 1899 : netdev_tnl_get_src_port(struct dp_packet *packet)
91 : : {
92 : : uint32_t hash;
93 : :
94 : 1899 : hash = dp_packet_get_rss_hash(packet);
95 : :
96 : 1899 : return htons((((uint64_t) hash * (tnl_udp_port_max - tnl_udp_port_min)) >> 32) +
97 : : tnl_udp_port_min);
98 : : }
99 : :
100 : : void *
101 : : netdev_tnl_ip_extract_tnl_md(struct dp_packet *packet, struct flow_tnl *tnl,
102 : : unsigned int *hlen);
103 : : void *
104 : : netdev_tnl_push_ip_header(struct dp_packet *packet,
105 : : const void *header, int size, int *ip_tot_size);
106 : : void
107 : : netdev_tnl_egress_port_range(struct unixctl_conn *conn, int argc,
108 : : const char *argv[], void *aux OVS_UNUSED);
109 : : #endif
|