2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-22 09:58:01 +00:00

157 lines
3.9 KiB
C
Raw Normal View History

/*
* Copyright (c) 2011, 2013, 2014, 2015, 2017 Nicira, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __CHECKER__
#error "Use this header only with sparse. It is not a correct implementation."
#endif
#define NETINET_IN_H_INCLUDED 1
#ifndef SYS_TYPES_H_INCLUDED
#error "Must include <sys/types.h> before <netinet/in.h> for FreeBSD support"
#endif
sparse: Fix conflict between netinet/in.h and linux/in.h linux/in.h (from linux uapi headers) carries many of the same definitions as netinet/in.h (from glibc). If linux/in.h is included after netinet/in.h, conflicts are avoided in two ways: 1) linux/libc-compat.h (included by linux/in.h) detects the include guard of netinet/in.h and defines some macros (e.g. __UAPI_DEF_IN_IPPROTO) to 0. linux/in.h avoids exporting the same enums if those macros are 0. 2) The two files are allowed to redefine the same macros as long as the values are the same. Our include/sparse/netinet/in.h creates problems, because: 1) It uses a custom include guard 2) It uses dummy values for some macros. This commit changes include/sparse/netinet/in.h to use the same include guard as glibc netinet/in.h, and to use the same values for some macros. I think this problem is present with linux headers after a263653ed798("netfilter: don't pull include/linux/netfilter.h from netns headers") which cause our lib/netlink-conntrack.c to include linux/in.h after netinet/in.h. sample output from sparse: /usr/include/linux/in.h:29:9: warning: preprocessor token IPPROTO_IP redefined ../include/sparse/netinet/in.h:60:9: this was the original definition /usr/include/linux/in.h:31:9: warning: preprocessor token IPPROTO_ICMP redefined ../include/sparse/netinet/in.h:63:9: this was the original definition [...] /usr/include/linux/in.h:28:3: error: bad enum definition /usr/include/linux/in.h:28:3: error: Expected } at end of specifier /usr/include/linux/in.h:28:3: error: got 0 /usr/include/linux/in.h:84:16: error: redefinition of struct in_addr Signed-off-by: Daniele Di Proietto <diproiettod@vmware.com> Tested-by: Joe Stringer <joe@ovn.org> Acked-by: Ben Pfaff <blp@ovn.org>
2016-06-01 18:35:55 -07:00
#ifndef _NETINET_IN_H
#define _NETINET_IN_H 1
#include "openvswitch/types.h"
#include <inttypes.h>
#include <sys/socket.h>
typedef ovs_be16 in_port_t;
typedef ovs_be32 in_addr_t;
struct in_addr {
in_addr_t s_addr;
};
struct sockaddr_in {
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
};
struct in6_addr {
union {
uint8_t u_s6_addr[16];
} u;
};
#define s6_addr u.u_s6_addr
extern const struct in6_addr in6addr_any;
/* Ditto, for IPv6. */
struct sockaddr_in6 {
sa_family_t sin6_family;
in_port_t sin6_port; /* Transport layer port # */
uint32_t sin6_flowinfo; /* IPv6 flow information */
struct in6_addr sin6_addr; /* IPv6 address */
uint32_t sin6_scope_id; /* IPv6 scope-id */
};
#define IPPROTO_IP 0
#define IPPROTO_IPV6 41
#define IPPROTO_HOPOPTS 0
#define IPPROTO_ICMP 1
#define IPPROTO_IGMP 2
#define IPPROTO_TCP 6
#define IPPROTO_UDP 17
#define IPPROTO_ROUTING 43
#define IPPROTO_FRAGMENT 44
#define IPPROTO_GRE 47
Extend sFlow agent to report tunnel and MPLS structures Packets are still sampled at ingress only, so the egress tunnel and/or MPLS structures are only included when there is just 1 output port. The actions are either provided by the datapath in the sample upcall or looked up in the userspace cache. The former is preferred because it is more reliable and does not present any new demands or constraints on the userspace cache, however the code falls back on the userspace lookup so that this solution can work with existing kernel datapath modules. If the lookup fails it is not critical: the compiled user-action-cookie is still available and provides the essential output port and output VLAN forwarding information just as before. The openvswitch actions can express almost any tunneling/mangling so the only totally faithful representation would be to somehow encode the whole list of flow actions in the sFlow output. However the standard sFlow tunnel structures can express most common real-world scenarios, so in parsing the actions we look for those and skip the encoding if we see anything unusual. For example, a single set(tunnel()) or tnl_push() is interpreted, but if a second such action is encountered then the egress tunnel reporting is suppressed. The sFlow standard allows "best effort" encoding so that if a field is not knowable or too onerous to look up then it can be left out. This is often the case for the layer-4 source port or even the src ip address of a tunnel. The assumption is that monitoring is enabled everywhere so a missing field can typically be seen at ingress to the next switch in the path. This patch also adds unit tests to check the sFlow encoding of set(tunnel()), tnl_push() and push_mpls() actions. The netlink attribute to request that actions be included in the upcall from the datapath is inserted for sFlow sampling only. To make that option be explicit would require further changes to the printing and parsing of actions in lib/odp-util.c, and to scripts in the test suite. Further enhancements to report on 802.1AD QinQ, 64-bit tunnel IDs, and NAT transformations can follow in future patches that make only incremental changes. Signed-off-by: Neil McKee <neil.mckee@inmon.com> [blp@nicira.com made stylistic and semantic changes] Signed-off-by: Ben Pfaff <blp@nicira.com>
2015-07-17 21:37:02 -07:00
#define IPPROTO_ESP 50
#define IPPROTO_AH 51
#define IPPROTO_ICMPV6 58
#define IPPROTO_NONE 59
#define IPPROTO_DSTOPTS 60
#define IPPROTO_SCTP 132
#define IPPORT_FTP 21
#define IPPORT_TFTP 69
/* All the IP options documented in Linux ip(7). */
sparse: Fix conflict between netinet/in.h and linux/in.h linux/in.h (from linux uapi headers) carries many of the same definitions as netinet/in.h (from glibc). If linux/in.h is included after netinet/in.h, conflicts are avoided in two ways: 1) linux/libc-compat.h (included by linux/in.h) detects the include guard of netinet/in.h and defines some macros (e.g. __UAPI_DEF_IN_IPPROTO) to 0. linux/in.h avoids exporting the same enums if those macros are 0. 2) The two files are allowed to redefine the same macros as long as the values are the same. Our include/sparse/netinet/in.h creates problems, because: 1) It uses a custom include guard 2) It uses dummy values for some macros. This commit changes include/sparse/netinet/in.h to use the same include guard as glibc netinet/in.h, and to use the same values for some macros. I think this problem is present with linux headers after a263653ed798("netfilter: don't pull include/linux/netfilter.h from netns headers") which cause our lib/netlink-conntrack.c to include linux/in.h after netinet/in.h. sample output from sparse: /usr/include/linux/in.h:29:9: warning: preprocessor token IPPROTO_IP redefined ../include/sparse/netinet/in.h:60:9: this was the original definition /usr/include/linux/in.h:31:9: warning: preprocessor token IPPROTO_ICMP redefined ../include/sparse/netinet/in.h:63:9: this was the original definition [...] /usr/include/linux/in.h:28:3: error: bad enum definition /usr/include/linux/in.h:28:3: error: Expected } at end of specifier /usr/include/linux/in.h:28:3: error: got 0 /usr/include/linux/in.h:84:16: error: redefinition of struct in_addr Signed-off-by: Daniele Di Proietto <diproiettod@vmware.com> Tested-by: Joe Stringer <joe@ovn.org> Acked-by: Ben Pfaff <blp@ovn.org>
2016-06-01 18:35:55 -07:00
#define IP_ADD_MEMBERSHIP 35
#define IP_DROP_MEMBERSHIP 36
#define IP_HDRINCL 3
#define IP_MTU 14
#define IP_MTU_DISCOVER 10
#define IP_MULTICAST_IF 32
#define IP_MULTICAST_LOOP 34
#define IP_MULTICAST_TTL 33
#define IP_NODEFRAG 22
#define IP_OPTIONS 4
#define IP_PKTINFO 8
#define IP_RECVERR 11
sparse: Fix conflict between netinet/in.h and linux/in.h linux/in.h (from linux uapi headers) carries many of the same definitions as netinet/in.h (from glibc). If linux/in.h is included after netinet/in.h, conflicts are avoided in two ways: 1) linux/libc-compat.h (included by linux/in.h) detects the include guard of netinet/in.h and defines some macros (e.g. __UAPI_DEF_IN_IPPROTO) to 0. linux/in.h avoids exporting the same enums if those macros are 0. 2) The two files are allowed to redefine the same macros as long as the values are the same. Our include/sparse/netinet/in.h creates problems, because: 1) It uses a custom include guard 2) It uses dummy values for some macros. This commit changes include/sparse/netinet/in.h to use the same include guard as glibc netinet/in.h, and to use the same values for some macros. I think this problem is present with linux headers after a263653ed798("netfilter: don't pull include/linux/netfilter.h from netns headers") which cause our lib/netlink-conntrack.c to include linux/in.h after netinet/in.h. sample output from sparse: /usr/include/linux/in.h:29:9: warning: preprocessor token IPPROTO_IP redefined ../include/sparse/netinet/in.h:60:9: this was the original definition /usr/include/linux/in.h:31:9: warning: preprocessor token IPPROTO_ICMP redefined ../include/sparse/netinet/in.h:63:9: this was the original definition [...] /usr/include/linux/in.h:28:3: error: bad enum definition /usr/include/linux/in.h:28:3: error: Expected } at end of specifier /usr/include/linux/in.h:28:3: error: got 0 /usr/include/linux/in.h:84:16: error: redefinition of struct in_addr Signed-off-by: Daniele Di Proietto <diproiettod@vmware.com> Tested-by: Joe Stringer <joe@ovn.org> Acked-by: Ben Pfaff <blp@ovn.org>
2016-06-01 18:35:55 -07:00
#define IP_RECVOPTS 6
#define IP_RECVTOS 13
sparse: Fix conflict between netinet/in.h and linux/in.h linux/in.h (from linux uapi headers) carries many of the same definitions as netinet/in.h (from glibc). If linux/in.h is included after netinet/in.h, conflicts are avoided in two ways: 1) linux/libc-compat.h (included by linux/in.h) detects the include guard of netinet/in.h and defines some macros (e.g. __UAPI_DEF_IN_IPPROTO) to 0. linux/in.h avoids exporting the same enums if those macros are 0. 2) The two files are allowed to redefine the same macros as long as the values are the same. Our include/sparse/netinet/in.h creates problems, because: 1) It uses a custom include guard 2) It uses dummy values for some macros. This commit changes include/sparse/netinet/in.h to use the same include guard as glibc netinet/in.h, and to use the same values for some macros. I think this problem is present with linux headers after a263653ed798("netfilter: don't pull include/linux/netfilter.h from netns headers") which cause our lib/netlink-conntrack.c to include linux/in.h after netinet/in.h. sample output from sparse: /usr/include/linux/in.h:29:9: warning: preprocessor token IPPROTO_IP redefined ../include/sparse/netinet/in.h:60:9: this was the original definition /usr/include/linux/in.h:31:9: warning: preprocessor token IPPROTO_ICMP redefined ../include/sparse/netinet/in.h:63:9: this was the original definition [...] /usr/include/linux/in.h:28:3: error: bad enum definition /usr/include/linux/in.h:28:3: error: Expected } at end of specifier /usr/include/linux/in.h:28:3: error: got 0 /usr/include/linux/in.h:84:16: error: redefinition of struct in_addr Signed-off-by: Daniele Di Proietto <diproiettod@vmware.com> Tested-by: Joe Stringer <joe@ovn.org> Acked-by: Ben Pfaff <blp@ovn.org>
2016-06-01 18:35:55 -07:00
#define IP_RECVTTL 12
#define IP_RETOPTS 7
#define IP_ROUTER_ALERT 5
#define IP_TOS 1
#define IP_TTL 2
#define INADDR_ANY 0x00000000
#define INADDR_BROADCAST 0xffffffff
#define INADDR_LOOPBACK 0x7f000001
#define INADDR_NONE 0xffffffff
#define IN6_IS_ADDR_V4MAPPED(X) \
((X)->s6_addr[0] == 0 && \
(X)->s6_addr[1] == 0 && \
(X)->s6_addr[2] == 0 && \
(X)->s6_addr[3] == 0 && \
(X)->s6_addr[4] == 0 && \
(X)->s6_addr[5] == 0 && \
(X)->s6_addr[6] == 0 && \
(X)->s6_addr[7] == 0 && \
(X)->s6_addr[8] == 0 && \
(X)->s6_addr[9] == 0 && \
(X)->s6_addr[10] == 0xff && \
(X)->s6_addr[11] == 0xff)
#define INET_ADDRSTRLEN 16
#define INET6_ADDRSTRLEN 46
#define IPV6_TCLASS 67
static inline ovs_be32 htonl(uint32_t x)
{
return (OVS_FORCE ovs_be32) x;
}
static inline ovs_be16 htons(uint16_t x)
{
return (OVS_FORCE ovs_be16) x;
}
static inline uint32_t ntohl(ovs_be32 x)
{
return (OVS_FORCE uint32_t) x;
}
static inline uint16_t ntohs(ovs_be16 x)
{
return (OVS_FORCE uint16_t) x;
}
in_addr_t inet_addr(const char *);
int inet_aton (const char *, struct in_addr *);
const char *inet_ntop(int, const void *, char *, socklen_t);
int inet_pton(int, const char *, void *);
sparse: Fix conflict between netinet/in.h and linux/in.h linux/in.h (from linux uapi headers) carries many of the same definitions as netinet/in.h (from glibc). If linux/in.h is included after netinet/in.h, conflicts are avoided in two ways: 1) linux/libc-compat.h (included by linux/in.h) detects the include guard of netinet/in.h and defines some macros (e.g. __UAPI_DEF_IN_IPPROTO) to 0. linux/in.h avoids exporting the same enums if those macros are 0. 2) The two files are allowed to redefine the same macros as long as the values are the same. Our include/sparse/netinet/in.h creates problems, because: 1) It uses a custom include guard 2) It uses dummy values for some macros. This commit changes include/sparse/netinet/in.h to use the same include guard as glibc netinet/in.h, and to use the same values for some macros. I think this problem is present with linux headers after a263653ed798("netfilter: don't pull include/linux/netfilter.h from netns headers") which cause our lib/netlink-conntrack.c to include linux/in.h after netinet/in.h. sample output from sparse: /usr/include/linux/in.h:29:9: warning: preprocessor token IPPROTO_IP redefined ../include/sparse/netinet/in.h:60:9: this was the original definition /usr/include/linux/in.h:31:9: warning: preprocessor token IPPROTO_ICMP redefined ../include/sparse/netinet/in.h:63:9: this was the original definition [...] /usr/include/linux/in.h:28:3: error: bad enum definition /usr/include/linux/in.h:28:3: error: Expected } at end of specifier /usr/include/linux/in.h:28:3: error: got 0 /usr/include/linux/in.h:84:16: error: redefinition of struct in_addr Signed-off-by: Daniele Di Proietto <diproiettod@vmware.com> Tested-by: Joe Stringer <joe@ovn.org> Acked-by: Ben Pfaff <blp@ovn.org>
2016-06-01 18:35:55 -07:00
#endif /* <netinet/in.h> */