diff options
author | Alex Wang <alexw@nicira.com> | 2014-07-17 18:14:13 -0400 |
---|---|---|
committer | Pravin B Shelar <pshelar@nicira.com> | 2014-07-24 04:15:04 -0400 |
commit | 5cd667b0a4567048bb555927d6ee564f4e5620a9 (patch) | |
tree | 34fc874b8e4e7ad420c25712bcc62039ede0337a /net/openvswitch/datapath.c | |
parent | f6e675324481c56b358091ddb446b2c95a8e047b (diff) |
openvswitch: Allow each vport to have an array of 'port_id's.
In order to allow handlers directly read upcalls from datapath,
we need to support per-handler netlink socket for each vport in
datapath. This commit makes this happen. Also, it is guaranteed
to be backward compatible with previous branch.
Signed-off-by: Alex Wang <alexw@nicira.com>
Acked-by: Thomas Graf <tgraf@redhat.com>
Signed-off-by: Pravin B Shelar <pshelar@nicira.com>
Diffstat (limited to 'net/openvswitch/datapath.c')
-rw-r--r-- | net/openvswitch/datapath.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index 20f59b62721a..65a8e5c089e4 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c | |||
@@ -266,7 +266,7 @@ void ovs_dp_process_received_packet(struct vport *p, struct sk_buff *skb) | |||
266 | upcall.cmd = OVS_PACKET_CMD_MISS; | 266 | upcall.cmd = OVS_PACKET_CMD_MISS; |
267 | upcall.key = &key; | 267 | upcall.key = &key; |
268 | upcall.userdata = NULL; | 268 | upcall.userdata = NULL; |
269 | upcall.portid = p->upcall_portid; | 269 | upcall.portid = ovs_vport_find_upcall_portid(p, skb); |
270 | ovs_dp_upcall(dp, skb, &upcall); | 270 | ovs_dp_upcall(dp, skb, &upcall); |
271 | consume_skb(skb); | 271 | consume_skb(skb); |
272 | stats_counter = &stats->n_missed; | 272 | stats_counter = &stats->n_missed; |
@@ -1373,7 +1373,7 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info) | |||
1373 | parms.options = NULL; | 1373 | parms.options = NULL; |
1374 | parms.dp = dp; | 1374 | parms.dp = dp; |
1375 | parms.port_no = OVSP_LOCAL; | 1375 | parms.port_no = OVSP_LOCAL; |
1376 | parms.upcall_portid = nla_get_u32(a[OVS_DP_ATTR_UPCALL_PID]); | 1376 | parms.upcall_portids = a[OVS_DP_ATTR_UPCALL_PID]; |
1377 | 1377 | ||
1378 | ovs_dp_change(dp, a); | 1378 | ovs_dp_change(dp, a); |
1379 | 1379 | ||
@@ -1632,8 +1632,8 @@ static int ovs_vport_cmd_fill_info(struct vport *vport, struct sk_buff *skb, | |||
1632 | 1632 | ||
1633 | if (nla_put_u32(skb, OVS_VPORT_ATTR_PORT_NO, vport->port_no) || | 1633 | if (nla_put_u32(skb, OVS_VPORT_ATTR_PORT_NO, vport->port_no) || |
1634 | nla_put_u32(skb, OVS_VPORT_ATTR_TYPE, vport->ops->type) || | 1634 | nla_put_u32(skb, OVS_VPORT_ATTR_TYPE, vport->ops->type) || |
1635 | nla_put_string(skb, OVS_VPORT_ATTR_NAME, vport->ops->get_name(vport)) || | 1635 | nla_put_string(skb, OVS_VPORT_ATTR_NAME, |
1636 | nla_put_u32(skb, OVS_VPORT_ATTR_UPCALL_PID, vport->upcall_portid)) | 1636 | vport->ops->get_name(vport))) |
1637 | goto nla_put_failure; | 1637 | goto nla_put_failure; |
1638 | 1638 | ||
1639 | ovs_vport_get_stats(vport, &vport_stats); | 1639 | ovs_vport_get_stats(vport, &vport_stats); |
@@ -1641,6 +1641,9 @@ static int ovs_vport_cmd_fill_info(struct vport *vport, struct sk_buff *skb, | |||
1641 | &vport_stats)) | 1641 | &vport_stats)) |
1642 | goto nla_put_failure; | 1642 | goto nla_put_failure; |
1643 | 1643 | ||
1644 | if (ovs_vport_get_upcall_portids(vport, skb)) | ||
1645 | goto nla_put_failure; | ||
1646 | |||
1644 | err = ovs_vport_get_options(vport, skb); | 1647 | err = ovs_vport_get_options(vport, skb); |
1645 | if (err == -EMSGSIZE) | 1648 | if (err == -EMSGSIZE) |
1646 | goto error; | 1649 | goto error; |
@@ -1762,7 +1765,7 @@ static int ovs_vport_cmd_new(struct sk_buff *skb, struct genl_info *info) | |||
1762 | parms.options = a[OVS_VPORT_ATTR_OPTIONS]; | 1765 | parms.options = a[OVS_VPORT_ATTR_OPTIONS]; |
1763 | parms.dp = dp; | 1766 | parms.dp = dp; |
1764 | parms.port_no = port_no; | 1767 | parms.port_no = port_no; |
1765 | parms.upcall_portid = nla_get_u32(a[OVS_VPORT_ATTR_UPCALL_PID]); | 1768 | parms.upcall_portids = a[OVS_VPORT_ATTR_UPCALL_PID]; |
1766 | 1769 | ||
1767 | vport = new_vport(&parms); | 1770 | vport = new_vport(&parms); |
1768 | err = PTR_ERR(vport); | 1771 | err = PTR_ERR(vport); |
@@ -1812,8 +1815,14 @@ static int ovs_vport_cmd_set(struct sk_buff *skb, struct genl_info *info) | |||
1812 | goto exit_unlock_free; | 1815 | goto exit_unlock_free; |
1813 | } | 1816 | } |
1814 | 1817 | ||
1815 | if (a[OVS_VPORT_ATTR_UPCALL_PID]) | 1818 | |
1816 | vport->upcall_portid = nla_get_u32(a[OVS_VPORT_ATTR_UPCALL_PID]); | 1819 | if (a[OVS_VPORT_ATTR_UPCALL_PID]) { |
1820 | struct nlattr *ids = a[OVS_VPORT_ATTR_UPCALL_PID]; | ||
1821 | |||
1822 | err = ovs_vport_set_upcall_portids(vport, ids); | ||
1823 | if (err) | ||
1824 | goto exit_unlock_free; | ||
1825 | } | ||
1817 | 1826 | ||
1818 | err = ovs_vport_cmd_fill_info(vport, reply, info->snd_portid, | 1827 | err = ovs_vport_cmd_fill_info(vport, reply, info->snd_portid, |
1819 | info->snd_seq, 0, OVS_VPORT_CMD_NEW); | 1828 | info->snd_seq, 0, OVS_VPORT_CMD_NEW); |