提交 86feff3f 编写于 作者: D David S. Miller

Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/jesse/openvswitch

Conflicts:
	net/openvswitch/vport-internal_dev.c

Jesse Gross says:

====================
A couple of minor enhancements for net-next/3.10.  The largest is an
extension to allow variable length metadata to be passed to userspace
with packets.

There is a merge conflict in net/openvswitch/vport-internal_dev.c:
A existing commit modifies internal_dev_mac_addr() and a new commit
deletes it.  The new one is correct, so you can just remove that function.
====================
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
...@@ -94,7 +94,7 @@ struct ovs_vport_stats { ...@@ -94,7 +94,7 @@ struct ovs_vport_stats {
}; };
/* Fixed logical ports. */ /* Fixed logical ports. */
#define OVSP_LOCAL ((__u16)0) #define OVSP_LOCAL ((__u32)0)
/* Packet transfer. */ /* Packet transfer. */
...@@ -127,7 +127,8 @@ enum ovs_packet_cmd { ...@@ -127,7 +127,8 @@ enum ovs_packet_cmd {
* for %OVS_PACKET_CMD_EXECUTE. It has nested %OVS_ACTION_ATTR_* attributes. * for %OVS_PACKET_CMD_EXECUTE. It has nested %OVS_ACTION_ATTR_* attributes.
* @OVS_PACKET_ATTR_USERDATA: Present for an %OVS_PACKET_CMD_ACTION * @OVS_PACKET_ATTR_USERDATA: Present for an %OVS_PACKET_CMD_ACTION
* notification if the %OVS_ACTION_ATTR_USERSPACE action specified an * notification if the %OVS_ACTION_ATTR_USERSPACE action specified an
* %OVS_USERSPACE_ATTR_USERDATA attribute. * %OVS_USERSPACE_ATTR_USERDATA attribute, with the same length and content
* specified there.
* *
* These attributes follow the &struct ovs_header within the Generic Netlink * These attributes follow the &struct ovs_header within the Generic Netlink
* payload for %OVS_PACKET_* commands. * payload for %OVS_PACKET_* commands.
...@@ -137,7 +138,7 @@ enum ovs_packet_attr { ...@@ -137,7 +138,7 @@ enum ovs_packet_attr {
OVS_PACKET_ATTR_PACKET, /* Packet data. */ OVS_PACKET_ATTR_PACKET, /* Packet data. */
OVS_PACKET_ATTR_KEY, /* Nested OVS_KEY_ATTR_* attributes. */ OVS_PACKET_ATTR_KEY, /* Nested OVS_KEY_ATTR_* attributes. */
OVS_PACKET_ATTR_ACTIONS, /* Nested OVS_ACTION_ATTR_* attributes. */ OVS_PACKET_ATTR_ACTIONS, /* Nested OVS_ACTION_ATTR_* attributes. */
OVS_PACKET_ATTR_USERDATA, /* u64 OVS_ACTION_ATTR_USERSPACE arg. */ OVS_PACKET_ATTR_USERDATA, /* OVS_ACTION_ATTR_USERSPACE arg. */
__OVS_PACKET_ATTR_MAX __OVS_PACKET_ATTR_MAX
}; };
...@@ -389,13 +390,13 @@ enum ovs_sample_attr { ...@@ -389,13 +390,13 @@ enum ovs_sample_attr {
* enum ovs_userspace_attr - Attributes for %OVS_ACTION_ATTR_USERSPACE action. * enum ovs_userspace_attr - Attributes for %OVS_ACTION_ATTR_USERSPACE action.
* @OVS_USERSPACE_ATTR_PID: u32 Netlink PID to which the %OVS_PACKET_CMD_ACTION * @OVS_USERSPACE_ATTR_PID: u32 Netlink PID to which the %OVS_PACKET_CMD_ACTION
* message should be sent. Required. * message should be sent. Required.
* @OVS_USERSPACE_ATTR_USERDATA: If present, its u64 argument is copied to the * @OVS_USERSPACE_ATTR_USERDATA: If present, its variable-length argument is
* %OVS_PACKET_CMD_ACTION message as %OVS_PACKET_ATTR_USERDATA, * copied to the %OVS_PACKET_CMD_ACTION message as %OVS_PACKET_ATTR_USERDATA.
*/ */
enum ovs_userspace_attr { enum ovs_userspace_attr {
OVS_USERSPACE_ATTR_UNSPEC, OVS_USERSPACE_ATTR_UNSPEC,
OVS_USERSPACE_ATTR_PID, /* u32 Netlink PID to receive upcalls. */ OVS_USERSPACE_ATTR_PID, /* u32 Netlink PID to receive upcalls. */
OVS_USERSPACE_ATTR_USERDATA, /* u64 optional user-specified cookie. */ OVS_USERSPACE_ATTR_USERDATA, /* Optional user-specified cookie. */
__OVS_USERSPACE_ATTR_MAX __OVS_USERSPACE_ATTR_MAX
}; };
......
...@@ -369,8 +369,8 @@ static int queue_userspace_packet(struct net *net, int dp_ifindex, ...@@ -369,8 +369,8 @@ static int queue_userspace_packet(struct net *net, int dp_ifindex,
len = sizeof(struct ovs_header); len = sizeof(struct ovs_header);
len += nla_total_size(skb->len); len += nla_total_size(skb->len);
len += nla_total_size(FLOW_BUFSIZE); len += nla_total_size(FLOW_BUFSIZE);
if (upcall_info->cmd == OVS_PACKET_CMD_ACTION) if (upcall_info->userdata)
len += nla_total_size(8); len += NLA_ALIGN(upcall_info->userdata->nla_len);
user_skb = genlmsg_new(len, GFP_ATOMIC); user_skb = genlmsg_new(len, GFP_ATOMIC);
if (!user_skb) { if (!user_skb) {
...@@ -387,8 +387,9 @@ static int queue_userspace_packet(struct net *net, int dp_ifindex, ...@@ -387,8 +387,9 @@ static int queue_userspace_packet(struct net *net, int dp_ifindex,
nla_nest_end(user_skb, nla); nla_nest_end(user_skb, nla);
if (upcall_info->userdata) if (upcall_info->userdata)
nla_put_u64(user_skb, OVS_PACKET_ATTR_USERDATA, __nla_put(user_skb, OVS_PACKET_ATTR_USERDATA,
nla_get_u64(upcall_info->userdata)); nla_len(upcall_info->userdata),
nla_data(upcall_info->userdata));
nla = __nla_reserve(user_skb, OVS_PACKET_ATTR_PACKET, skb->len); nla = __nla_reserve(user_skb, OVS_PACKET_ATTR_PACKET, skb->len);
...@@ -543,7 +544,7 @@ static int validate_userspace(const struct nlattr *attr) ...@@ -543,7 +544,7 @@ static int validate_userspace(const struct nlattr *attr)
{ {
static const struct nla_policy userspace_policy[OVS_USERSPACE_ATTR_MAX + 1] = { static const struct nla_policy userspace_policy[OVS_USERSPACE_ATTR_MAX + 1] = {
[OVS_USERSPACE_ATTR_PID] = {.type = NLA_U32 }, [OVS_USERSPACE_ATTR_PID] = {.type = NLA_U32 },
[OVS_USERSPACE_ATTR_USERDATA] = {.type = NLA_U64 }, [OVS_USERSPACE_ATTR_USERDATA] = {.type = NLA_UNSPEC },
}; };
struct nlattr *a[OVS_USERSPACE_ATTR_MAX + 1]; struct nlattr *a[OVS_USERSPACE_ATTR_MAX + 1];
int error; int error;
...@@ -1627,7 +1628,7 @@ static struct vport *lookup_vport(struct net *net, ...@@ -1627,7 +1628,7 @@ static struct vport *lookup_vport(struct net *net,
vport = ovs_vport_rtnl_rcu(dp, port_no); vport = ovs_vport_rtnl_rcu(dp, port_no);
if (!vport) if (!vport)
return ERR_PTR(-ENOENT); return ERR_PTR(-ENODEV);
return vport; return vport;
} else } else
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
......
...@@ -119,7 +119,7 @@ struct ovs_skb_cb { ...@@ -119,7 +119,7 @@ struct ovs_skb_cb {
* struct dp_upcall - metadata to include with a packet to send to userspace * struct dp_upcall - metadata to include with a packet to send to userspace
* @cmd: One of %OVS_PACKET_CMD_*. * @cmd: One of %OVS_PACKET_CMD_*.
* @key: Becomes %OVS_PACKET_ATTR_KEY. Must be nonnull. * @key: Becomes %OVS_PACKET_ATTR_KEY. Must be nonnull.
* @userdata: If nonnull, its u64 value is extracted and passed to userspace as * @userdata: If nonnull, its variable-length value is passed to userspace as
* %OVS_PACKET_ATTR_USERDATA. * %OVS_PACKET_ATTR_USERDATA.
* @pid: Netlink PID to which packet should be sent. If @pid is 0 then no * @pid: Netlink PID to which packet should be sent. If @pid is 0 then no
* packet is sent and the packet is accounted in the datapath's @n_lost * packet is sent and the packet is accounted in the datapath's @n_lost
......
...@@ -63,16 +63,6 @@ static struct rtnl_link_stats64 *internal_dev_get_stats(struct net_device *netde ...@@ -63,16 +63,6 @@ static struct rtnl_link_stats64 *internal_dev_get_stats(struct net_device *netde
return stats; return stats;
} }
static int internal_dev_mac_addr(struct net_device *dev, void *p)
{
struct sockaddr *addr = p;
if (!is_valid_ether_addr(addr->sa_data))
return -EADDRNOTAVAIL;
memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
return 0;
}
/* Called with rcu_read_lock_bh. */ /* Called with rcu_read_lock_bh. */
static int internal_dev_xmit(struct sk_buff *skb, struct net_device *netdev) static int internal_dev_xmit(struct sk_buff *skb, struct net_device *netdev)
{ {
...@@ -126,7 +116,7 @@ static const struct net_device_ops internal_dev_netdev_ops = { ...@@ -126,7 +116,7 @@ static const struct net_device_ops internal_dev_netdev_ops = {
.ndo_open = internal_dev_open, .ndo_open = internal_dev_open,
.ndo_stop = internal_dev_stop, .ndo_stop = internal_dev_stop,
.ndo_start_xmit = internal_dev_xmit, .ndo_start_xmit = internal_dev_xmit,
.ndo_set_mac_address = internal_dev_mac_addr, .ndo_set_mac_address = eth_mac_addr,
.ndo_change_mtu = internal_dev_change_mtu, .ndo_change_mtu = internal_dev_change_mtu,
.ndo_get_stats64 = internal_dev_get_stats, .ndo_get_stats64 = internal_dev_get_stats,
}; };
...@@ -138,6 +128,7 @@ static void do_setup(struct net_device *netdev) ...@@ -138,6 +128,7 @@ static void do_setup(struct net_device *netdev)
netdev->netdev_ops = &internal_dev_netdev_ops; netdev->netdev_ops = &internal_dev_netdev_ops;
netdev->priv_flags &= ~IFF_TX_SKB_SHARING; netdev->priv_flags &= ~IFF_TX_SKB_SHARING;
netdev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
netdev->destructor = internal_dev_destructor; netdev->destructor = internal_dev_destructor;
SET_ETHTOOL_OPS(netdev, &internal_dev_ethtool_ops); SET_ETHTOOL_OPS(netdev, &internal_dev_ethtool_ops);
netdev->tx_queue_len = 0; netdev->tx_queue_len = 0;
......
...@@ -68,10 +68,10 @@ struct vport_err_stats { ...@@ -68,10 +68,10 @@ struct vport_err_stats {
/** /**
* struct vport - one port within a datapath * struct vport - one port within a datapath
* @rcu: RCU callback head for deferred destruction. * @rcu: RCU callback head for deferred destruction.
* @port_no: Index into @dp's @ports array.
* @dp: Datapath to which this port belongs. * @dp: Datapath to which this port belongs.
* @upcall_portid: The Netlink port to use for packets received on this port that * @upcall_portid: The Netlink port to use for packets received on this port that
* miss the flow table. * miss the flow table.
* @port_no: Index into @dp's @ports array.
* @hash_node: Element in @dev_table hash table in vport.c. * @hash_node: Element in @dev_table hash table in vport.c.
* @dp_hash_node: Element in @datapath->ports hash table in datapath.c. * @dp_hash_node: Element in @datapath->ports hash table in datapath.c.
* @ops: Class structure. * @ops: Class structure.
...@@ -81,9 +81,9 @@ struct vport_err_stats { ...@@ -81,9 +81,9 @@ struct vport_err_stats {
*/ */
struct vport { struct vport {
struct rcu_head rcu; struct rcu_head rcu;
u16 port_no;
struct datapath *dp; struct datapath *dp;
u32 upcall_portid; u32 upcall_portid;
u16 port_no;
struct hlist_node hash_node; struct hlist_node hash_node;
struct hlist_node dp_hash_node; struct hlist_node dp_hash_node;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册