summaryrefslogtreecommitdiffstats
path: root/sys/netinet/sctp_pcb.c
diff options
context:
space:
mode:
authortuexen <tuexen@FreeBSD.org>2011-11-07 22:30:19 +0000
committertuexen <tuexen@FreeBSD.org>2011-11-07 22:30:19 +0000
commite86f62e44784d3b1219a3896c7809e76d9e71528 (patch)
treeee6b6281bc13d60b4963fa91f7cdc5c0616e56d9 /sys/netinet/sctp_pcb.c
parent17a190b301e59271e105421156747dd407d22810 (diff)
downloadFreeBSD-src-e86f62e44784d3b1219a3896c7809e76d9e71528.zip
FreeBSD-src-e86f62e44784d3b1219a3896c7809e76d9e71528.tar.gz
When loading addresses from INITs, always use the correct
local address. MFC after: 3 days.
Diffstat (limited to 'sys/netinet/sctp_pcb.c')
-rw-r--r--sys/netinet/sctp_pcb.c85
1 files changed, 48 insertions, 37 deletions
diff --git a/sys/netinet/sctp_pcb.c b/sys/netinet/sctp_pcb.c
index 389943e..0dcc37e 100644
--- a/sys/netinet/sctp_pcb.c
+++ b/sys/netinet/sctp_pcb.c
@@ -6181,54 +6181,65 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m,
sin6.sin6_len = sizeof(struct sockaddr_in6);
sin6.sin6_port = stcb->rport;
#endif
- if (altsa == NULL) {
- iph = mtod(m, struct ip *);
- switch (iph->ip_v) {
+ iph = mtod(m, struct ip *);
+ switch (iph->ip_v) {
#ifdef INET
- case IPVERSION:
- {
- /* its IPv4 */
- struct sockaddr_in *sin_2;
-
- sin_2 = (struct sockaddr_in *)(local_sa);
- memset(sin_2, 0, sizeof(sin));
- sin_2->sin_family = AF_INET;
- sin_2->sin_len = sizeof(sin);
- sin_2->sin_port = sh->dest_port;
- sin_2->sin_addr.s_addr = iph->ip_dst.s_addr;
+ case IPVERSION:
+ {
+ /* its IPv4 */
+ struct sockaddr_in *sin_2;
+
+ sin_2 = (struct sockaddr_in *)(local_sa);
+ memset(sin_2, 0, sizeof(sin));
+ sin_2->sin_family = AF_INET;
+ sin_2->sin_len = sizeof(sin);
+ sin_2->sin_port = sh->dest_port;
+ sin_2->sin_addr.s_addr = iph->ip_dst.s_addr;
+ if (altsa) {
+ /*
+ * For cookies we use the src address NOT
+ * from the packet but from the original
+ * INIT.
+ */
+ sa = altsa;
+ } else {
sin.sin_addr = iph->ip_src;
sa = (struct sockaddr *)&sin;
- break;
}
+ break;
+ }
#endif
#ifdef INET6
- case IPV6_VERSION >> 4:
- {
- /* its IPv6 */
- struct ip6_hdr *ip6;
- struct sockaddr_in6 *sin6_2;
-
- ip6 = mtod(m, struct ip6_hdr *);
- sin6_2 = (struct sockaddr_in6 *)(local_sa);
- memset(sin6_2, 0, sizeof(sin6));
- sin6_2->sin6_family = AF_INET6;
- sin6_2->sin6_len = sizeof(struct sockaddr_in6);
- sin6_2->sin6_port = sh->dest_port;
+ case IPV6_VERSION >> 4:
+ {
+ /* its IPv6 */
+ struct ip6_hdr *ip6;
+ struct sockaddr_in6 *sin6_2;
+
+ ip6 = mtod(m, struct ip6_hdr *);
+ sin6_2 = (struct sockaddr_in6 *)(local_sa);
+ memset(sin6_2, 0, sizeof(sin6));
+ sin6_2->sin6_family = AF_INET6;
+ sin6_2->sin6_len = sizeof(struct sockaddr_in6);
+ sin6_2->sin6_port = sh->dest_port;
+ sin6_2->sin6_addr = ip6->ip6_dst;
+ if (altsa) {
+ /*
+ * For cookies we use the src address NOT
+ * from the packet but from the original
+ * INIT.
+ */
+ sa = altsa;
+ } else {
sin6.sin6_addr = ip6->ip6_src;
sa = (struct sockaddr *)&sin6;
- break;
}
-#endif
- default:
- return (-1);
break;
}
- } else {
- /*
- * For cookies we use the src address NOT from the packet
- * but from the original INIT
- */
- sa = altsa;
+#endif
+ default:
+ return (-1);
+ break;
}
/* Turn off ECN until we get through all params */
ecn_allowed = 0;
OpenPOWER on IntegriCloud