#ifndef DATAPATH_H
#define DATAPATH_H 1
+#include <linux/kernel.h>
#include <linux/mutex.h>
#include <linux/netlink.h>
#include <linux/netdevice.h>
+#include <linux/workqueue.h>
#include <linux/skbuff.h>
-#include "openflow.h"
+#include "openflow/openflow.h"
+#include "openflow/nicira-ext.h"
#include "flow.h"
/* Actions supported by this implementation. */
#define OFP_SUPPORTED_ACTIONS ( (1 << OFPAT_OUTPUT) \
- | (1 << OFPAT_SET_DL_VLAN) \
+ | (1 << OFPAT_SET_VLAN_VID) \
+ | (1 << OFPAT_SET_VLAN_PCP) \
+ | (1 << OFPAT_STRIP_VLAN) \
| (1 << OFPAT_SET_DL_SRC) \
| (1 << OFPAT_SET_DL_DST) \
| (1 << OFPAT_SET_NW_SRC) \
struct sk_buff;
+#define DP_MAX_PORTS 255
+
struct datapath {
int dp_idx;
- /* Unique identifier for this datapath, incorporates the dp_idx and
- * a hardware address */
- uint64_t id;
-
struct timer_list timer; /* Expiration timer. */
struct sw_chain *chain; /* Forwarding rules. */
struct task_struct *dp_task; /* Kernel thread for maintenance. */
uint16_t flags;
uint16_t miss_send_len;
+ /* Flag controlling whether Flow End messages are generated. */
+ uint8_t send_flow_end;
+
/* Switch ports. */
- struct net_bridge_port *ports[OFPP_MAX];
+ struct net_bridge_port *ports[DP_MAX_PORTS];
struct net_bridge_port *local_port; /* OFPP_LOCAL port. */
struct list_head port_list; /* All ports, including local_port. */
};
uint32_t seq; /* Netlink sequence ID of request. */
};
+struct net_bridge_port {
+ u16 port_no;
+ u32 config; /* Some subset of OFPPC_* flags. */
+ u32 state; /* Some subset of OFPPS_* flags. */
+ spinlock_t lock;
+ struct work_struct port_task;
+ struct datapath *dp;
+ struct net_device *dev;
+ struct snat_conf *snat; /* Only set if SNAT is configured for this port. */
+ struct list_head node; /* Element in datapath.ports. */
+};
+
extern struct mutex dp_mutex;
+extern struct notifier_block dp_device_notifier;
-int dp_output_port(struct datapath *, struct sk_buff *, int out_port);
+int dp_del_switch_port(struct net_bridge_port *);
+int dp_xmit_skb(struct sk_buff *skb);
+int dp_output_port(struct datapath *, struct sk_buff *, int out_port,
+ int ignore_no_fwd);
int dp_output_control(struct datapath *, struct sk_buff *, uint32_t,
size_t, int);
-int dp_set_origin(struct datapath *, uint16_t, struct sk_buff *);
+void dp_set_origin(struct datapath *, uint16_t, struct sk_buff *);
int dp_send_features_reply(struct datapath *, const struct sender *);
int dp_send_config_reply(struct datapath *, const struct sender *);
-int dp_send_flow_expired(struct datapath *, struct sw_flow *,
- enum ofp_flow_expired_reason);
+int dp_send_port_status(struct net_bridge_port *p, uint8_t status);
+int dp_send_flow_end(struct datapath *, struct sw_flow *,
+ enum nx_flow_end_reason);
int dp_send_error_msg(struct datapath *, const struct sender *,
- uint16_t, uint16_t, const uint8_t *, size_t);
+ uint16_t, uint16_t, const void *, size_t);
int dp_update_port_flags(struct datapath *dp, const struct ofp_port_mod *opm);
int dp_send_echo_reply(struct datapath *, const struct sender *,
const struct ofp_header *);
+int dp_send_hello(struct datapath *, const struct sender *,
+ const struct ofp_header *);
/* Should hold at least RCU read lock when calling */
struct datapath *dp_get(int dp_idx);