#include "compiler.h"
#include "geneve.h"
#include "openvswitch/types.h"
+#include "odp-netlink.h"
#include "random.h"
#include "hash.h"
#include "tun-metadata.h"
+#include "unaligned.h"
#include "util.h"
struct dp_packet;
action. */
uint32_t skb_priority; /* Packet priority for QoS. */
uint32_t pkt_mark; /* Packet mark. */
+ uint16_t ct_state; /* Connection state. */
+ uint16_t ct_zone; /* Connection zone. */
+ uint32_t ct_mark; /* Connection mark. */
+ ovs_u128 ct_label; /* Connection label. */
union flow_in_port in_port; /* Input port. */
struct flow_tnl tunnel; /* Encapsulating tunnel parameters. Note that
* if 'ip_dst' == 0, the rest of the fields may
/* It can be expensive to zero out all of the tunnel metadata. However,
* we can just zero out ip_dst and the rest of the data will never be
* looked at. */
- memset(md, 0, offsetof(struct pkt_metadata, tunnel));
+ memset(md, 0, offsetof(struct pkt_metadata, in_port));
md->tunnel.ip_dst = 0;
md->in_port.odp_port = port;
static inline void eth_addr_from_uint64(uint64_t x, struct eth_addr *ea)
{
ea->be16[0] = htons(x >> 32);
- ea->be16[1] = htons(x >> 16);
- ea->be16[2] = htons(x);
+ ea->be16[1] = htons((x & 0xFFFF0000) >> 16);
+ ea->be16[2] = htons(x & 0xFFFF);
}
static inline struct eth_addr eth_addr_invert(const struct eth_addr src)
*/
#define ETH_ADDR_FMT \
"%02"PRIx8":%02"PRIx8":%02"PRIx8":%02"PRIx8":%02"PRIx8":%02"PRIx8
-#define ETH_ADDR_ARGS(EA) \
- (EA).ea[0], (EA).ea[1], (EA).ea[2], (EA).ea[3], (EA).ea[4], (EA).ea[5]
+#define ETH_ADDR_ARGS(EA) ETH_ADDR_BYTES_ARGS((EA).ea)
+#define ETH_ADDR_BYTES_ARGS(EAB) \
+ (EAB)[0], (EAB)[1], (EAB)[2], (EAB)[3], (EAB)[4], (EAB)[5]
/* Example:
*
};
BUILD_ASSERT_DECL(TCP_HEADER_LEN == sizeof(struct tcp_header));
+/* Connection states */
+#define CS_NEW 0x01
+#define CS_ESTABLISHED 0x02
+#define CS_RELATED 0x04
+#define CS_INVALID 0x20
+#define CS_REPLY_DIR 0x40
+#define CS_TRACKED 0x80
+
+/* Undefined connection state bits. */
+#define CS_SUPPORTED_MASK (CS_NEW | CS_ESTABLISHED | CS_RELATED \
+ | CS_INVALID | CS_REPLY_DIR | CS_TRACKED)
+#define CS_UNSUPPORTED_MASK (~(uint32_t)CS_SUPPORTED_MASK)
+
#define ARP_HRD_ETHERNET 1
#define ARP_PRO_IP 0x0800
#define ARP_OP_REQUEST 1
return ipv6_addr_equals(addr, &in6addr_all_hosts);
}
+static inline bool ipv6_addr_is_set(const struct in6_addr *addr) {
+ return !ipv6_addr_equals(addr, &in6addr_any);
+}
+
+static inline bool ipv6_addr_is_multicast(const struct in6_addr *ip) {
+ return ip->s6_addr[0] == 0xff;
+}
+
+static inline void
+in6_addr_set_mapped_ipv4(struct in6_addr *addr, ovs_be32 ip4)
+{
+ union ovs_16aligned_in6_addr *taddr = (void *) addr;
+ memset(taddr->be16, 0, sizeof(taddr->be16));
+ taddr->be16[5] = OVS_BE16_MAX;
+ put_16aligned_be32(&taddr->be32[3], ip4);
+}
+
+static inline ovs_be32
+in6_addr_get_mapped_ipv4(const struct in6_addr *addr)
+{
+ union ovs_16aligned_in6_addr *taddr = (void *) addr;
+ if (IN6_IS_ADDR_V4MAPPED(addr)) {
+ return get_16aligned_be32(&taddr->be32[3]);
+ } else {
+ return INADDR_ANY;
+ }
+}
+
static inline bool dl_type_is_ip_any(ovs_be16 dl_type)
{
return dl_type == htons(ETH_TYPE_IP)