X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=datapath%2Fdatapath.h;h=28ce0dae4ded0d212cbc3a80e36c640f1c66d2c1;hb=f0d3bc86154e697f4dc03667950319db66517522;hp=8e272836e0d05964d280dd57872d784dda623212;hpb=66cd496a30819638c198c614c5502cf6fa116500;p=openvswitch diff --git a/datapath/datapath.h b/datapath/datapath.h index 8e272836..28ce0dae 100644 --- a/datapath/datapath.h +++ b/datapath/datapath.h @@ -16,13 +16,15 @@ #include #include #include +#include #include #include + +#include "checksum.h" #include "flow.h" #include "dp_sysfs.h" struct vport; -struct dp_port; /* Mask for the priority bits in a vlan header. If we ever merge upstream * then this should go into include/linux/if_vlan.h. */ @@ -30,7 +32,6 @@ struct dp_port; #define VLAN_PCP_SHIFT 13 #define DP_MAX_PORTS 1024 -#define DP_MAX_GROUPS 16 #define DP_N_QUEUES 3 #define DP_MAX_QUEUE_LEN 100 @@ -53,16 +54,12 @@ struct dp_stats_percpu { u64 n_hit; u64 n_missed; u64 n_lost; -}; - -struct dp_port_group { - struct rcu_head rcu; - int n_ports; - u16 ports[]; + seqcount_t seqlock; }; /** * struct datapath - datapath for flow-based packet switching + * @rcu: RCU callback head for deferred destruction. * @mutex: Mutual exclusion for ioctls. * @dp_idx: Datapath number (index into the dps[] array in datapath.c). * @ifobj: Represents /sys/class/net//brif. @@ -70,10 +67,9 @@ struct dp_port_group { * @queues: %DP_N_QUEUES sets of queued packets for userspace to handle. * @waitqueue: Waitqueue, for waiting for new packets in @queues. * @n_flows: Number of flows currently in flow table. - * @table: Current flow table (RCU protected). - * @groups: Port groups, used by ODPAT_OUTPUT_GROUP action (RCU protected). + * @table: Current flow table. * @n_ports: Number of ports currently in @ports. - * @ports: Map from port number to &struct dp_port. %ODPP_LOCAL port + * @ports: Map from port number to &struct vport. %ODPP_LOCAL port * always exists, other ports may be %NULL. * @port_list: List of all ports in @ports in arbitrary order. * @stats_percpu: Per-CPU datapath statistics. @@ -82,6 +78,7 @@ struct dp_port_group { * sampling a given packet. */ struct datapath { + struct rcu_head rcu; struct mutex mutex; int dp_idx; struct kobject ifobj; @@ -93,91 +90,49 @@ struct datapath { wait_queue_head_t waitqueue; /* Flow table. */ - struct tbl *table; - - /* Port groups. */ - struct dp_port_group *groups[DP_MAX_GROUPS]; + struct tbl __rcu *table; /* Switch ports. */ unsigned int n_ports; - struct dp_port *ports[DP_MAX_PORTS]; + struct vport __rcu *ports[DP_MAX_PORTS]; struct list_head port_list; /* Stats. */ - struct dp_stats_percpu *stats_percpu; + struct dp_stats_percpu __percpu *stats_percpu; /* sFlow Sampling */ unsigned int sflow_probability; }; -/** - * struct dp_port - one port within a datapath - * @port_no: Index into @dp's @ports array. - * @dp: Datapath to which this port belongs. - * @vport: The network device attached to this port. The contents depends on - * the device and should be accessed only through the vport_* functions. - * @kobj: Represents /sys/class/net//brport. - * @linkname: The name of the link from /sys/class/net//brif to this - * &struct dp_port. (We keep this around so that we can delete it if the - * device gets renamed.) Set to the null string when no link exists. - * @node: Element in @dp's @port_list. - * @sflow_pool: Number of packets that were candidates for sFlow sampling, - * regardless of whether they were actually chosen and sent down to userspace. - */ -struct dp_port { - u16 port_no; - struct datapath *dp; - struct vport *vport; - struct kobject kobj; - char linkname[IFNAMSIZ]; - struct list_head node; - atomic_t sflow_pool; -}; - -enum csum_type { - OVS_CSUM_NONE = 0, - OVS_CSUM_UNNECESSARY = 1, - OVS_CSUM_COMPLETE = 2, - OVS_CSUM_PARTIAL = 3, -}; - /** * struct ovs_skb_cb - OVS data in skb CB - * @dp_port: The datapath port on which the skb entered the switch. + * @vport: The datapath port on which the skb entered the switch. + * @flow: The flow associated with this packet. May be %NULL if no flow. * @ip_summed: Consistently stores L4 checksumming status across different * kernel versions. - * @tun_id: ID (in network byte order) of the tunnel that encapsulated this - * packet. It is 0 if the packet was not received on a tunnel. + * @tun_id: ID of the tunnel that encapsulated this packet. It is 0 if the + * packet was not received on a tunnel. */ struct ovs_skb_cb { - struct dp_port *dp_port; + struct vport *vport; + struct sw_flow *flow; +#ifdef NEED_CSUM_NORMALIZE enum csum_type ip_summed; - __be32 tun_id; +#endif + __be64 tun_id; }; #define OVS_CB(skb) ((struct ovs_skb_cb *)(skb)->cb) extern struct notifier_block dp_device_notifier; extern int (*dp_ioctl_hook)(struct net_device *dev, struct ifreq *rq, int cmd); -void dp_process_received_packet(struct dp_port *, struct sk_buff *); -int dp_detach_port(struct dp_port *, int may_delete); -int dp_output_control(struct datapath *, struct sk_buff *, int, u32 arg); +void dp_process_received_packet(struct vport *, struct sk_buff *); +int dp_detach_port(struct vport *); +int dp_output_control(struct datapath *, struct sk_buff *, int, u64 arg); int dp_min_mtu(const struct datapath *dp); void set_internal_devs_mtu(const struct datapath *dp); struct datapath *get_dp(int dp_idx); const char *dp_name(const struct datapath *dp); -#if defined(CONFIG_XEN) && defined(HAVE_PROTO_DATA_VALID) -int vswitch_skb_checksum_setup(struct sk_buff *skb); -#else -static inline int vswitch_skb_checksum_setup(struct sk_buff *skb) -{ - return 0; -} -#endif - -void compute_ip_summed(struct sk_buff *skb, bool xmit); -void forward_ip_summed(struct sk_buff *skb); - #endif /* datapath.h */