aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--datapath/datapath.c15
-rw-r--r--lib/dpif-linux.c9
2 files changed, 13 insertions, 11 deletions
diff --git a/datapath/datapath.c b/datapath/datapath.c
index 551b384a..950bed1b 100644
--- a/datapath/datapath.c
+++ b/datapath/datapath.c
@@ -1282,7 +1282,7 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)
int err;
err = -EINVAL;
- if (!a[OVS_DP_ATTR_NAME])
+ if (!a[OVS_DP_ATTR_NAME] || !a[OVS_DP_ATTR_UPCALL_PID])
goto err;
err = ovs_dp_cmd_validate(a);
@@ -1326,10 +1326,7 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)
parms.options = NULL;
parms.dp = dp;
parms.port_no = OVSP_LOCAL;
- if (a[OVS_DP_ATTR_UPCALL_PID])
- parms.upcall_pid = nla_get_u32(a[OVS_DP_ATTR_UPCALL_PID]);
- else
- parms.upcall_pid = NETLINK_CB(skb).pid;
+ parms.upcall_pid = nla_get_u32(a[OVS_DP_ATTR_UPCALL_PID]);
vport = new_vport(&parms);
if (IS_ERR(vport)) {
@@ -1664,7 +1661,8 @@ static int ovs_vport_cmd_new(struct sk_buff *skb, struct genl_info *info)
int err;
err = -EINVAL;
- if (!a[OVS_VPORT_ATTR_NAME] || !a[OVS_VPORT_ATTR_TYPE])
+ if (!a[OVS_VPORT_ATTR_NAME] || !a[OVS_VPORT_ATTR_TYPE] ||
+ !a[OVS_VPORT_ATTR_UPCALL_PID])
goto exit;
err = ovs_vport_cmd_validate(a);
@@ -1705,10 +1703,7 @@ static int ovs_vport_cmd_new(struct sk_buff *skb, struct genl_info *info)
parms.options = a[OVS_VPORT_ATTR_OPTIONS];
parms.dp = dp;
parms.port_no = port_no;
- if (a[OVS_VPORT_ATTR_UPCALL_PID])
- parms.upcall_pid = nla_get_u32(a[OVS_VPORT_ATTR_UPCALL_PID]);
- else
- parms.upcall_pid = NETLINK_CB(skb).pid;
+ parms.upcall_pid = nla_get_u32(a[OVS_VPORT_ATTR_UPCALL_PID]);
vport = new_vport(&parms);
err = PTR_ERR(vport);
diff --git a/lib/dpif-linux.c b/lib/dpif-linux.c
index 1e1afe50..08ac4425 100644
--- a/lib/dpif-linux.c
+++ b/lib/dpif-linux.c
@@ -235,6 +235,7 @@ dpif_linux_open(const struct dpif_class *class OVS_UNUSED, const char *name,
{
struct dpif_linux_dp dp_request, dp;
struct ofpbuf *buf;
+ uint32_t upcall_pid;
int error;
error = dpif_linux_init();
@@ -244,7 +245,13 @@ dpif_linux_open(const struct dpif_class *class OVS_UNUSED, const char *name,
/* Create or look up datapath. */
dpif_linux_dp_init(&dp_request);
- dp_request.cmd = create ? OVS_DP_CMD_NEW : OVS_DP_CMD_GET;
+ if (create) {
+ dp_request.cmd = OVS_DP_CMD_NEW;
+ upcall_pid = 0;
+ dp_request.upcall_pid = &upcall_pid;
+ } else {
+ dp_request.cmd = OVS_DP_CMD_GET;
+ }
dp_request.name = name;
error = dpif_linux_dp_transact(&dp_request, &dp, &buf);
if (error) {