Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * Copyright (c) 2007-2017 Nicira, Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) #ifndef FLOW_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) #define FLOW_H 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #include <linux/cache.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #include <linux/netlink.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include <linux/openvswitch.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include <linux/spinlock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include <linux/rcupdate.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #include <linux/if_ether.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #include <linux/in6.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) #include <linux/jiffies.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #include <linux/time.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) #include <linux/cpumask.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) #include <net/inet_ecn.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) #include <net/ip_tunnels.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) #include <net/dst_metadata.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) #include <net/nsh.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) struct sk_buff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) enum sw_flow_mac_proto {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 	MAC_PROTO_NONE = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 	MAC_PROTO_ETHERNET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) #define SW_FLOW_KEY_INVALID	0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) #define MPLS_LABEL_DEPTH       3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) /* Store options at the end of the array if they are less than the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36)  * maximum size. This allows us to get the benefits of variable length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37)  * matching for small options.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) #define TUN_METADATA_OFFSET(opt_len) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 	(sizeof_field(struct sw_flow_key, tun_opts) - opt_len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) #define TUN_METADATA_OPTS(flow_key, opt_len) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	((void *)((flow_key)->tun_opts + TUN_METADATA_OFFSET(opt_len)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) struct ovs_tunnel_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	struct metadata_dst	*tun_dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) struct vlan_head {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	__be16 tpid; /* Vlan type. Generally 802.1q or 802.1ad.*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	__be16 tci;  /* 0 if no VLAN, VLAN_CFI_MASK set otherwise. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) #define OVS_SW_FLOW_KEY_METADATA_SIZE			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	(offsetof(struct sw_flow_key, recirc_id) +	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 	sizeof_field(struct sw_flow_key, recirc_id))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) struct ovs_key_nsh {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	struct ovs_nsh_key_base base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	__be32 context[NSH_MD1_CONTEXT_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) struct sw_flow_key {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	u8 tun_opts[IP_TUNNEL_OPTS_MAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	u8 tun_opts_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	struct ip_tunnel_key tun_key;	/* Encapsulating tunnel key. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 		u32	priority;	/* Packet QoS priority. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 		u32	skb_mark;	/* SKB mark. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 		u16	in_port;	/* Input switch port (or DP_MAX_PORTS). */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	} __packed phy; /* Safe when right after 'tun_key'. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	u8 mac_proto;			/* MAC layer protocol (e.g. Ethernet). */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	u8 tun_proto;			/* Protocol of encapsulating tunnel. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	u32 ovs_flow_hash;		/* Datapath computed hash value.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	u32 recirc_id;			/* Recirculation ID.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 		u8     src[ETH_ALEN];	/* Ethernet source address. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 		u8     dst[ETH_ALEN];	/* Ethernet destination address. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 		struct vlan_head vlan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 		struct vlan_head cvlan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 		__be16 type;		/* Ethernet frame type. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 	} eth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	/* Filling a hole of two bytes. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	u8 ct_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	u8 ct_orig_proto;		/* CT original direction tuple IP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 					 * protocol.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 					 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 		struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 			u8     proto;	/* IP protocol or lower 8 bits of ARP opcode. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 			u8     tos;	    /* IP ToS. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 			u8     ttl;	    /* IP TTL/hop limit. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 			u8     frag;	/* One of OVS_FRAG_TYPE_*. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 		} ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	u16 ct_zone;			/* Conntrack zone. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 		__be16 src;		/* TCP/UDP/SCTP source port. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 		__be16 dst;		/* TCP/UDP/SCTP destination port. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 		__be16 flags;		/* TCP flags. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 	} tp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 		struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 			struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 				__be32 src;	/* IP source address. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 				__be32 dst;	/* IP destination address. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 			} addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 			union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 				struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 					__be32 src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 					__be32 dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 				} ct_orig;	/* Conntrack original direction fields. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 				struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 					u8 sha[ETH_ALEN];	/* ARP source hardware address. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 					u8 tha[ETH_ALEN];	/* ARP target hardware address. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 				} arp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 			};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 		} ipv4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 		struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 			struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 				struct in6_addr src;	/* IPv6 source address. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 				struct in6_addr dst;	/* IPv6 destination address. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 			} addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 			__be32 label;			/* IPv6 flow label. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 			union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 				struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 					struct in6_addr src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 					struct in6_addr dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 				} ct_orig;	/* Conntrack original direction fields. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 				struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 					struct in6_addr target;	/* ND target address. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 					u8 sll[ETH_ALEN];	/* ND source link layer address. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 					u8 tll[ETH_ALEN];	/* ND target link layer address. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 				} nd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 			};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 		} ipv6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 		struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 			u32 num_labels_mask;    /* labels present bitmap of effective length MPLS_LABEL_DEPTH */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 			__be32 lse[MPLS_LABEL_DEPTH];     /* label stack entry  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 		} mpls;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 		struct ovs_key_nsh nsh;         /* network service header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 	struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 		/* Connection tracking fields not packed above. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 		struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 			__be16 src;	/* CT orig tuple tp src port. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 			__be16 dst;	/* CT orig tuple tp dst port. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 		} orig_tp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 		u32 mark;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 		struct ovs_key_ct_labels labels;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 	} ct;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) } __aligned(BITS_PER_LONG/8); /* Ensure that we can do comparisons as longs. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) static inline bool sw_flow_key_is_nd(const struct sw_flow_key *key)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	return key->eth.type == htons(ETH_P_IPV6) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 		key->ip.proto == NEXTHDR_ICMP &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 		key->tp.dst == 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 		(key->tp.src == htons(NDISC_NEIGHBOUR_SOLICITATION) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 		 key->tp.src == htons(NDISC_NEIGHBOUR_ADVERTISEMENT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) struct sw_flow_key_range {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	unsigned short int start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	unsigned short int end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) struct sw_flow_mask {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 	int ref_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 	struct rcu_head rcu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 	struct sw_flow_key_range range;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 	struct sw_flow_key key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) struct sw_flow_match {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 	struct sw_flow_key *key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 	struct sw_flow_key_range range;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	struct sw_flow_mask *mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) #define MAX_UFID_LENGTH 16 /* 128 bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) struct sw_flow_id {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	u32 ufid_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 		u32 ufid[MAX_UFID_LENGTH / 4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 		struct sw_flow_key *unmasked_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) struct sw_flow_actions {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 	struct rcu_head rcu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 	size_t orig_len;	/* From flow_cmd_new netlink actions size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 	u32 actions_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 	struct nlattr actions[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) struct sw_flow_stats {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 	u64 packet_count;		/* Number of packets matched. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 	u64 byte_count;			/* Number of bytes matched. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 	unsigned long used;		/* Last used time (in jiffies). */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 	spinlock_t lock;		/* Lock for atomic stats update. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 	__be16 tcp_flags;		/* Union of seen TCP flags. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) struct sw_flow {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 	struct rcu_head rcu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 	struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 		struct hlist_node node[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 		u32 hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 	} flow_table, ufid_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 	int stats_last_writer;		/* CPU id of the last writer on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 					 * 'stats[0]'.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 					 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 	struct sw_flow_key key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 	struct sw_flow_id id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 	struct cpumask cpu_used_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 	struct sw_flow_mask *mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 	struct sw_flow_actions __rcu *sf_acts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 	struct sw_flow_stats __rcu *stats[]; /* One for each CPU.  First one
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 					   * is allocated at flow creation time,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 					   * the rest are allocated on demand
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 					   * while holding the 'stats[0].lock'.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 					   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) struct arp_eth_header {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 	__be16      ar_hrd;	/* format of hardware address   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 	__be16      ar_pro;	/* format of protocol address   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 	unsigned char   ar_hln;	/* length of hardware address   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 	unsigned char   ar_pln;	/* length of protocol address   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 	__be16      ar_op;	/* ARP opcode (command)     */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 	/* Ethernet+IPv4 specific members. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 	unsigned char       ar_sha[ETH_ALEN];	/* sender hardware address  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 	unsigned char       ar_sip[4];		/* sender IP address        */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 	unsigned char       ar_tha[ETH_ALEN];	/* target hardware address  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 	unsigned char       ar_tip[4];		/* target IP address        */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) static inline u8 ovs_key_mac_proto(const struct sw_flow_key *key)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 	return key->mac_proto & ~SW_FLOW_KEY_INVALID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) static inline u16 __ovs_mac_header_len(u8 mac_proto)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 	return mac_proto == MAC_PROTO_ETHERNET ? ETH_HLEN : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) static inline u16 ovs_mac_header_len(const struct sw_flow_key *key)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 	return __ovs_mac_header_len(ovs_key_mac_proto(key));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) static inline bool ovs_identifier_is_ufid(const struct sw_flow_id *sfid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 	return sfid->ufid_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) static inline bool ovs_identifier_is_key(const struct sw_flow_id *sfid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 	return !ovs_identifier_is_ufid(sfid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) void ovs_flow_stats_update(struct sw_flow *, __be16 tcp_flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 			   const struct sk_buff *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) void ovs_flow_stats_get(const struct sw_flow *, struct ovs_flow_stats *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 			unsigned long *used, __be16 *tcp_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) void ovs_flow_stats_clear(struct sw_flow *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) u64 ovs_flow_used_time(unsigned long flow_jiffies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) int ovs_flow_key_update(struct sk_buff *skb, struct sw_flow_key *key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) int ovs_flow_key_update_l3l4(struct sk_buff *skb, struct sw_flow_key *key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) int ovs_flow_key_extract(const struct ip_tunnel_info *tun_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 			 struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 			 struct sw_flow_key *key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) /* Extract key from packet coming from userspace. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) int ovs_flow_key_extract_userspace(struct net *net, const struct nlattr *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 				   struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 				   struct sw_flow_key *key, bool log);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) #endif /* flow.h */