Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  1/*
  2 * Copyright (c) 2007-2011 Nicira Networks.
  3 *
  4 * This program is free software; you can redistribute it and/or
  5 * modify it under the terms of version 2 of the GNU General Public
  6 * License as published by the Free Software Foundation.
  7 *
  8 * This program is distributed in the hope that it will be useful, but
  9 * WITHOUT ANY WARRANTY; without even the implied warranty of
 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 11 * General Public License for more details.
 12 *
 13 * You should have received a copy of the GNU General Public License
 14 * along with this program; if not, write to the Free Software
 15 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 16 * 02110-1301, USA
 17 */
 18
 19#ifndef DATAPATH_H
 20#define DATAPATH_H 1
 21
 22#include <asm/page.h>
 23#include <linux/kernel.h>
 24#include <linux/mutex.h>
 25#include <linux/netdevice.h>
 26#include <linux/skbuff.h>
 27#include <linux/u64_stats_sync.h>
 28
 29#include "flow.h"
 30
 31struct vport;
 32
 33#define DP_MAX_PORTS 1024
 34#define SAMPLE_ACTION_DEPTH 3
 35
 36/**
 37 * struct dp_stats_percpu - per-cpu packet processing statistics for a given
 38 * datapath.
 39 * @n_hit: Number of received packets for which a matching flow was found in
 40 * the flow table.
 41 * @n_miss: Number of received packets that had no matching flow in the flow
 42 * table.  The sum of @n_hit and @n_miss is the number of packets that have
 43 * been received by the datapath.
 44 * @n_lost: Number of received packets that had no matching flow in the flow
 45 * table that could not be sent to userspace (normally due to an overflow in
 46 * one of the datapath's queues).
 47 */
 48struct dp_stats_percpu {
 49	u64 n_hit;
 50	u64 n_missed;
 51	u64 n_lost;
 52	struct u64_stats_sync sync;
 53};
 54
 55/**
 56 * struct datapath - datapath for flow-based packet switching
 57 * @rcu: RCU callback head for deferred destruction.
 58 * @list_node: Element in global 'dps' list.
 59 * @n_flows: Number of flows currently in flow table.
 60 * @table: Current flow table.  Protected by genl_lock and RCU.
 61 * @ports: Map from port number to &struct vport.  %OVSP_LOCAL port
 62 * always exists, other ports may be %NULL.  Protected by RTNL and RCU.
 63 * @port_list: List of all ports in @ports in arbitrary order.  RTNL required
 64 * to iterate or modify.
 65 * @stats_percpu: Per-CPU datapath statistics.
 66 *
 67 * Context: See the comment on locking at the top of datapath.c for additional
 68 * locking information.
 69 */
 70struct datapath {
 71	struct rcu_head rcu;
 72	struct list_head list_node;
 73
 74	/* Flow table. */
 75	struct flow_table __rcu *table;
 76
 77	/* Switch ports. */
 78	struct vport __rcu *ports[DP_MAX_PORTS];
 79	struct list_head port_list;
 80
 81	/* Stats. */
 82	struct dp_stats_percpu __percpu *stats_percpu;
 83};
 84
 85/**
 86 * struct ovs_skb_cb - OVS data in skb CB
 87 * @flow: The flow associated with this packet.  May be %NULL if no flow.
 88 */
 89struct ovs_skb_cb {
 90	struct sw_flow		*flow;
 91};
 92#define OVS_CB(skb) ((struct ovs_skb_cb *)(skb)->cb)
 93
 94/**
 95 * struct dp_upcall - metadata to include with a packet to send to userspace
 96 * @cmd: One of %OVS_PACKET_CMD_*.
 97 * @key: Becomes %OVS_PACKET_ATTR_KEY.  Must be nonnull.
 98 * @userdata: If nonnull, its u64 value is extracted and passed to userspace as
 99 * %OVS_PACKET_ATTR_USERDATA.
100 * @pid: Netlink PID to which packet should be sent.  If @pid is 0 then no
101 * packet is sent and the packet is accounted in the datapath's @n_lost
102 * counter.
103 */
104struct dp_upcall_info {
105	u8 cmd;
106	const struct sw_flow_key *key;
107	const struct nlattr *userdata;
108	u32 pid;
109};
110
111extern struct notifier_block ovs_dp_device_notifier;
112extern struct genl_multicast_group ovs_dp_vport_multicast_group;
113
114void ovs_dp_process_received_packet(struct vport *, struct sk_buff *);
115void ovs_dp_detach_port(struct vport *);
116int ovs_dp_upcall(struct datapath *, struct sk_buff *,
117		  const struct dp_upcall_info *);
118
119const char *ovs_dp_name(const struct datapath *dp);
120struct sk_buff *ovs_vport_cmd_build_info(struct vport *, u32 pid, u32 seq,
121					 u8 cmd);
122
123int ovs_execute_actions(struct datapath *dp, struct sk_buff *skb);
124#endif /* datapath.h */