Unverified Commit 22b613ee authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!13087 MPTCP Upstream part 18

Merge Pull Request from: @geliangtang 
 
Patches from v6.9-rc1. 
 
Link:https://gitee.com/openeuler/kernel/pulls/13087

 

Reviewed-by: default avatarYue Haibing <yuehaibing@huawei.com>
Signed-off-by: default avatarZhang Peng <zhangpeng362@huawei.com>
parents 93df4e1d cccaa97b
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -334,7 +334,6 @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
	struct nlattr *laddr = info->attrs[MPTCP_PM_ATTR_ADDR];
	struct mptcp_pm_addr_entry local = { 0 };
	struct mptcp_addr_info addr_r;
	struct mptcp_addr_info addr_l;
	struct mptcp_sock *msk;
	int err = -EINVAL;
	struct sock *sk;
@@ -360,25 +359,31 @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
		goto create_err;
	}

	err = mptcp_pm_parse_addr(laddr, info, &addr_l);
	err = mptcp_pm_parse_entry(laddr, info, true, &local);
	if (err < 0) {
		NL_SET_ERR_MSG_ATTR(info->extack, laddr, "error parsing local addr");
		goto create_err;
	}

	if (local.flags & MPTCP_PM_ADDR_FLAG_SIGNAL) {
		GENL_SET_ERR_MSG(info, "invalid addr flags");
		err = -EINVAL;
		goto create_err;
	}
	local.flags |= MPTCP_PM_ADDR_FLAG_SUBFLOW;

	err = mptcp_pm_parse_addr(raddr, info, &addr_r);
	if (err < 0) {
		NL_SET_ERR_MSG_ATTR(info->extack, raddr, "error parsing remote addr");
		goto create_err;
	}

	if (!mptcp_pm_addr_families_match(sk, &addr_l, &addr_r)) {
	if (!mptcp_pm_addr_families_match(sk, &local.addr, &addr_r)) {
		GENL_SET_ERR_MSG(info, "families mismatch");
		err = -EINVAL;
		goto create_err;
	}

	local.addr = addr_l;
	err = mptcp_userspace_pm_append_new_local_addr(msk, &local, false);
	if (err < 0) {
		GENL_SET_ERR_MSG(info, "did not match address and id");
@@ -387,7 +392,7 @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)

	lock_sock(sk);

	err = __mptcp_subflow_connect(sk, &addr_l, &addr_r);
	err = __mptcp_subflow_connect(sk, &local.addr, &addr_r);

	release_sock(sk);

+23 −0
Original line number Diff line number Diff line
@@ -330,3 +330,26 @@ mptcp_lib_wait_local_port_listen() {
		sleep 0.1
	done
}

mptcp_lib_check_output() {
	local err="${1}"
	local cmd="${2}"
	local expected="${3}"
	local cmd_ret=0
	local out

	if ! out=$(${cmd} 2>"${err}"); then
		cmd_ret=${?}
	fi

	if [ ${cmd_ret} -ne 0 ]; then
		mptcp_lib_print_err "[FAIL] command execution '${cmd}' stderr"
		cat "${err}"
		return 2
	elif [ "${out}" = "${expected}" ]; then
		return 0
	else
		mptcp_lib_print_err "[FAIL] expected '${expected}' got '${out}'"
		return 1
	fi
}
+7 −11
Original line number Diff line number Diff line
@@ -54,21 +54,17 @@ check()
	local cmd="$1"
	local expected="$2"
	local msg="$3"
	local out=`$cmd 2>$err`
	local cmd_ret=$?
	local rc=0

	printf "%-50s" "$msg"
	if [ $cmd_ret -ne 0 ]; then
		echo "[FAIL] command execution '$cmd' stderr "
		cat $err
		mptcp_lib_result_fail "${msg} # error ${cmd_ret}"
	mptcp_lib_check_output "${err}" "${cmd}" "${expected}" || rc=${?}
	if [ ${rc} -eq 2 ]; then
		mptcp_lib_result_fail "${msg} # error ${rc}"
		ret=1
	elif [ "$out" = "$expected" ]; then
		echo "[ OK ]"
	elif [ ${rc} -eq 0 ]; then
		mptcp_lib_print_ok "[ OK ]"
		mptcp_lib_result_pass "${msg}"
	else
		echo -n "[FAIL] "
		echo "expected '$expected' got '$out'"
	elif [ ${rc} -eq 1 ]; then
		mptcp_lib_result_fail "${msg} # different output"
		ret=1
	fi
+25 −0
Original line number Diff line number Diff line
@@ -453,6 +453,7 @@ int csf(int fd, int pm_family, int argc, char *argv[])
	char data[NLMSG_ALIGN(sizeof(struct nlmsghdr)) +
		  NLMSG_ALIGN(sizeof(struct genlmsghdr)) +
		  1024];
	u_int32_t flags = MPTCP_PM_ADDR_FLAG_SUBFLOW;
	const char *params[5];
	struct nlmsghdr *nh;
	struct rtattr *addr;
@@ -558,6 +559,13 @@ int csf(int fd, int pm_family, int argc, char *argv[])
			off += NLMSG_ALIGN(rta->rta_len);
		}

		/* addr flags */
		rta = (void *)(data + off);
		rta->rta_type = MPTCP_PM_ADDR_ATTR_FLAGS;
		rta->rta_len = RTA_LENGTH(4);
		memcpy(RTA_DATA(rta), &flags, 4);
		off += NLMSG_ALIGN(rta->rta_len);

		addr->rta_len = off - addr_start;
	}

@@ -1119,8 +1127,16 @@ int dump_addrs(int fd, int pm_family, int argc, char *argv[])
		  1024];
	pid_t pid = getpid();
	struct nlmsghdr *nh;
	u_int32_t token = 0;
	struct rtattr *rta;
	int off = 0;

	if (argc != 2 && argc != 4)
		syntax(argv);

	if (argc == 4 && !strcmp(argv[2], "token"))
		token = strtoul(argv[3], NULL, 10);

	memset(data, 0, sizeof(data));
	nh = (void *)data;
	off = init_genl_req(data, pm_family, MPTCP_PM_CMD_GET_ADDR,
@@ -1130,6 +1146,15 @@ int dump_addrs(int fd, int pm_family, int argc, char *argv[])
	nh->nlmsg_pid = pid;
	nh->nlmsg_len = off;

	/* token */
	if (token) {
		rta = (void *)(data + off);
		rta->rta_type = MPTCP_PM_ATTR_TOKEN;
		rta->rta_len = RTA_LENGTH(4);
		memcpy(RTA_DATA(rta), &token, 4);
		off += NLMSG_ALIGN(rta->rta_len);
	}

	print_addrs(nh, pm_family, do_nl_req(fd, nh, off, sizeof(data)));
	return 0;
}