For SNAT, don't store the pre-fragment L2 header before actions are applied.
[sliver-openvswitch.git] / datapath / datapath.h
index 0b26b4a..867e502 100644 (file)
@@ -3,12 +3,14 @@
 #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"
 
 
 #define OFP_SUPPORTED_CAPABILITIES ( OFPC_FLOW_STATS \
                | OFPC_TABLE_STATS \
                | OFPC_PORT_STATS \
-               | OFPC_STP \
                | OFPC_MULTI_PHY_TX )
 
 /* 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. */
@@ -57,8 +58,11 @@ struct datapath {
        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. */
 };
@@ -70,31 +74,33 @@ struct sender {
        uint32_t seq;           /* Netlink sequence ID of request. */
 };
 
-#define PORT_STATUS_BITS (OFPPFL_PORT_DOWN | OFPPFL_LINK_DOWN)
-#define PORT_FLAG_BITS (~PORT_STATUS_BITS)
-
 struct net_bridge_port {
        u16     port_no;
-       u32 flags;              /* Some subset of PORT_FLAG_BITS. */
-       u32 status;             /* Some subset of PORT_STATUS_BITS. */
+       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 list_head node; /* Element in datapath.ports. */
+       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_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 void *, size_t);
 int dp_update_port_flags(struct datapath *dp, const struct ofp_port_mod *opm);