Loading net/mptcp/pm_userspace.c +10 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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"); Loading @@ -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); Loading tools/testing/selftests/net/mptcp/mptcp_lib.sh +23 −0 Original line number Diff line number Diff line Loading @@ -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 } tools/testing/selftests/net/mptcp/pm_netlink.sh +7 −11 Original line number Diff line number Diff line Loading @@ -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 Loading tools/testing/selftests/net/mptcp/pm_nl_ctl.c +25 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } Loading Loading @@ -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, Loading @@ -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; } Loading Loading
net/mptcp/pm_userspace.c +10 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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"); Loading @@ -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); Loading
tools/testing/selftests/net/mptcp/mptcp_lib.sh +23 −0 Original line number Diff line number Diff line Loading @@ -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 }
tools/testing/selftests/net/mptcp/pm_netlink.sh +7 −11 Original line number Diff line number Diff line Loading @@ -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 Loading
tools/testing/selftests/net/mptcp/pm_nl_ctl.c +25 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } Loading Loading @@ -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, Loading @@ -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; } Loading