diff options
-rw-r--r-- | net/sctp/associola.c | 9 | ||||
-rw-r--r-- | net/sctp/bind_addr.c | 13 | ||||
-rw-r--r-- | net/sctp/proc.c | 14 | ||||
-rw-r--r-- | net/sctp/protocol.c | 4 | ||||
-rw-r--r-- | net/sctp/sm_make_chunk.c | 11 | ||||
-rw-r--r-- | net/sctp/sm_sideeffect.c | 6 | ||||
-rw-r--r-- | net/sctp/sm_statefuns.c | 4 | ||||
-rw-r--r-- | net/sctp/socket.c | 5 |
8 files changed, 41 insertions, 25 deletions
diff --git a/net/sctp/associola.c b/net/sctp/associola.c index 83318e727905..72199d149573 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c | |||
@@ -666,10 +666,13 @@ void sctp_assoc_del_peer(struct sctp_association *asoc, | |||
666 | struct list_head *pos; | 666 | struct list_head *pos; |
667 | struct list_head *temp; | 667 | struct list_head *temp; |
668 | struct sctp_transport *transport; | 668 | struct sctp_transport *transport; |
669 | union sctp_addr tmp; | ||
670 | |||
671 | flip_to_n(&tmp, addr); | ||
669 | 672 | ||
670 | list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) { | 673 | list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) { |
671 | transport = list_entry(pos, struct sctp_transport, transports); | 674 | transport = list_entry(pos, struct sctp_transport, transports); |
672 | if (sctp_cmp_addr_exact(addr, &transport->ipaddr_h)) { | 675 | if (sctp_cmp_addr_exact(&tmp, &transport->ipaddr)) { |
673 | /* Do book keeping for removing the peer and free it. */ | 676 | /* Do book keeping for removing the peer and free it. */ |
674 | sctp_assoc_rm_peer(asoc, transport); | 677 | sctp_assoc_rm_peer(asoc, transport); |
675 | break; | 678 | break; |
@@ -684,12 +687,14 @@ struct sctp_transport *sctp_assoc_lookup_paddr( | |||
684 | { | 687 | { |
685 | struct sctp_transport *t; | 688 | struct sctp_transport *t; |
686 | struct list_head *pos; | 689 | struct list_head *pos; |
690 | union sctp_addr tmp; | ||
687 | 691 | ||
692 | flip_to_n(&tmp, address); | ||
688 | /* Cycle through all transports searching for a peer address. */ | 693 | /* Cycle through all transports searching for a peer address. */ |
689 | 694 | ||
690 | list_for_each(pos, &asoc->peer.transport_addr_list) { | 695 | list_for_each(pos, &asoc->peer.transport_addr_list) { |
691 | t = list_entry(pos, struct sctp_transport, transports); | 696 | t = list_entry(pos, struct sctp_transport, transports); |
692 | if (sctp_cmp_addr_exact(address, &t->ipaddr_h)) | 697 | if (sctp_cmp_addr_exact(&tmp, &t->ipaddr)) |
693 | return t; | 698 | return t; |
694 | } | 699 | } |
695 | 700 | ||
diff --git a/net/sctp/bind_addr.c b/net/sctp/bind_addr.c index 2b36e4238170..9085e531d575 100644 --- a/net/sctp/bind_addr.c +++ b/net/sctp/bind_addr.c | |||
@@ -181,10 +181,13 @@ int sctp_del_bind_addr(struct sctp_bind_addr *bp, union sctp_addr *del_addr) | |||
181 | { | 181 | { |
182 | struct list_head *pos, *temp; | 182 | struct list_head *pos, *temp; |
183 | struct sctp_sockaddr_entry *addr; | 183 | struct sctp_sockaddr_entry *addr; |
184 | union sctp_addr tmp; | ||
185 | |||
186 | flip_to_n(&tmp, del_addr); | ||
184 | 187 | ||
185 | list_for_each_safe(pos, temp, &bp->address_list) { | 188 | list_for_each_safe(pos, temp, &bp->address_list) { |
186 | addr = list_entry(pos, struct sctp_sockaddr_entry, list); | 189 | addr = list_entry(pos, struct sctp_sockaddr_entry, list); |
187 | if (sctp_cmp_addr_exact(&addr->a_h, del_addr)) { | 190 | if (sctp_cmp_addr_exact(&addr->a, &tmp)) { |
188 | /* Found the exact match. */ | 191 | /* Found the exact match. */ |
189 | list_del(pos); | 192 | list_del(pos); |
190 | kfree(addr); | 193 | kfree(addr); |
@@ -304,10 +307,12 @@ int sctp_bind_addr_match(struct sctp_bind_addr *bp, | |||
304 | { | 307 | { |
305 | struct sctp_sockaddr_entry *laddr; | 308 | struct sctp_sockaddr_entry *laddr; |
306 | struct list_head *pos; | 309 | struct list_head *pos; |
310 | union sctp_addr tmp; | ||
307 | 311 | ||
312 | flip_to_n(&tmp, addr); | ||
308 | list_for_each(pos, &bp->address_list) { | 313 | list_for_each(pos, &bp->address_list) { |
309 | laddr = list_entry(pos, struct sctp_sockaddr_entry, list); | 314 | laddr = list_entry(pos, struct sctp_sockaddr_entry, list); |
310 | if (opt->pf->cmp_addr(&laddr->a_h, addr, opt)) | 315 | if (opt->pf->cmp_addr(&laddr->a, &tmp, opt)) |
311 | return 1; | 316 | return 1; |
312 | } | 317 | } |
313 | 318 | ||
@@ -334,14 +339,12 @@ union sctp_addr *sctp_find_unmatch_addr(struct sctp_bind_addr *bp, | |||
334 | 339 | ||
335 | addr_buf = (union sctp_addr *)addrs; | 340 | addr_buf = (union sctp_addr *)addrs; |
336 | for (i = 0; i < addrcnt; i++) { | 341 | for (i = 0; i < addrcnt; i++) { |
337 | union sctp_addr tmp; | ||
338 | addr = (union sctp_addr *)addr_buf; | 342 | addr = (union sctp_addr *)addr_buf; |
339 | af = sctp_get_af_specific(addr->v4.sin_family); | 343 | af = sctp_get_af_specific(addr->v4.sin_family); |
340 | if (!af) | 344 | if (!af) |
341 | return NULL; | 345 | return NULL; |
342 | flip_to_h(&tmp, addr); | ||
343 | 346 | ||
344 | if (opt->pf->cmp_addr(&laddr->a_h, &tmp, opt)) | 347 | if (opt->pf->cmp_addr(&laddr->a, addr, opt)) |
345 | break; | 348 | break; |
346 | 349 | ||
347 | addr_buf += af->sockaddr_len; | 350 | addr_buf += af->sockaddr_len; |
diff --git a/net/sctp/proc.c b/net/sctp/proc.c index bf0144ed3e3a..04faa4a706d4 100644 --- a/net/sctp/proc.c +++ b/net/sctp/proc.c | |||
@@ -155,17 +155,17 @@ static void sctp_seq_dump_local_addrs(struct seq_file *seq, struct sctp_ep_commo | |||
155 | if (epb->type == SCTP_EP_TYPE_ASSOCIATION) { | 155 | if (epb->type == SCTP_EP_TYPE_ASSOCIATION) { |
156 | asoc = sctp_assoc(epb); | 156 | asoc = sctp_assoc(epb); |
157 | peer = asoc->peer.primary_path; | 157 | peer = asoc->peer.primary_path; |
158 | primary = &peer->saddr_h; | 158 | primary = &peer->saddr; |
159 | } | 159 | } |
160 | 160 | ||
161 | list_for_each(pos, &epb->bind_addr.address_list) { | 161 | list_for_each(pos, &epb->bind_addr.address_list) { |
162 | laddr = list_entry(pos, struct sctp_sockaddr_entry, list); | 162 | laddr = list_entry(pos, struct sctp_sockaddr_entry, list); |
163 | addr = (union sctp_addr *)&laddr->a_h; | 163 | addr = &laddr->a; |
164 | af = sctp_get_af_specific(addr->sa.sa_family); | 164 | af = sctp_get_af_specific(addr->sa.sa_family); |
165 | if (primary && af->cmp_addr(addr, primary)) { | 165 | if (primary && af->cmp_addr(addr, primary)) { |
166 | seq_printf(seq, "*"); | 166 | seq_printf(seq, "*"); |
167 | } | 167 | } |
168 | af->seq_dump_addr(seq, &laddr->a); | 168 | af->seq_dump_addr(seq, addr); |
169 | } | 169 | } |
170 | } | 170 | } |
171 | 171 | ||
@@ -175,17 +175,19 @@ static void sctp_seq_dump_remote_addrs(struct seq_file *seq, struct sctp_associa | |||
175 | struct list_head *pos; | 175 | struct list_head *pos; |
176 | struct sctp_transport *transport; | 176 | struct sctp_transport *transport; |
177 | union sctp_addr *addr, *primary; | 177 | union sctp_addr *addr, *primary; |
178 | union sctp_addr tmp; | ||
178 | struct sctp_af *af; | 179 | struct sctp_af *af; |
179 | 180 | ||
180 | primary = &(assoc->peer.primary_addr); | 181 | primary = &(assoc->peer.primary_addr); |
182 | flip_to_n(&tmp, primary); | ||
181 | list_for_each(pos, &assoc->peer.transport_addr_list) { | 183 | list_for_each(pos, &assoc->peer.transport_addr_list) { |
182 | transport = list_entry(pos, struct sctp_transport, transports); | 184 | transport = list_entry(pos, struct sctp_transport, transports); |
183 | addr = (union sctp_addr *)&transport->ipaddr_h; | 185 | addr = &transport->ipaddr; |
184 | af = sctp_get_af_specific(addr->sa.sa_family); | 186 | af = sctp_get_af_specific(addr->sa.sa_family); |
185 | if (af->cmp_addr(addr, primary)) { | 187 | if (af->cmp_addr(addr, &tmp)) { |
186 | seq_printf(seq, "*"); | 188 | seq_printf(seq, "*"); |
187 | } | 189 | } |
188 | af->seq_dump_addr(seq, &transport->ipaddr); | 190 | af->seq_dump_addr(seq, addr); |
189 | } | 191 | } |
190 | } | 192 | } |
191 | 193 | ||
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index 363274045032..2db140e901d0 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c | |||
@@ -478,12 +478,14 @@ static struct dst_entry *sctp_v4_get_dst(struct sctp_association *asoc, | |||
478 | */ | 478 | */ |
479 | sctp_read_lock(addr_lock); | 479 | sctp_read_lock(addr_lock); |
480 | list_for_each(pos, &bp->address_list) { | 480 | list_for_each(pos, &bp->address_list) { |
481 | union sctp_addr tmp; | ||
481 | laddr = list_entry(pos, struct sctp_sockaddr_entry, | 482 | laddr = list_entry(pos, struct sctp_sockaddr_entry, |
482 | list); | 483 | list); |
483 | if (!laddr->use_as_src) | 484 | if (!laddr->use_as_src) |
484 | continue; | 485 | continue; |
485 | sctp_v4_dst_saddr(&dst_saddr, dst, bp->port); | 486 | sctp_v4_dst_saddr(&dst_saddr, dst, bp->port); |
486 | if (sctp_v4_cmp_addr(&dst_saddr, &laddr->a_h)) | 487 | flip_to_n(&tmp, &dst_saddr); |
488 | if (sctp_v4_cmp_addr(&tmp, &laddr->a)) | ||
487 | goto out_unlock; | 489 | goto out_unlock; |
488 | } | 490 | } |
489 | sctp_read_unlock(addr_lock); | 491 | sctp_read_unlock(addr_lock); |
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c index b8e0f72b319f..ee907ea7eed1 100644 --- a/net/sctp/sm_make_chunk.c +++ b/net/sctp/sm_make_chunk.c | |||
@@ -2414,7 +2414,8 @@ static __be16 sctp_process_asconf_param(struct sctp_association *asoc, | |||
2414 | union sctp_addr addr; | 2414 | union sctp_addr addr; |
2415 | struct list_head *pos; | 2415 | struct list_head *pos; |
2416 | union sctp_addr_param *addr_param; | 2416 | union sctp_addr_param *addr_param; |
2417 | 2417 | union sctp_addr tmp, tmp_addr; | |
2418 | |||
2418 | addr_param = (union sctp_addr_param *) | 2419 | addr_param = (union sctp_addr_param *) |
2419 | ((void *)asconf_param + sizeof(sctp_addip_param_t)); | 2420 | ((void *)asconf_param + sizeof(sctp_addip_param_t)); |
2420 | 2421 | ||
@@ -2423,6 +2424,7 @@ static __be16 sctp_process_asconf_param(struct sctp_association *asoc, | |||
2423 | return SCTP_ERROR_INV_PARAM; | 2424 | return SCTP_ERROR_INV_PARAM; |
2424 | 2425 | ||
2425 | af->from_addr_param(&addr, addr_param, asoc->peer.port, 0); | 2426 | af->from_addr_param(&addr, addr_param, asoc->peer.port, 0); |
2427 | flip_to_n(&tmp_addr, &addr); | ||
2426 | switch (asconf_param->param_hdr.type) { | 2428 | switch (asconf_param->param_hdr.type) { |
2427 | case SCTP_PARAM_ADD_IP: | 2429 | case SCTP_PARAM_ADD_IP: |
2428 | /* ADDIP 4.3 D9) If an endpoint receives an ADD IP address | 2430 | /* ADDIP 4.3 D9) If an endpoint receives an ADD IP address |
@@ -2457,7 +2459,8 @@ static __be16 sctp_process_asconf_param(struct sctp_association *asoc, | |||
2457 | * an Error Cause TLV set to the new error code 'Request to | 2459 | * an Error Cause TLV set to the new error code 'Request to |
2458 | * Delete Source IP Address' | 2460 | * Delete Source IP Address' |
2459 | */ | 2461 | */ |
2460 | if (sctp_cmp_addr_exact(sctp_source(asconf), &addr)) | 2462 | flip_to_n(&tmp, sctp_source(asconf)); |
2463 | if (sctp_cmp_addr_exact(&tmp, &tmp_addr)) | ||
2461 | return SCTP_ERROR_DEL_SRC_IP; | 2464 | return SCTP_ERROR_DEL_SRC_IP; |
2462 | 2465 | ||
2463 | sctp_assoc_del_peer(asoc, &addr); | 2466 | sctp_assoc_del_peer(asoc, &addr); |
@@ -2581,6 +2584,7 @@ static int sctp_asconf_param_success(struct sctp_association *asoc, | |||
2581 | struct sctp_transport *transport; | 2584 | struct sctp_transport *transport; |
2582 | struct sctp_sockaddr_entry *saddr; | 2585 | struct sctp_sockaddr_entry *saddr; |
2583 | int retval = 0; | 2586 | int retval = 0; |
2587 | union sctp_addr tmp; | ||
2584 | 2588 | ||
2585 | addr_param = (union sctp_addr_param *) | 2589 | addr_param = (union sctp_addr_param *) |
2586 | ((void *)asconf_param + sizeof(sctp_addip_param_t)); | 2590 | ((void *)asconf_param + sizeof(sctp_addip_param_t)); |
@@ -2588,6 +2592,7 @@ static int sctp_asconf_param_success(struct sctp_association *asoc, | |||
2588 | /* We have checked the packet before, so we do not check again. */ | 2592 | /* We have checked the packet before, so we do not check again. */ |
2589 | af = sctp_get_af_specific(param_type2af(addr_param->v4.param_hdr.type)); | 2593 | af = sctp_get_af_specific(param_type2af(addr_param->v4.param_hdr.type)); |
2590 | af->from_addr_param(&addr, addr_param, bp->port, 0); | 2594 | af->from_addr_param(&addr, addr_param, bp->port, 0); |
2595 | flip_to_n(&tmp, &addr); | ||
2591 | 2596 | ||
2592 | switch (asconf_param->param_hdr.type) { | 2597 | switch (asconf_param->param_hdr.type) { |
2593 | case SCTP_PARAM_ADD_IP: | 2598 | case SCTP_PARAM_ADD_IP: |
@@ -2595,7 +2600,7 @@ static int sctp_asconf_param_success(struct sctp_association *asoc, | |||
2595 | sctp_write_lock(&asoc->base.addr_lock); | 2600 | sctp_write_lock(&asoc->base.addr_lock); |
2596 | list_for_each(pos, &bp->address_list) { | 2601 | list_for_each(pos, &bp->address_list) { |
2597 | saddr = list_entry(pos, struct sctp_sockaddr_entry, list); | 2602 | saddr = list_entry(pos, struct sctp_sockaddr_entry, list); |
2598 | if (sctp_cmp_addr_exact(&saddr->a_h, &addr)) | 2603 | if (sctp_cmp_addr_exact(&saddr->a, &tmp)) |
2599 | saddr->use_as_src = 1; | 2604 | saddr->use_as_src = 1; |
2600 | } | 2605 | } |
2601 | sctp_write_unlock(&asoc->base.addr_lock); | 2606 | sctp_write_unlock(&asoc->base.addr_lock); |
diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c index e1c5cddf32da..3d9213dfaa10 100644 --- a/net/sctp/sm_sideeffect.c +++ b/net/sctp/sm_sideeffect.c | |||
@@ -830,11 +830,13 @@ static void sctp_cmd_del_non_primary(struct sctp_association *asoc) | |||
830 | struct sctp_transport *t; | 830 | struct sctp_transport *t; |
831 | struct list_head *pos; | 831 | struct list_head *pos; |
832 | struct list_head *temp; | 832 | struct list_head *temp; |
833 | union sctp_addr tmp; | ||
834 | flip_to_n(&tmp, &asoc->peer.primary_addr); | ||
833 | 835 | ||
834 | list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) { | 836 | list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) { |
835 | t = list_entry(pos, struct sctp_transport, transports); | 837 | t = list_entry(pos, struct sctp_transport, transports); |
836 | if (!sctp_cmp_addr_exact(&t->ipaddr_h, | 838 | if (!sctp_cmp_addr_exact(&t->ipaddr, |
837 | &asoc->peer.primary_addr)) { | 839 | &tmp)) { |
838 | sctp_assoc_del_peer(asoc, &t->ipaddr_h); | 840 | sctp_assoc_del_peer(asoc, &t->ipaddr_h); |
839 | } | 841 | } |
840 | } | 842 | } |
diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c index f46072767549..ac776fd20667 100644 --- a/net/sctp/sm_statefuns.c +++ b/net/sctp/sm_statefuns.c | |||
@@ -1167,8 +1167,8 @@ static int sctp_sf_check_restart_addrs(const struct sctp_association *new_asoc, | |||
1167 | list_for_each(pos2, &asoc->peer.transport_addr_list) { | 1167 | list_for_each(pos2, &asoc->peer.transport_addr_list) { |
1168 | addr = list_entry(pos2, struct sctp_transport, | 1168 | addr = list_entry(pos2, struct sctp_transport, |
1169 | transports); | 1169 | transports); |
1170 | if (sctp_cmp_addr_exact(&new_addr->ipaddr_h, | 1170 | if (sctp_cmp_addr_exact(&new_addr->ipaddr, |
1171 | &addr->ipaddr_h)) { | 1171 | &addr->ipaddr)) { |
1172 | found = 1; | 1172 | found = 1; |
1173 | break; | 1173 | break; |
1174 | } | 1174 | } |
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 459f32c5c3ae..e03ba9055eb1 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c | |||
@@ -693,7 +693,6 @@ static int sctp_send_asconf_del_ip(struct sock *sk, | |||
693 | struct sctp_bind_addr *bp; | 693 | struct sctp_bind_addr *bp; |
694 | struct sctp_chunk *chunk; | 694 | struct sctp_chunk *chunk; |
695 | union sctp_addr *laddr; | 695 | union sctp_addr *laddr; |
696 | union sctp_addr saveaddr; | ||
697 | void *addr_buf; | 696 | void *addr_buf; |
698 | struct sctp_af *af; | 697 | struct sctp_af *af; |
699 | struct list_head *pos, *pos1; | 698 | struct list_head *pos, *pos1; |
@@ -773,13 +772,11 @@ static int sctp_send_asconf_del_ip(struct sock *sk, | |||
773 | for (i = 0; i < addrcnt; i++) { | 772 | for (i = 0; i < addrcnt; i++) { |
774 | laddr = (union sctp_addr *)addr_buf; | 773 | laddr = (union sctp_addr *)addr_buf; |
775 | af = sctp_get_af_specific(laddr->v4.sin_family); | 774 | af = sctp_get_af_specific(laddr->v4.sin_family); |
776 | memcpy(&saveaddr, laddr, af->sockaddr_len); | ||
777 | saveaddr.v4.sin_port = ntohs(saveaddr.v4.sin_port); | ||
778 | list_for_each(pos1, &bp->address_list) { | 775 | list_for_each(pos1, &bp->address_list) { |
779 | saddr = list_entry(pos1, | 776 | saddr = list_entry(pos1, |
780 | struct sctp_sockaddr_entry, | 777 | struct sctp_sockaddr_entry, |
781 | list); | 778 | list); |
782 | if (sctp_cmp_addr_exact(&saddr->a_h, &saveaddr)) | 779 | if (sctp_cmp_addr_exact(&saddr->a, laddr)) |
783 | saddr->use_as_src = 0; | 780 | saddr->use_as_src = 0; |
784 | } | 781 | } |
785 | addr_buf += af->sockaddr_len; | 782 | addr_buf += af->sockaddr_len; |