mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-28 01:21:58 +00:00
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: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
86feff3f3e
5 changed files with 19 additions and 26 deletions
|
@ -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 {
|
||||||
* 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 {
|
||||||
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 {
|
||||||
* 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,
|
||||||
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,
|
||||||
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)
|
||||||
{
|
{
|
||||||
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,
|
||||||
|
|
||||||
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 {
|
||||||
* 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
|
||||||
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 = {
|
||||||
.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)
|
||||||
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 {
|
||||||
/**
|
/**
|
||||||
* 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 {
|
||||||
*/
|
*/
|
||||||
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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue