diff options
| author | Ben Pfaff <blp@nicira.com> | 2011-01-26 12:28:59 -0800 |
|---|---|---|
| committer | Ben Pfaff <blp@nicira.com> | 2011-01-27 21:08:37 -0800 |
| commit | c19e653509deb3f1002c4ed99714e16549ec74e9 (patch) | |
| tree | 099ccf3353b072d43b4514aa69502127fe53044d /datapath/tunnel.h | |
| parent | 7897d3fa21ec370997e4f108b01de2664bec0a67 (diff) | |
| download | openvswitch-c19e653509deb3f1002c4ed99714e16549ec74e9.tar.gz | |
datapath: Change userspace vport interface to use Netlink attributes.
One of the goals for Open vSwitch is to decouple kernel and userspace
software, so that either one can be upgraded or rolled back independent of
the other. To do this in full generality, it must be possible to add new
features to the kernel vport layer without changing userspace software.
The customary way to do this in the Linux networking stack is to use
Netlink and in particular Netlink attributes. This commit adopts that
model for the vport layer. It does not yet actually start using the
Netlink socket layer, which will come later.
Signed-off-by: Ben Pfaff <blp@nicira.com>
Acked-by: Jesse Gross <jesse@nicira.com>
Diffstat (limited to 'datapath/tunnel.h')
| -rw-r--r-- | datapath/tunnel.h | 50 |
1 files changed, 42 insertions, 8 deletions
diff --git a/datapath/tunnel.h b/datapath/tunnel.h index 29f592250..c3bc8ddc1 100644 --- a/datapath/tunnel.h +++ b/datapath/tunnel.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010 Nicira Networks. + * Copyright (c) 2010, 2011 Nicira Networks. * Distributed under the terms of the GNU GPL version 2. * * Significant portions of this file may be copied from parts of the Linux @@ -36,18 +36,50 @@ #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. */ + +/* All public tunnel flags. */ +#define TNL_F_PUBLIC (TNL_F_CSUM | TNL_F_TOS_INHERIT | TNL_F_TTL_INHERIT | \ + TNL_F_PMTUD | TNL_F_HDR_CACHE | TNL_F_IPSEC) + +/** + * struct tnl_mutable_config - modifiable configuration for a tunnel. + * @rcu: RCU callback head for deferred destruction. + * @seq: Sequence number for distinguishing configuration versions. + * @tunnel_type: Set of TNL_T_* flags that define lookup. + * @tunnel_hlen: Tunnel header length. + * @eth_addr: Source address for packets generated by tunnel itself + * (e.g. ICMP fragmentation needed messages). + * @mtu: MTU of tunnel. + * @in_key: Key to match on input, 0 for wildcard. + * @out_key: Key to use on output, 0 if this tunnel has no fixed output key. + * @flags: TNL_F_* flags. + * @saddr: IPv4 source address to match, 0 to accept any source address. + * @daddr: IPv4 destination of tunnel. + * @tos: IPv4 TOS value to use for tunnel, 0 if no fixed TOS. + * @ttl: IPv4 TTL value to use for tunnel, 0 if no fixed TTL. + */ struct tnl_mutable_config { struct rcu_head rcu; - unsigned seq; /* Sequence number to identify this config. */ + unsigned seq; - u32 tunnel_type; /* Set of TNL_T_* flags that define lookup. */ - unsigned tunnel_hlen; /* Tunnel header length. */ + u32 tunnel_type; + unsigned tunnel_hlen; unsigned char eth_addr[ETH_ALEN]; unsigned mtu; - struct tnl_port_config port_config; + /* Configured via ODP_TUNNEL_ATTR_* attributes. */ + __be64 in_key; + __be64 out_key; + u32 flags; + __be32 saddr; + __be32 daddr; + u8 tos; + u8 ttl; }; struct tnl_ops { @@ -59,7 +91,7 @@ struct tnl_ops { * build_header() (i.e. excludes the IP header). Returns a negative * error code if the configuration is invalid. */ - int (*hdr_len)(const struct tnl_port_config *); + int (*hdr_len)(const struct tnl_mutable_config *); /* * Builds the static portion of the tunnel header, which is stored in @@ -186,13 +218,15 @@ struct tnl_vport { struct vport *tnl_create(const struct vport_parms *, const struct vport_ops *, const struct tnl_ops *); -int tnl_modify(struct vport *, struct odp_port *); int 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_mtu(struct vport *vport, int mtu); 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); -void tnl_get_config(const struct vport *vport, void *config); int tnl_get_mtu(const struct vport *vport); int tnl_send(struct vport *vport, struct sk_buff *skb); void tnl_rcv(struct vport *vport, struct sk_buff *skb); |
