aboutsummaryrefslogtreecommitdiffstats
path: root/net/sctp/socket.c
diff options
context:
space:
mode:
authorXin Long <lucien.xin@gmail.com>2018-07-02 06:21:14 -0400
committerDavid S. Miller <davem@davemloft.net>2018-07-03 22:36:54 -0400
commit4be4139f7d0dc74e5a0932c7c7ddf0eb65da9e3a (patch)
tree1392503fedca83a4bcab9f87eda38832686dc0a7 /net/sctp/socket.c
parent0b0dce7a36fb9f1a9dd8245ea82d3a268c6943fe (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.c5
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);