meta-flow: Correctly set destination MAC in mf_set_flow_value().
[sliver-openvswitch.git] / datapath / tunnel.h
index b3e21fa..6865ae6 100644 (file)
@@ -1,9 +1,19 @@
 /*
- * Copyright (c) 2010, 2011 Nicira Networks.
- * Distributed under the terms of the GNU GPL version 2.
+ * Copyright (c) 2007-2011 Nicira Networks.
  *
- * Significant portions of this file may be copied from parts of the Linux
- * kernel, by Linus Torvalds and others.
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA
  */
 
 #ifndef TUNNEL_H
 /* These flags are only needed when calling tnl_find_port(). */
 #define TNL_T_KEY_EXACT                (1 << 10)
 #define TNL_T_KEY_MATCH                (1 << 11)
-#define TNL_T_KEY_EITHER       (TNL_T_KEY_EXACT | TNL_T_KEY_MATCH)
 
 /* Private flags not exposed to userspace in this form. */
-#define TNL_F_IN_KEY_MATCH      (1 << 16) /* Store the key in tun_id to match in flow table. */
-#define TNL_F_OUT_KEY_ACTION   (1 << 17) /* Get the key from a SET_TUNNEL action. */
+#define TNL_F_IN_KEY_MATCH     (1 << 16) /* Store the key in tun_id to
+                                          * match in flow table. */
+#define TNL_F_OUT_KEY_ACTION   (1 << 17) /* Get the key from a SET_TUNNEL
+                                          * action. */
 
 /* All public tunnel flags. */
 #define TNL_F_PUBLIC (TNL_F_CSUM | TNL_F_TOS_INHERIT | TNL_F_TTL_INHERIT | \
@@ -58,6 +69,9 @@ struct port_lookup_key {
        u32    tunnel_type;
 };
 
+#define PORT_KEY_LEN   (offsetof(struct port_lookup_key, tunnel_type) + \
+                        FIELD_SIZEOF(struct port_lookup_key, tunnel_type))
+
 /**
  * struct tnl_mutable_config - modifiable configuration for a tunnel.
  * @key: Used as key for tunnel port.  Configured via OVS_TUNNEL_ATTR_*
@@ -87,6 +101,9 @@ struct tnl_mutable_config {
        u32     flags;
        u8      tos;
        u8      ttl;
+
+       /* Multicast configuration. */
+       int     mlink;
 };
 
 struct tnl_ops {
@@ -146,8 +163,10 @@ struct tnl_cache {
        struct rcu_head rcu;
 
        int len;                /* Length of data to be memcpy'd from cache. */
+       int hh_len;             /* Hardware hdr length, cached from hh_cache. */
 
-       /* Sequence number of mutable->seq from which this cache was generated. */
+       /* Sequence number of mutable->seq from which this cache was
+        * generated. */
        unsigned mutable_seq;
 
 #ifdef HAVE_HH_SEQ
@@ -210,7 +229,7 @@ struct tnl_vport {
        atomic_t frag_id;
 
        spinlock_t cache_lock;
-       struct tnl_cache __rcu *cache;          /* Protected by RCU/cache_lock. */
+       struct tnl_cache __rcu *cache;  /* Protected by RCU/cache_lock. */
 
 #ifdef NEED_CACHE_TIMEOUT
        /*
@@ -223,33 +242,32 @@ struct tnl_vport {
 #endif
 };
 
-struct vport *tnl_create(const struct vport_parms *, const struct vport_ops *,
-                        const struct tnl_ops *);
-void tnl_destroy(struct vport *);
-
-int tnl_set_options(struct vport *, struct nlattr *);
-int tnl_get_options(const struct vport *, struct sk_buff *);
-
-int tnl_set_addr(struct vport *vport, const unsigned char *addr);
-const char *tnl_get_name(const struct vport *vport);
-const unsigned char *tnl_get_addr(const struct vport *vport);
-int tnl_send(struct vport *vport, struct sk_buff *skb);
-void tnl_rcv(struct vport *vport, struct sk_buff *skb, u8 tos);
-
-struct vport *tnl_find_port(__be32 saddr, __be32 daddr, __be64 key,
-                           int tunnel_type,
-                           const struct tnl_mutable_config **mutable);
-bool tnl_frag_needed(struct vport *vport,
-                    const struct tnl_mutable_config *mutable,
-                    struct sk_buff *skb, unsigned int mtu, __be64 flow_key);
-void tnl_free_linked_skbs(struct sk_buff *skb);
-
-int tnl_init(void);
-void tnl_exit(void);
+struct vport *ovs_tnl_create(const struct vport_parms *, const struct vport_ops *,
+                            const struct tnl_ops *);
+void ovs_tnl_destroy(struct vport *);
+
+int ovs_tnl_set_options(struct vport *, struct nlattr *);
+int ovs_tnl_get_options(const struct vport *, struct sk_buff *);
+
+int ovs_tnl_set_addr(struct vport *vport, const unsigned char *addr);
+const char *ovs_tnl_get_name(const struct vport *vport);
+const unsigned char *ovs_tnl_get_addr(const struct vport *vport);
+int ovs_tnl_send(struct vport *vport, struct sk_buff *skb);
+void ovs_tnl_rcv(struct vport *vport, struct sk_buff *skb, u8 tos);
+
+struct vport *ovs_tnl_find_port(__be32 saddr, __be32 daddr, __be64 key,
+                               int tunnel_type,
+                               const struct tnl_mutable_config **mutable);
+bool ovs_tnl_frag_needed(struct vport *vport,
+                        const struct tnl_mutable_config *mutable,
+                        struct sk_buff *skb, unsigned int mtu, __be64 flow_key);
+void ovs_tnl_free_linked_skbs(struct sk_buff *skb);
+
+int ovs_tnl_init(void);
+void ovs_tnl_exit(void);
 static inline struct tnl_vport *tnl_vport_priv(const struct vport *vport)
 {
        return vport_priv(vport);
 }
 
-
 #endif /* tunnel.h */