ipv4: Make caller provide on-stack flow key to ip_route_output_ports().
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
f1390160dd
commit
31e4543db2
14 changed files with 47 additions and 30 deletions
|
@ -338,8 +338,9 @@ static struct rtable *find_route(struct t3cdev *dev, __be32 local_ip,
|
|||
__be16 peer_port, u8 tos)
|
||||
{
|
||||
struct rtable *rt;
|
||||
struct flowi4 fl4;
|
||||
|
||||
rt = ip_route_output_ports(&init_net, NULL, peer_ip, local_ip,
|
||||
rt = ip_route_output_ports(&init_net, &fl4, NULL, peer_ip, local_ip,
|
||||
peer_port, local_port, IPPROTO_TCP,
|
||||
tos, 0);
|
||||
if (IS_ERR(rt))
|
||||
|
|
|
@ -315,8 +315,9 @@ static struct rtable *find_route(struct c4iw_dev *dev, __be32 local_ip,
|
|||
__be16 peer_port, u8 tos)
|
||||
{
|
||||
struct rtable *rt;
|
||||
struct flowi4 fl4;
|
||||
|
||||
rt = ip_route_output_ports(&init_net, NULL, peer_ip, local_ip,
|
||||
rt = ip_route_output_ports(&init_net, &fl4, NULL, peer_ip, local_ip,
|
||||
peer_port, local_port, IPPROTO_TCP,
|
||||
tos, 0);
|
||||
if (IS_ERR(rt))
|
||||
|
|
|
@ -175,6 +175,7 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb)
|
|||
struct pptp_opt *opt = &po->proto.pptp;
|
||||
struct pptp_gre_header *hdr;
|
||||
unsigned int header_len = sizeof(*hdr);
|
||||
struct flowi4 fl4;
|
||||
int islcp;
|
||||
int len;
|
||||
unsigned char *data;
|
||||
|
@ -189,7 +190,7 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb)
|
|||
if (sk_pppox(po)->sk_state & PPPOX_DEAD)
|
||||
goto tx_error;
|
||||
|
||||
rt = ip_route_output_ports(&init_net, NULL,
|
||||
rt = ip_route_output_ports(&init_net, &fl4, NULL,
|
||||
opt->dst_addr.sin_addr.s_addr,
|
||||
opt->src_addr.sin_addr.s_addr,
|
||||
0, 0, IPPROTO_GRE,
|
||||
|
@ -434,6 +435,7 @@ static int pptp_connect(struct socket *sock, struct sockaddr *uservaddr,
|
|||
struct pppox_sock *po = pppox_sk(sk);
|
||||
struct pptp_opt *opt = &po->proto.pptp;
|
||||
struct rtable *rt;
|
||||
struct flowi4 fl4;
|
||||
int error = 0;
|
||||
|
||||
if (sp->sa_protocol != PX_PROTO_PPTP)
|
||||
|
@ -463,7 +465,7 @@ static int pptp_connect(struct socket *sock, struct sockaddr *uservaddr,
|
|||
po->chan.private = sk;
|
||||
po->chan.ops = &pptp_chan_ops;
|
||||
|
||||
rt = ip_route_output_ports(&init_net, sk,
|
||||
rt = ip_route_output_ports(&init_net, &fl4, sk,
|
||||
opt->dst_addr.sin_addr.s_addr,
|
||||
opt->src_addr.sin_addr.s_addr,
|
||||
0, 0,
|
||||
|
|
|
@ -454,8 +454,9 @@ static struct rtable *find_route_ipv4(__be32 saddr, __be32 daddr,
|
|||
__be16 sport, __be16 dport, u8 tos)
|
||||
{
|
||||
struct rtable *rt;
|
||||
struct flowi4 fl4;
|
||||
|
||||
rt = ip_route_output_ports(&init_net, NULL, daddr, saddr,
|
||||
rt = ip_route_output_ports(&init_net, &fl4, NULL, daddr, saddr,
|
||||
dport, sport, IPPROTO_TCP, tos, 0);
|
||||
if (IS_ERR(rt))
|
||||
return NULL;
|
||||
|
|
|
@ -137,20 +137,19 @@ static inline struct rtable *ip_route_output(struct net *net, __be32 daddr,
|
|||
return ip_route_output_key(net, &fl4);
|
||||
}
|
||||
|
||||
static inline struct rtable *ip_route_output_ports(struct net *net, struct sock *sk,
|
||||
static inline struct rtable *ip_route_output_ports(struct net *net, struct flowi4 *fl4,
|
||||
struct sock *sk,
|
||||
__be32 daddr, __be32 saddr,
|
||||
__be16 dport, __be16 sport,
|
||||
__u8 proto, __u8 tos, int oif)
|
||||
{
|
||||
struct flowi4 fl4;
|
||||
|
||||
flowi4_init_output(&fl4, oif, sk ? sk->sk_mark : 0, tos,
|
||||
flowi4_init_output(fl4, oif, sk ? sk->sk_mark : 0, tos,
|
||||
RT_SCOPE_UNIVERSE, proto,
|
||||
sk ? inet_sk_flowi_flags(sk) : 0,
|
||||
daddr, saddr, dport, sport);
|
||||
if (sk)
|
||||
security_sk_classify_flow(sk, flowi4_to_flowi(&fl4));
|
||||
return ip_route_output_flow(net, &fl4, sk);
|
||||
security_sk_classify_flow(sk, flowi4_to_flowi(fl4));
|
||||
return ip_route_output_flow(net, fl4, sk);
|
||||
}
|
||||
|
||||
static inline struct rtable *ip_route_output_gre(struct net *net,
|
||||
|
|
|
@ -1152,6 +1152,7 @@ int inet_sk_rebuild_header(struct sock *sk)
|
|||
struct rtable *rt = (struct rtable *)__sk_dst_check(sk, 0);
|
||||
__be32 daddr;
|
||||
struct ip_options_rcu *inet_opt;
|
||||
struct flowi4 fl4;
|
||||
int err;
|
||||
|
||||
/* Route is OK, nothing to do. */
|
||||
|
@ -1165,7 +1166,7 @@ int inet_sk_rebuild_header(struct sock *sk)
|
|||
if (inet_opt && inet_opt->opt.srr)
|
||||
daddr = inet_opt->opt.faddr;
|
||||
rcu_read_unlock();
|
||||
rt = ip_route_output_ports(sock_net(sk), sk, daddr, inet->inet_saddr,
|
||||
rt = ip_route_output_ports(sock_net(sk), &fl4, sk, daddr, inet->inet_saddr,
|
||||
inet->inet_dport, inet->inet_sport,
|
||||
sk->sk_protocol, RT_CONN_FLAGS(sk),
|
||||
sk->sk_bound_dev_if);
|
||||
|
|
|
@ -309,6 +309,7 @@ static struct sk_buff *igmpv3_newpack(struct net_device *dev, int size)
|
|||
struct iphdr *pip;
|
||||
struct igmpv3_report *pig;
|
||||
struct net *net = dev_net(dev);
|
||||
struct flowi4 fl4;
|
||||
|
||||
while (1) {
|
||||
skb = alloc_skb(size + LL_ALLOCATED_SPACE(dev),
|
||||
|
@ -321,7 +322,7 @@ static struct sk_buff *igmpv3_newpack(struct net_device *dev, int size)
|
|||
}
|
||||
igmp_skb_size(skb) = size;
|
||||
|
||||
rt = ip_route_output_ports(net, NULL, IGMPV3_ALL_MCR, 0,
|
||||
rt = ip_route_output_ports(net, &fl4, NULL, IGMPV3_ALL_MCR, 0,
|
||||
0, 0,
|
||||
IPPROTO_IGMP, 0, dev->ifindex);
|
||||
if (IS_ERR(rt)) {
|
||||
|
@ -650,6 +651,7 @@ static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc,
|
|||
struct net_device *dev = in_dev->dev;
|
||||
struct net *net = dev_net(dev);
|
||||
__be32 group = pmc ? pmc->multiaddr : 0;
|
||||
struct flowi4 fl4;
|
||||
__be32 dst;
|
||||
|
||||
if (type == IGMPV3_HOST_MEMBERSHIP_REPORT)
|
||||
|
@ -659,7 +661,7 @@ static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc,
|
|||
else
|
||||
dst = group;
|
||||
|
||||
rt = ip_route_output_ports(net, NULL, dst, 0,
|
||||
rt = ip_route_output_ports(net, &fl4, NULL, dst, 0,
|
||||
0, 0,
|
||||
IPPROTO_IGMP, 0, dev->ifindex);
|
||||
if (IS_ERR(rt))
|
||||
|
|
|
@ -333,6 +333,7 @@ int ip_queue_xmit(struct sk_buff *skb)
|
|||
/* Make sure we can route this packet. */
|
||||
rt = (struct rtable *)__sk_dst_check(sk, 0);
|
||||
if (rt == NULL) {
|
||||
struct flowi4 fl4;
|
||||
__be32 daddr;
|
||||
|
||||
/* Use correct destination address if we have options. */
|
||||
|
@ -344,7 +345,7 @@ int ip_queue_xmit(struct sk_buff *skb)
|
|||
* keep trying until route appears or the connection times
|
||||
* itself out.
|
||||
*/
|
||||
rt = ip_route_output_ports(sock_net(sk), sk,
|
||||
rt = ip_route_output_ports(sock_net(sk), &fl4, sk,
|
||||
daddr, inet->inet_saddr,
|
||||
inet->inet_dport,
|
||||
inet->inet_sport,
|
||||
|
|
|
@ -442,6 +442,7 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
struct iphdr *iph; /* Our new IP header */
|
||||
unsigned int max_headroom; /* The extra header space needed */
|
||||
__be32 dst = tiph->daddr;
|
||||
struct flowi4 fl4;
|
||||
int mtu;
|
||||
|
||||
if (skb->protocol != htons(ETH_P_IP))
|
||||
|
@ -460,7 +461,7 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
goto tx_error_icmp;
|
||||
}
|
||||
|
||||
rt = ip_route_output_ports(dev_net(dev), NULL,
|
||||
rt = ip_route_output_ports(dev_net(dev), &fl4, NULL,
|
||||
dst, tiph->saddr,
|
||||
0, 0,
|
||||
IPPROTO_IPIP, RT_TOS(tos),
|
||||
|
@ -578,13 +579,15 @@ static void ipip_tunnel_bind_dev(struct net_device *dev)
|
|||
iph = &tunnel->parms.iph;
|
||||
|
||||
if (iph->daddr) {
|
||||
struct rtable *rt = ip_route_output_ports(dev_net(dev), NULL,
|
||||
iph->daddr, iph->saddr,
|
||||
0, 0,
|
||||
IPPROTO_IPIP,
|
||||
RT_TOS(iph->tos),
|
||||
tunnel->parms.link);
|
||||
struct rtable *rt;
|
||||
struct flowi4 fl4;
|
||||
|
||||
rt = ip_route_output_ports(dev_net(dev), &fl4, NULL,
|
||||
iph->daddr, iph->saddr,
|
||||
0, 0,
|
||||
IPPROTO_IPIP,
|
||||
RT_TOS(iph->tos),
|
||||
tunnel->parms.link);
|
||||
if (!IS_ERR(rt)) {
|
||||
tdev = rt->dst.dev;
|
||||
ip_rt_put(rt);
|
||||
|
|
|
@ -1595,6 +1595,7 @@ static void ipmr_queue_xmit(struct net *net, struct mr_table *mrt,
|
|||
struct vif_device *vif = &mrt->vif_table[vifi];
|
||||
struct net_device *dev;
|
||||
struct rtable *rt;
|
||||
struct flowi4 fl4;
|
||||
int encap = 0;
|
||||
|
||||
if (vif->dev == NULL)
|
||||
|
@ -1612,7 +1613,7 @@ static void ipmr_queue_xmit(struct net *net, struct mr_table *mrt,
|
|||
#endif
|
||||
|
||||
if (vif->flags & VIFF_TUNNEL) {
|
||||
rt = ip_route_output_ports(net, NULL,
|
||||
rt = ip_route_output_ports(net, &fl4, NULL,
|
||||
vif->remote, vif->local,
|
||||
0, 0,
|
||||
IPPROTO_IPIP,
|
||||
|
@ -1621,7 +1622,7 @@ static void ipmr_queue_xmit(struct net *net, struct mr_table *mrt,
|
|||
goto out_free;
|
||||
encap = sizeof(struct iphdr);
|
||||
} else {
|
||||
rt = ip_route_output_ports(net, NULL, iph->daddr, 0,
|
||||
rt = ip_route_output_ports(net, &fl4, NULL, iph->daddr, 0,
|
||||
0, 0,
|
||||
IPPROTO_IPIP,
|
||||
RT_TOS(iph->tos), vif->link);
|
||||
|
|
|
@ -537,6 +537,7 @@ ip4ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
|
|||
struct sk_buff *skb2;
|
||||
const struct iphdr *eiph;
|
||||
struct rtable *rt;
|
||||
struct flowi4 fl4;
|
||||
|
||||
err = ip6_tnl_err(skb, IPPROTO_IPIP, opt, &rel_type, &rel_code,
|
||||
&rel_msg, &rel_info, offset);
|
||||
|
@ -577,7 +578,7 @@ ip4ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
|
|||
eiph = ip_hdr(skb2);
|
||||
|
||||
/* Try to guess incoming interface */
|
||||
rt = ip_route_output_ports(dev_net(skb->dev), NULL,
|
||||
rt = ip_route_output_ports(dev_net(skb->dev), &fl4, NULL,
|
||||
eiph->saddr, 0,
|
||||
0, 0,
|
||||
IPPROTO_IPIP, RT_TOS(eiph->tos), 0);
|
||||
|
@ -590,7 +591,7 @@ ip4ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
|
|||
if (rt->rt_flags & RTCF_LOCAL) {
|
||||
ip_rt_put(rt);
|
||||
rt = NULL;
|
||||
rt = ip_route_output_ports(dev_net(skb->dev), NULL,
|
||||
rt = ip_route_output_ports(dev_net(skb->dev), &fl4, NULL,
|
||||
eiph->daddr, eiph->saddr,
|
||||
0, 0,
|
||||
IPPROTO_IPIP,
|
||||
|
|
|
@ -674,6 +674,7 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
|
|||
struct iphdr *iph; /* Our new IP header */
|
||||
unsigned int max_headroom; /* The extra header space needed */
|
||||
__be32 dst = tiph->daddr;
|
||||
struct flowi4 fl4;
|
||||
int mtu;
|
||||
const struct in6_addr *addr6;
|
||||
int addr_type;
|
||||
|
@ -733,7 +734,7 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
|
|||
dst = addr6->s6_addr32[3];
|
||||
}
|
||||
|
||||
rt = ip_route_output_ports(dev_net(dev), NULL,
|
||||
rt = ip_route_output_ports(dev_net(dev), &fl4, NULL,
|
||||
dst, tiph->saddr,
|
||||
0, 0,
|
||||
IPPROTO_IPV6, RT_TOS(tos),
|
||||
|
@ -851,12 +852,13 @@ static void ipip6_tunnel_bind_dev(struct net_device *dev)
|
|||
struct net_device *tdev = NULL;
|
||||
struct ip_tunnel *tunnel;
|
||||
const struct iphdr *iph;
|
||||
struct flowi4 fl4;
|
||||
|
||||
tunnel = netdev_priv(dev);
|
||||
iph = &tunnel->parms.iph;
|
||||
|
||||
if (iph->daddr) {
|
||||
struct rtable *rt = ip_route_output_ports(dev_net(dev), NULL,
|
||||
struct rtable *rt = ip_route_output_ports(dev_net(dev), &fl4, NULL,
|
||||
iph->daddr, iph->saddr,
|
||||
0, 0,
|
||||
IPPROTO_IPV6,
|
||||
|
|
|
@ -471,6 +471,7 @@ static int l2tp_ip_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *m
|
|||
|
||||
if (rt == NULL) {
|
||||
struct ip_options_rcu *inet_opt;
|
||||
struct flowi4 fl4;
|
||||
|
||||
rcu_read_lock();
|
||||
inet_opt = rcu_dereference(inet->inet_opt);
|
||||
|
@ -485,7 +486,7 @@ static int l2tp_ip_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *m
|
|||
* keep trying until route appears or the connection times
|
||||
* itself out.
|
||||
*/
|
||||
rt = ip_route_output_ports(sock_net(sk), sk,
|
||||
rt = ip_route_output_ports(sock_net(sk), &fl4, sk,
|
||||
daddr, inet->inet_saddr,
|
||||
inet->inet_dport, inet->inet_sport,
|
||||
sk->sk_protocol, RT_CONN_FLAGS(sk),
|
||||
|
|
|
@ -36,10 +36,11 @@ static void rxrpc_destroy_peer(struct work_struct *work);
|
|||
static void rxrpc_assess_MTU_size(struct rxrpc_peer *peer)
|
||||
{
|
||||
struct rtable *rt;
|
||||
struct flowi4 fl4;
|
||||
|
||||
peer->if_mtu = 1500;
|
||||
|
||||
rt = ip_route_output_ports(&init_net, NULL,
|
||||
rt = ip_route_output_ports(&init_net, &fl4, NULL,
|
||||
peer->srx.transport.sin.sin_addr.s_addr, 0,
|
||||
htons(7000), htons(7001),
|
||||
IPPROTO_UDP, 0, 0);
|
||||
|
|
Loading…
Reference in a new issue