| @@ -717,9 +717,10 @@ void mptcp_pm_nl_addr_send_ack(struct mptcp_sock *msk) · 716 unmodified lines |
| 717 | } | 717 | } |
| 718 | } | 718 | } |
| 719 | | 719 | |
| 720 | static int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk, | 720 | int 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 |
| 1853 | static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info) | 1860 | static 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) { |