Skip to content

Commit

Permalink
sctp: clean up route lookup calls
Browse files Browse the repository at this point in the history
Change the call to take the transport parameter and set the
cached 'dst' appropriately inside the get_dst() function calls.

This will allow us in the future  to clean up source address
storage as well.

Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Vlad Yasevich authored and David S. Miller committed Apr 27, 2011
1 parent af13847 commit da0420b
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 31 deletions.
3 changes: 1 addition & 2 deletions include/net/sctp/structs.h
Original file line number Diff line number Diff line change
Expand Up @@ -564,8 +564,7 @@ struct sctp_af {
int optname,
char __user *optval,
int __user *optlen);
struct dst_entry *(*get_dst) (struct sctp_association *asoc,
union sctp_addr *daddr,
void (*get_dst) (struct sctp_transport *t,
union sctp_addr *saddr,
struct flowi *fl,
struct sock *sk);
Expand Down
17 changes: 8 additions & 9 deletions net/sctp/ipv6.c
Original file line number Diff line number Diff line change
Expand Up @@ -247,17 +247,16 @@ static int sctp_v6_xmit(struct sk_buff *skb, struct sctp_transport *transport)
/* Returns the dst cache entry for the given source and destination ip
* addresses.
*/
static struct dst_entry *sctp_v6_get_dst(struct sctp_association *asoc,
union sctp_addr *daddr,
union sctp_addr *saddr,
struct flowi *fl,
struct sock *sk)
static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr,
struct flowi *fl, struct sock *sk)
{
struct sctp_association *asoc = t->asoc;
struct dst_entry *dst = NULL;
struct flowi6 *fl6 = &fl->u.ip6;
struct sctp_bind_addr *bp;
struct sctp_sockaddr_entry *laddr;
union sctp_addr *baddr = NULL;
union sctp_addr *daddr = &t->ipaddr;
union sctp_addr dst_saddr;
__u8 matchlen = 0;
__u8 bmatchlen;
Expand All @@ -270,7 +269,6 @@ static struct dst_entry *sctp_v6_get_dst(struct sctp_association *asoc,
if (ipv6_addr_type(&daddr->v6.sin6_addr) & IPV6_ADDR_LINKLOCAL)
fl6->flowi6_oif = daddr->v6.sin6_scope_id;


SCTP_DEBUG_PRINTK("%s: DST=%pI6 ", __func__, &fl6->daddr);

if (asoc)
Expand Down Expand Up @@ -343,12 +341,13 @@ static struct dst_entry *sctp_v6_get_dst(struct sctp_association *asoc,
if (!IS_ERR(dst)) {
struct rt6_info *rt;
rt = (struct rt6_info *)dst;
t->dst = dst;
SCTP_DEBUG_PRINTK("rt6_dst:%pI6 rt6_src:%pI6\n",
&rt->rt6i_dst.addr, &fl6->saddr);
return dst;
} else {
t->dst = NULL;
SCTP_DEBUG_PRINTK("NO ROUTE\n");
}
SCTP_DEBUG_PRINTK("NO ROUTE\n");
return NULL;
}

/* Returns the number of consecutive initial bits that match in the 2 ipv6
Expand Down
12 changes: 5 additions & 7 deletions net/sctp/protocol.c
Original file line number Diff line number Diff line change
Expand Up @@ -463,17 +463,16 @@ static sctp_scope_t sctp_v4_scope(union sctp_addr *addr)
* addresses. If an association is passed, trys to get a dst entry with a
* source address that matches an address in the bind address list.
*/
static struct dst_entry *sctp_v4_get_dst(struct sctp_association *asoc,
union sctp_addr *daddr,
union sctp_addr *saddr,
struct flowi *fl,
struct sock *sk)
static void sctp_v4_get_dst(struct sctp_transport *t, union sctp_addr *saddr,
struct flowi *fl, struct sock *sk)
{
struct sctp_association *asoc = t->asoc;
struct rtable *rt;
struct flowi4 *fl4 = &fl->u.ip4;
struct sctp_bind_addr *bp;
struct sctp_sockaddr_entry *laddr;
struct dst_entry *dst = NULL;
union sctp_addr *daddr = &t->ipaddr;
union sctp_addr dst_saddr;

memset(fl4, 0x0, sizeof(struct flowi4));
Expand Down Expand Up @@ -548,13 +547,12 @@ static struct dst_entry *sctp_v4_get_dst(struct sctp_association *asoc,
out_unlock:
rcu_read_unlock();
out:
t->dst = dst;
if (dst)
SCTP_DEBUG_PRINTK("rt_dst:%pI4, rt_src:%pI4\n",
&rt->rt_dst, &rt->rt_src);
else
SCTP_DEBUG_PRINTK("NO ROUTE\n");

return dst;
}

/* For v4, the source address is cached in the route entry(dst). So no need
Expand Down
23 changes: 10 additions & 13 deletions net/sctp/transport.c
Original file line number Diff line number Diff line change
Expand Up @@ -213,17 +213,17 @@ void sctp_transport_set_owner(struct sctp_transport *transport,
/* Initialize the pmtu of a transport. */
void sctp_transport_pmtu(struct sctp_transport *transport, struct sock *sk)
{
struct dst_entry *dst;
struct flowi fl;

dst = transport->af_specific->get_dst(transport->asoc,
&transport->ipaddr,
&transport->saddr,
/* If we don't have a fresh route, look one up */
if (!transport->dst || transport->dst->obsolete > 1) {
dst_release(transport->dst);
transport->af_specific->get_dst(transport, &transport->saddr,
&fl, sk);
}

if (dst) {
transport->pathmtu = dst_mtu(dst);
dst_release(dst);
if (transport->dst) {
transport->pathmtu = dst_mtu(transport->dst);
} else
transport->pathmtu = SCTP_DEFAULT_MAXSEGMENT;
}
Expand Down Expand Up @@ -274,12 +274,9 @@ void sctp_transport_route(struct sctp_transport *transport,
{
struct sctp_association *asoc = transport->asoc;
struct sctp_af *af = transport->af_specific;
union sctp_addr *daddr = &transport->ipaddr;
struct dst_entry *dst;
struct flowi fl;

dst = af->get_dst(asoc, daddr, saddr, &fl, sctp_opt2sk(opt));
transport->dst = dst;
af->get_dst(transport, saddr, &fl, sctp_opt2sk(opt));

if (saddr)
memcpy(&transport->saddr, saddr, sizeof(union sctp_addr));
Expand All @@ -289,8 +286,8 @@ void sctp_transport_route(struct sctp_transport *transport,
if ((transport->param_flags & SPP_PMTUD_DISABLE) && transport->pathmtu) {
return;
}
if (dst) {
transport->pathmtu = dst_mtu(dst);
if (transport->dst) {
transport->pathmtu = dst_mtu(transport->dst);

/* Initialize sk->sk_rcv_saddr, if the transport is the
* association's active path for getsockname().
Expand Down

0 comments on commit da0420b

Please sign in to comment.