Commit 09ef7fec authored by Al Viro's avatar Al Viro Committed by David S. Miller
Browse files

[SCTP]: Beginning of conversion to net-endian for embedded sctp_addr.



Part 1: rename sctp_chunk->source, sctp_sockaddr_entry->a,
sctp_transport->ipaddr and sctp_transport->saddr (to ..._h)

The next patch will reintroduce these fields and keep them as
net-endian mirrors of the original (renamed) ones.  Split in
two patches to make sure that we hadn't forgotten any instanes.

Later in the series we'll eliminate uses of host-endian variants
(basically switching users to net-endian counterparts as we
progress through that mess).  Then host-endian ones will die.

Other embedded host-endian sctp_addr will be easier to switch
directly, so we leave them alone for now.

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 30330ee0
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -713,7 +713,7 @@ struct sctp_chunk {
	unsigned long sent_at;

	/* What is the origin IP address for this chunk?  */
	union sctp_addr source;
	union sctp_addr source_h;
	/* Destination address for this chunk. */
	union sctp_addr dest;

@@ -756,7 +756,7 @@ const union sctp_addr *sctp_source(const struct sctp_chunk *chunk);
/* This is a structure for holding either an IPv6 or an IPv4 address.  */
struct sctp_sockaddr_entry {
	struct list_head list;
	union sctp_addr a;
	union sctp_addr a_h;
	__u8 use_as_src;
};

@@ -842,7 +842,7 @@ struct sctp_transport {
	int	 dead;

	/* This is the peer's IP address and port. */
	union sctp_addr ipaddr;
	union sctp_addr ipaddr_h;

	/* These are the functions we call to handle LLP stuff.	 */
	struct sctp_af *af_specific;
@@ -900,7 +900,7 @@ struct sctp_transport {
	/* Destination */
	struct dst_entry *dst;
	/* Source address. */
	union sctp_addr saddr;
	union sctp_addr saddr_h;

	/* When was the last time(in jiffies) that a data packet was sent on
	 * this transport?  This is used to adjust the cwnd when the transport
+15 −15
Original line number Diff line number Diff line
@@ -442,7 +442,7 @@ void sctp_assoc_set_primary(struct sctp_association *asoc,
	asoc->peer.primary_path = transport;

	/* Set a default msg_name for events. */
	memcpy(&asoc->peer.primary_addr, &transport->ipaddr,
	memcpy(&asoc->peer.primary_addr, &transport->ipaddr_h,
	       sizeof(union sctp_addr));

	/* If the primary path is changing, assume that the
@@ -487,8 +487,8 @@ void sctp_assoc_rm_peer(struct sctp_association *asoc,
	SCTP_DEBUG_PRINTK_IPADDR("sctp_assoc_rm_peer:association %p addr: ",
				 " port: %d\n",
				 asoc,
				 (&peer->ipaddr),
				 peer->ipaddr.v4.sin_port);
				 (&peer->ipaddr_h),
				 peer->ipaddr_h.v4.sin_port);

	/* If we are to remove the current retran_path, update it
	 * to the next peer before removing this peer from the list.
@@ -669,7 +669,7 @@ void sctp_assoc_del_peer(struct sctp_association *asoc,

	list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) {
		transport = list_entry(pos, struct sctp_transport, transports);
		if (sctp_cmp_addr_exact(addr, &transport->ipaddr)) {
		if (sctp_cmp_addr_exact(addr, &transport->ipaddr_h)) {
			/* Do book keeping for removing the peer and free it. */
			sctp_assoc_rm_peer(asoc, transport);
			break;
@@ -689,7 +689,7 @@ struct sctp_transport *sctp_assoc_lookup_paddr(

	list_for_each(pos, &asoc->peer.transport_addr_list) {
		t = list_entry(pos, struct sctp_transport, transports);
		if (sctp_cmp_addr_exact(address, &t->ipaddr))
		if (sctp_cmp_addr_exact(address, &t->ipaddr_h))
			return t;
	}

@@ -733,7 +733,7 @@ void sctp_assoc_control_transport(struct sctp_association *asoc,
	 * user.
	 */
	memset(&addr, 0, sizeof(struct sockaddr_storage));
	flip_to_n((union sctp_addr *)&addr, &transport->ipaddr);
	flip_to_n((union sctp_addr *)&addr, &transport->ipaddr_h);
	event = sctp_ulpevent_make_peer_addr_change(asoc, &addr,
				0, spc_state, error, GFP_ATOMIC);
	if (event)
@@ -1043,8 +1043,8 @@ void sctp_assoc_update(struct sctp_association *asoc,
	/* Remove any peer addresses not present in the new association. */
	list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) {
		trans = list_entry(pos, struct sctp_transport, transports);
		if (!sctp_assoc_lookup_paddr(new, &trans->ipaddr))
			sctp_assoc_del_peer(asoc, &trans->ipaddr);
		if (!sctp_assoc_lookup_paddr(new, &trans->ipaddr_h))
			sctp_assoc_del_peer(asoc, &trans->ipaddr_h);
	}

	/* If the case is A (association restart), use
@@ -1067,8 +1067,8 @@ void sctp_assoc_update(struct sctp_association *asoc,
		list_for_each(pos, &new->peer.transport_addr_list) {
			trans = list_entry(pos, struct sctp_transport,
					   transports);
			if (!sctp_assoc_lookup_paddr(asoc, &trans->ipaddr))
				sctp_assoc_add_peer(asoc, &trans->ipaddr,
			if (!sctp_assoc_lookup_paddr(asoc, &trans->ipaddr_h))
				sctp_assoc_add_peer(asoc, &trans->ipaddr_h,
						    GFP_ATOMIC, trans->state);
		}

@@ -1136,8 +1136,8 @@ void sctp_assoc_update_retran_path(struct sctp_association *asoc)
				 " %p addr: ",
				 " port: %d\n",
				 asoc,
				 (&t->ipaddr),
				 t->ipaddr.v4.sin_port);
				 (&t->ipaddr_h),
				 t->ipaddr_h.v4.sin_port);
}

/* Choose the transport for sending a INIT packet.  */
@@ -1161,8 +1161,8 @@ struct sctp_transport *sctp_assoc_choose_init_transport(
				 " %p addr: ",
				 " port: %d\n",
				 asoc,
				 (&t->ipaddr),
				 t->ipaddr.v4.sin_port);
				 (&t->ipaddr_h),
				 t->ipaddr_h.v4.sin_port);

	return t;
}
@@ -1307,7 +1307,7 @@ int sctp_assoc_set_bind_addr_from_ep(struct sctp_association *asoc,
	/* Use scoping rules to determine the subset of addresses from
	 * the endpoint.
	 */
	scope = sctp_scope(&asoc->peer.active_path->ipaddr);
	scope = sctp_scope(&asoc->peer.active_path->ipaddr_h);
	flags = (PF_INET6 == asoc->base.sk->sk_family) ? SCTP_ADDR6_ALLOWED : 0;
	if (asoc->peer.ipv4_address)
		flags |= SCTP_ADDR4_PEERSUPP;
+11 −11
Original line number Diff line number Diff line
@@ -77,7 +77,7 @@ int sctp_bind_addr_copy(struct sctp_bind_addr *dest,
	/* Extract the addresses which are relevant for this scope.  */
	list_for_each(pos, &src->address_list) {
		addr = list_entry(pos, struct sctp_sockaddr_entry, list);
		error = sctp_copy_one_addr(dest, &addr->a, scope,
		error = sctp_copy_one_addr(dest, &addr->a_h, scope,
					   gfp, flags);
		if (error < 0)
			goto out;
@@ -91,7 +91,7 @@ int sctp_bind_addr_copy(struct sctp_bind_addr *dest,
		list_for_each(pos, &src->address_list) {
			addr = list_entry(pos, struct sctp_sockaddr_entry,
					  list);
			error = sctp_copy_one_addr(dest, &addr->a,
			error = sctp_copy_one_addr(dest, &addr->a_h,
						   SCTP_SCOPE_LINK, gfp,
						   flags);
			if (error < 0)
@@ -155,13 +155,13 @@ int sctp_add_bind_addr(struct sctp_bind_addr *bp, union sctp_addr *new,
	if (!addr)
		return -ENOMEM;

	memcpy(&addr->a, new, sizeof(*new));
	memcpy(&addr->a_h, new, sizeof(*new));

	/* Fix up the port if it has not yet been set.
	 * Both v4 and v6 have the port at the same offset.
	 */
	if (!addr->a.v4.sin_port)
		addr->a.v4.sin_port = bp->port;
	if (!addr->a_h.v4.sin_port)
		addr->a_h.v4.sin_port = bp->port;

	addr->use_as_src = use_as_src;

@@ -182,7 +182,7 @@ int sctp_del_bind_addr(struct sctp_bind_addr *bp, union sctp_addr *del_addr)

	list_for_each_safe(pos, temp, &bp->address_list) {
		addr = list_entry(pos, struct sctp_sockaddr_entry, list);
		if (sctp_cmp_addr_exact(&addr->a, del_addr)) {
		if (sctp_cmp_addr_exact(&addr->a_h, del_addr)) {
			/* Found the exact match. */
			list_del(pos);
			kfree(addr);
@@ -237,8 +237,8 @@ union sctp_params sctp_bind_addrs_to_raw(const struct sctp_bind_addr *bp,

	list_for_each(pos, &bp->address_list) {
		addr = list_entry(pos, struct sctp_sockaddr_entry, list);
		af = sctp_get_af_specific(addr->a.v4.sin_family);
		len = af->to_addr_param(&addr->a, &rawaddr);
		af = sctp_get_af_specific(addr->a_h.v4.sin_family);
		len = af->to_addr_param(&addr->a_h, &rawaddr);
		memcpy(addrparms.v, &rawaddr, len);
		addrparms.v += len;
		addrparms_len += len;
@@ -305,7 +305,7 @@ int sctp_bind_addr_match(struct sctp_bind_addr *bp,

	list_for_each(pos, &bp->address_list) {
		laddr = list_entry(pos, struct sctp_sockaddr_entry, list);
		if (opt->pf->cmp_addr(&laddr->a, addr, opt))
		if (opt->pf->cmp_addr(&laddr->a_h, addr, opt))
 			return 1;
	}

@@ -339,13 +339,13 @@ union sctp_addr *sctp_find_unmatch_addr(struct sctp_bind_addr *bp,
				return NULL;
			flip_to_h(&tmp, addr);

			if (opt->pf->cmp_addr(&laddr->a, &tmp, opt))
			if (opt->pf->cmp_addr(&laddr->a_h, &tmp, opt))
				break;

			addr_buf += af->sockaddr_len;
		}
		if (i == addrcnt)
			return &laddr->a;
			return &laddr->a_h;
	}

	return NULL;
+1 −1
Original line number Diff line number Diff line
@@ -305,7 +305,7 @@ int sctp_endpoint_is_peeled_off(struct sctp_endpoint *ep,
	bp = &ep->base.bind_addr;
	list_for_each(pos, &bp->address_list) {
		addr = list_entry(pos, struct sctp_sockaddr_entry, list);
		if (sctp_has_association(&addr->a, paddr)) {
		if (sctp_has_association(&addr->a_h, paddr)) {
			sctp_read_unlock(&ep->base.addr_lock);
			return 1;
		}
+12 −12
Original line number Diff line number Diff line
@@ -161,17 +161,17 @@ static int sctp_v6_xmit(struct sk_buff *skb, struct sctp_transport *transport,
	/* Fill in the dest address from the route entry passed with the skb
	 * and the source address from the transport.
	 */
	ipv6_addr_copy(&fl.fl6_dst, &transport->ipaddr.v6.sin6_addr);
	ipv6_addr_copy(&fl.fl6_src, &transport->saddr.v6.sin6_addr);
	ipv6_addr_copy(&fl.fl6_dst, &transport->ipaddr_h.v6.sin6_addr);
	ipv6_addr_copy(&fl.fl6_src, &transport->saddr_h.v6.sin6_addr);

	fl.fl6_flowlabel = np->flow_label;
	IP6_ECN_flow_xmit(sk, fl.fl6_flowlabel);
	if (ipv6_addr_type(&fl.fl6_src) & IPV6_ADDR_LINKLOCAL)
		fl.oif = transport->saddr.v6.sin6_scope_id;
		fl.oif = transport->saddr_h.v6.sin6_scope_id;
	else
		fl.oif = sk->sk_bound_dev_if;
	fl.fl_ip_sport = inet_sk(sk)->sport;
	fl.fl_ip_dport = transport->ipaddr.v6.sin6_port;
	fl.fl_ip_dport = transport->ipaddr_h.v6.sin6_port;

	if (np->opt && np->opt->srcrt) {
		struct rt0_hdr *rt0 = (struct rt0_hdr *) np->opt->srcrt;
@@ -290,11 +290,11 @@ static void sctp_v6_get_saddr(struct sctp_association *asoc,
	list_for_each(pos, &bp->address_list) {
		laddr = list_entry(pos, struct sctp_sockaddr_entry, list);
		if ((laddr->use_as_src) &&
		    (laddr->a.sa.sa_family == AF_INET6) &&
		    (scope <= sctp_scope(&laddr->a))) {
			bmatchlen = sctp_v6_addr_match_len(daddr, &laddr->a);
		    (laddr->a_h.sa.sa_family == AF_INET6) &&
		    (scope <= sctp_scope(&laddr->a_h))) {
			bmatchlen = sctp_v6_addr_match_len(daddr, &laddr->a_h);
			if (!baddr || (matchlen < bmatchlen)) {
				baddr = &laddr->a;
				baddr = &laddr->a_h;
				matchlen = bmatchlen;
			}
		}
@@ -332,10 +332,10 @@ static void sctp_v6_copy_addrlist(struct list_head *addrlist,
		/* Add the address to the local list.  */
		addr = t_new(struct sctp_sockaddr_entry, GFP_ATOMIC);
		if (addr) {
			addr->a.v6.sin6_family = AF_INET6;
			addr->a.v6.sin6_port = 0;
			addr->a.v6.sin6_addr = ifp->addr;
			addr->a.v6.sin6_scope_id = dev->ifindex;
			addr->a_h.v6.sin6_family = AF_INET6;
			addr->a_h.v6.sin6_port = 0;
			addr->a_h.v6.sin6_addr = ifp->addr;
			addr->a_h.v6.sin6_scope_id = dev->ifindex;
			INIT_LIST_HEAD(&addr->list);
			list_add_tail(&addr->list, addrlist);
		}
Loading