History

mptcp: netlink: issue MP_PRIO signals from userspace PMs

This change updates MPTCP_PM_CMD_SET_FLAGS to allow userspace PMs to issue MP_PRIO signals over a specific subflow selected by the connection token, local and remote address+port.

Kishen Maloor committed 4 years ago

Commit 892f3961 parent a6574303 files · +62 −6Browse files

Unified · Split

3 files
  1. net/mptcp/pm_netlink.c +25 −5
  2. net/mptcp/pm_userspace.c +30 −0
  3. net/mptcp/protocol.h +7 −1
net/mptcp/pm_netlink.c+25−5
@@ -717,9 +717,10 @@ void mptcp_pm_nl_addr_send_ack(struct mptcp_sock *msk) · 716 unmodified lines
717 }717 }
718}718}
719 719
720static int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,720int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
721 struct mptcp_addr_info *addr,721 struct mptcp_addr_info *addr,
722 u8 bkup)722 struct mptcp_addr_info *rem,
723 u8 bkup)
723{724{
724 struct mptcp_subflow_context *subflow;725 struct mptcp_subflow_context *subflow;
725 726
@@ -727,13 +728,19 @@ static int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk, · 1 unmodified line
727 728
728 mptcp_for_each_subflow(msk, subflow) {729 mptcp_for_each_subflow(msk, subflow) {
729 struct sock *ssk = mptcp_subflow_tcp_sock(subflow);730 struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
730 struct mptcp_addr_info local;731 struct mptcp_addr_info local, remote;
731 bool slow;732 bool slow;
732 733
733 local_address((struct sock_common *)ssk, &local);734 local_address((struct sock_common *)ssk, &local);
734 if (!mptcp_addresses_equal(&local, addr, addr->port))735 if (!mptcp_addresses_equal(&local, addr, addr->port))
735 continue;736 continue;
736 737
738 if (rem && rem->family != AF_UNSPEC) {
739 remote_address((struct sock_common *)ssk, &remote);
740 if (!mptcp_addresses_equal(&remote, rem, rem->port))
741 continue;
742 }
743
737 slow = lock_sock_fast(ssk);744 slow = lock_sock_fast(ssk);
738 if (subflow->backup != bkup)745 if (subflow->backup != bkup)
739 msk->last_snd = NULL;746 msk->last_snd = NULL;
@@ -1837,7 +1844,7 @@ static int mptcp_nl_set_flags(struct net *net, · 1097 unmodified lines
1837 1844
1838 lock_sock(sk);1845 lock_sock(sk);
1839 if (changed & MPTCP_PM_ADDR_FLAG_BACKUP)1846 if (changed & MPTCP_PM_ADDR_FLAG_BACKUP)
1840 ret = mptcp_pm_nl_mp_prio_send_ack(msk, addr, bkup);1847 ret = mptcp_pm_nl_mp_prio_send_ack(msk, addr, NULL, bkup);
1841 if (changed & MPTCP_PM_ADDR_FLAG_FULLMESH)1848 if (changed & MPTCP_PM_ADDR_FLAG_FULLMESH)
1842 mptcp_pm_nl_fullmesh(msk, addr);1849 mptcp_pm_nl_fullmesh(msk, addr);
1843 release_sock(sk);1850 release_sock(sk);
@@ -1853,6 +1860,9 @@ next: · 9 unmodified lines
1853static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info)1860static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info)
1854{1861{
1855 struct mptcp_pm_addr_entry addr = { .addr = { .family = AF_UNSPEC }, }, *entry;1862 struct mptcp_pm_addr_entry addr = { .addr = { .family = AF_UNSPEC }, }, *entry;
1863 struct mptcp_pm_addr_entry remote = { .addr = { .family = AF_UNSPEC }, };
1864 struct nlattr *attr_rem = info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE];
1865 struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN];
1856 struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR];1866 struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR];
1857 struct pm_nl_pernet *pernet = genl_info_pm_nl(info);1867 struct pm_nl_pernet *pernet = genl_info_pm_nl(info);
1858 u8 changed, mask = MPTCP_PM_ADDR_FLAG_BACKUP |1868 u8 changed, mask = MPTCP_PM_ADDR_FLAG_BACKUP |
@@ -1865,6 +1875,12 @@ static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info) · 6 unmodified lines
1865 if (ret < 0)1875 if (ret < 0)
1866 return ret;1876 return ret;
1867 1877
1878 if (attr_rem) {
1879 ret = mptcp_pm_parse_entry(attr_rem, info, false, &remote);
1880 if (ret < 0)
1881 return ret;
1882 }
1883
1868 if (addr.flags & MPTCP_PM_ADDR_FLAG_BACKUP)1884 if (addr.flags & MPTCP_PM_ADDR_FLAG_BACKUP)
1869 bkup = 1;1885 bkup = 1;
1870 if (addr.addr.family == AF_UNSPEC) {1886 if (addr.addr.family == AF_UNSPEC) {
@@ -1873,6 +1889,10 @@ static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info) · 2 unmodified lines
1873 return -EOPNOTSUPP;1889 return -EOPNOTSUPP;
1874 }1890 }
1875 1891
1892 if (token)
1893 return mptcp_userspace_pm_set_flags(sock_net(skb->sk),
1894 token, &addr, &remote, bkup);
1895
1876 spin_lock_bh(&pernet->lock);1896 spin_lock_bh(&pernet->lock);
1877 entry = __lookup_addr(pernet, &addr.addr, lookup_by_id);1897 entry = __lookup_addr(pernet, &addr.addr, lookup_by_id);
1878 if (!entry) {1898 if (!entry) {
net/mptcp/pm_userspace.c+30−0
@@ -420,3 +420,33 @@ destroy_err: · 419 unmodified lines
420 sock_put((struct sock *)msk);420 sock_put((struct sock *)msk);
421 return err;421 return err;
422}422}
423
424int mptcp_userspace_pm_set_flags(struct net *net, struct nlattr *token,
425 struct mptcp_pm_addr_entry *loc,
426 struct mptcp_pm_addr_entry *rem, u8 bkup)
427{
428 struct mptcp_sock *msk;
429 int ret = -EINVAL;
430 u32 token_val;
431
432 token_val = nla_get_u32(token);
433
434 msk = mptcp_token_get_sock(net, token_val);
435 if (!msk)
436 return ret;
437
438 if (!mptcp_pm_is_userspace(msk))
439 goto set_flags_err;
440
441 if (loc->addr.family == AF_UNSPEC ||
442 rem->addr.family == AF_UNSPEC)
443 goto set_flags_err;
444
445 lock_sock((struct sock *)msk);
446 ret = mptcp_pm_nl_mp_prio_send_ack(msk, &loc->addr, &rem->addr, bkup);
447 release_sock((struct sock *)msk);
448
449set_flags_err:
450 sock_put((struct sock *)msk);
451 return ret;
452}
net/mptcp/protocol.h+7−1
@@ -772,6 +772,10 @@ void mptcp_pm_rm_addr_received(struct mptcp_sock *msk, · 771 unmodified lines
772 const struct mptcp_rm_list *rm_list);772 const struct mptcp_rm_list *rm_list);
773void mptcp_pm_mp_prio_received(struct sock *sk, u8 bkup);773void mptcp_pm_mp_prio_received(struct sock *sk, u8 bkup);
774void mptcp_pm_mp_fail_received(struct sock *sk, u64 fail_seq);774void mptcp_pm_mp_fail_received(struct sock *sk, u64 fail_seq);
775int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
776 struct mptcp_addr_info *addr,
777 struct mptcp_addr_info *rem,
778 u8 bkup);
775bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk,779bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk,
776 const struct mptcp_pm_addr_entry *entry);780 const struct mptcp_pm_addr_entry *entry);
777void mptcp_pm_free_anno_list(struct mptcp_sock *msk);781void mptcp_pm_free_anno_list(struct mptcp_sock *msk);
@@ -788,7 +792,9 @@ int mptcp_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk, · 10 unmodified lines
788int mptcp_userspace_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk,792int mptcp_userspace_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk,
789 unsigned int id,793 unsigned int id,
790 u8 *flags, int *ifindex);794 u8 *flags, int *ifindex);
791 795int mptcp_userspace_pm_set_flags(struct net *net, struct nlattr *token,
796 struct mptcp_pm_addr_entry *loc,
797 struct mptcp_pm_addr_entry *rem, u8 bkup);
792int mptcp_pm_announce_addr(struct mptcp_sock *msk,798int mptcp_pm_announce_addr(struct mptcp_sock *msk,
793 const struct mptcp_addr_info *addr,799 const struct mptcp_addr_info *addr,
794 bool echo);800 bool echo);