diff options
Diffstat (limited to 'net/sctp/protocol.c')
| -rw-r--r-- | net/sctp/protocol.c | 20 | 
1 files changed, 12 insertions, 8 deletions
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index 4e1d0fcb028e..6789d785e698 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c @@ -491,8 +491,13 @@ static void sctp_v4_get_dst(struct sctp_transport *t, union sctp_addr *saddr,  			continue;  		if ((laddr->state == SCTP_ADDR_SRC) &&  		    (AF_INET == laddr->a.sa.sa_family)) { -			fl4->saddr = laddr->a.v4.sin_addr.s_addr;  			fl4->fl4_sport = laddr->a.v4.sin_port; +			flowi4_update_output(fl4, +					     asoc->base.sk->sk_bound_dev_if, +					     RT_CONN_FLAGS(asoc->base.sk), +					     daddr->v4.sin_addr.s_addr, +					     laddr->a.v4.sin_addr.s_addr); +  			rt = ip_route_output_key(sock_net(sk), fl4);  			if (!IS_ERR(rt)) {  				dst = &rt->dst; @@ -957,7 +962,7 @@ static inline int sctp_v4_xmit(struct sk_buff *skb,  	SCTP_INC_STATS(sock_net(&inet->sk), SCTP_MIB_OUTSCTPPACKS); -	return ip_queue_xmit(skb, &transport->fl); +	return ip_queue_xmit(&inet->sk, skb, &transport->fl);  }  static struct sctp_af sctp_af_inet; @@ -1012,7 +1017,6 @@ static struct inet_protosw sctp_seqpacket_protosw = {  	.protocol   = IPPROTO_SCTP,  	.prot       = &sctp_prot,  	.ops        = &inet_seqpacket_ops, -	.no_check   = 0,  	.flags      = SCTP_PROTOSW_FLAG  };  static struct inet_protosw sctp_stream_protosw = { @@ -1020,7 +1024,6 @@ static struct inet_protosw sctp_stream_protosw = {  	.protocol   = IPPROTO_SCTP,  	.prot       = &sctp_prot,  	.ops        = &inet_seqpacket_ops, -	.no_check   = 0,  	.flags      = SCTP_PROTOSW_FLAG  }; @@ -1100,14 +1103,15 @@ int sctp_register_pf(struct sctp_pf *pf, sa_family_t family)  static inline int init_sctp_mibs(struct net *net)  { -	return snmp_mib_init((void __percpu **)net->sctp.sctp_statistics, -			     sizeof(struct sctp_mib), -			     __alignof__(struct sctp_mib)); +	net->sctp.sctp_statistics = alloc_percpu(struct sctp_mib); +	if (!net->sctp.sctp_statistics) +		return -ENOMEM; +	return 0;  }  static inline void cleanup_sctp_mibs(struct net *net)  { -	snmp_mib_free((void __percpu **)net->sctp.sctp_statistics); +	free_percpu(net->sctp.sctp_statistics);  }  static void sctp_v4_pf_init(void)  |