diff options
author | Xin Long <lucien.xin@gmail.com> | 2018-07-02 06:21:14 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-07-03 22:36:54 -0400 |
commit | 4be4139f7d0dc74e5a0932c7c7ddf0eb65da9e3a (patch) | |
tree | 1392503fedca83a4bcab9f87eda38832686dc0a7 /net/sctp/socket.c | |
parent | 0b0dce7a36fb9f1a9dd8245ea82d3a268c6943fe (diff) |
sctp: add support for setting flowlabel when adding a transport
Struct sockaddr_in6 has the member sin6_flowinfo that includes the
ipv6 flowlabel, it should also support for setting flowlabel when
adding a transport whose ipaddr is from userspace.
Note that addrinfo in sctp_sendmsg is using struct in6_addr for
the secondary addrs, which doesn't contain sin6_flowinfo, and
it needs to copy sin6_flowinfo from the primary addr.
Signed-off-by: Xin Long <lucien.xin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sctp/socket.c')
-rw-r--r-- | net/sctp/socket.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 50b7ef975b42..502c0d7cb105 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c | |||
@@ -1697,6 +1697,7 @@ static int sctp_sendmsg_new_asoc(struct sock *sk, __u16 sflags, | |||
1697 | struct sctp_association *asoc; | 1697 | struct sctp_association *asoc; |
1698 | enum sctp_scope scope; | 1698 | enum sctp_scope scope; |
1699 | struct cmsghdr *cmsg; | 1699 | struct cmsghdr *cmsg; |
1700 | __be32 flowinfo = 0; | ||
1700 | struct sctp_af *af; | 1701 | struct sctp_af *af; |
1701 | int err; | 1702 | int err; |
1702 | 1703 | ||
@@ -1781,6 +1782,9 @@ static int sctp_sendmsg_new_asoc(struct sock *sk, __u16 sflags, | |||
1781 | if (!cmsgs->addrs_msg) | 1782 | if (!cmsgs->addrs_msg) |
1782 | return 0; | 1783 | return 0; |
1783 | 1784 | ||
1785 | if (daddr->sa.sa_family == AF_INET6) | ||
1786 | flowinfo = daddr->v6.sin6_flowinfo; | ||
1787 | |||
1784 | /* sendv addr list parse */ | 1788 | /* sendv addr list parse */ |
1785 | for_each_cmsghdr(cmsg, cmsgs->addrs_msg) { | 1789 | for_each_cmsghdr(cmsg, cmsgs->addrs_msg) { |
1786 | struct sctp_transport *transport; | 1790 | struct sctp_transport *transport; |
@@ -1813,6 +1817,7 @@ static int sctp_sendmsg_new_asoc(struct sock *sk, __u16 sflags, | |||
1813 | } | 1817 | } |
1814 | 1818 | ||
1815 | dlen = sizeof(struct in6_addr); | 1819 | dlen = sizeof(struct in6_addr); |
1820 | daddr->v6.sin6_flowinfo = flowinfo; | ||
1816 | daddr->v6.sin6_family = AF_INET6; | 1821 | daddr->v6.sin6_family = AF_INET6; |
1817 | daddr->v6.sin6_port = htons(asoc->peer.port); | 1822 | daddr->v6.sin6_port = htons(asoc->peer.port); |
1818 | memcpy(&daddr->v6.sin6_addr, CMSG_DATA(cmsg), dlen); | 1823 | memcpy(&daddr->v6.sin6_addr, CMSG_DATA(cmsg), dlen); |