libcxgb,iw_cxgb4,cxgbit: add cxgb_find_route()
Add cxgb_find_route() in libcxgb_cm.c to remove it's duplicate definitions from cxgb4/cm.c and cxgbit/cxgbit_cm.c. Signed-off-by: Varun Prakash <varun@chelsio.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
85e42b044e
commit
804c2f3e36
4 changed files with 69 additions and 68 deletions
|
@ -505,32 +505,6 @@ out:
|
||||||
return dst;
|
return dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct dst_entry *find_route(struct c4iw_dev *dev, __be32 local_ip,
|
|
||||||
__be32 peer_ip, __be16 local_port,
|
|
||||||
__be16 peer_port, u8 tos)
|
|
||||||
{
|
|
||||||
struct rtable *rt;
|
|
||||||
struct flowi4 fl4;
|
|
||||||
struct neighbour *n;
|
|
||||||
|
|
||||||
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))
|
|
||||||
return NULL;
|
|
||||||
n = dst_neigh_lookup(&rt->dst, &peer_ip);
|
|
||||||
if (!n)
|
|
||||||
return NULL;
|
|
||||||
if (!our_interface(dev, n->dev) &&
|
|
||||||
!(n->dev->flags & IFF_LOOPBACK)) {
|
|
||||||
neigh_release(n);
|
|
||||||
dst_release(&rt->dst);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
neigh_release(n);
|
|
||||||
return &rt->dst;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void arp_failure_discard(void *handle, struct sk_buff *skb)
|
static void arp_failure_discard(void *handle, struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
pr_err(MOD "ARP failure\n");
|
pr_err(MOD "ARP failure\n");
|
||||||
|
@ -2215,9 +2189,11 @@ static int c4iw_reconnect(struct c4iw_ep *ep)
|
||||||
|
|
||||||
/* find a route */
|
/* find a route */
|
||||||
if (ep->com.cm_id->m_local_addr.ss_family == AF_INET) {
|
if (ep->com.cm_id->m_local_addr.ss_family == AF_INET) {
|
||||||
ep->dst = find_route(ep->com.dev, laddr->sin_addr.s_addr,
|
ep->dst = cxgb_find_route(&ep->com.dev->rdev.lldi, get_real_dev,
|
||||||
raddr->sin_addr.s_addr, laddr->sin_port,
|
laddr->sin_addr.s_addr,
|
||||||
raddr->sin_port, ep->com.cm_id->tos);
|
raddr->sin_addr.s_addr,
|
||||||
|
laddr->sin_port,
|
||||||
|
raddr->sin_port, ep->com.cm_id->tos);
|
||||||
iptype = 4;
|
iptype = 4;
|
||||||
ra = (__u8 *)&raddr->sin_addr;
|
ra = (__u8 *)&raddr->sin_addr;
|
||||||
} else {
|
} else {
|
||||||
|
@ -2556,9 +2532,9 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb)
|
||||||
, __func__, parent_ep, hwtid,
|
, __func__, parent_ep, hwtid,
|
||||||
local_ip, peer_ip, ntohs(local_port),
|
local_ip, peer_ip, ntohs(local_port),
|
||||||
ntohs(peer_port), peer_mss);
|
ntohs(peer_port), peer_mss);
|
||||||
dst = find_route(dev, *(__be32 *)local_ip, *(__be32 *)peer_ip,
|
dst = cxgb_find_route(&dev->rdev.lldi, get_real_dev,
|
||||||
local_port, peer_port,
|
*(__be32 *)local_ip, *(__be32 *)peer_ip,
|
||||||
tos);
|
local_port, peer_port, tos);
|
||||||
} else {
|
} else {
|
||||||
PDBG("%s parent ep %p hwtid %u laddr %pI6 raddr %pI6 lport %d rport %d peer_mss %d\n"
|
PDBG("%s parent ep %p hwtid %u laddr %pI6 raddr %pI6 lport %d rport %d peer_mss %d\n"
|
||||||
, __func__, parent_ep, hwtid,
|
, __func__, parent_ep, hwtid,
|
||||||
|
@ -3340,9 +3316,11 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
|
||||||
PDBG("%s saddr %pI4 sport 0x%x raddr %pI4 rport 0x%x\n",
|
PDBG("%s saddr %pI4 sport 0x%x raddr %pI4 rport 0x%x\n",
|
||||||
__func__, &laddr->sin_addr, ntohs(laddr->sin_port),
|
__func__, &laddr->sin_addr, ntohs(laddr->sin_port),
|
||||||
ra, ntohs(raddr->sin_port));
|
ra, ntohs(raddr->sin_port));
|
||||||
ep->dst = find_route(dev, laddr->sin_addr.s_addr,
|
ep->dst = cxgb_find_route(&dev->rdev.lldi, get_real_dev,
|
||||||
raddr->sin_addr.s_addr, laddr->sin_port,
|
laddr->sin_addr.s_addr,
|
||||||
raddr->sin_port, cm_id->tos);
|
raddr->sin_addr.s_addr,
|
||||||
|
laddr->sin_port,
|
||||||
|
raddr->sin_port, cm_id->tos);
|
||||||
} else {
|
} else {
|
||||||
iptype = 6;
|
iptype = 6;
|
||||||
ra = (__u8 *)&raddr6->sin6_addr;
|
ra = (__u8 *)&raddr6->sin6_addr;
|
||||||
|
@ -4006,8 +3984,9 @@ static int rx_pkt(struct c4iw_dev *dev, struct sk_buff *skb)
|
||||||
ntohl(iph->daddr), ntohs(tcph->dest), ntohl(iph->saddr),
|
ntohl(iph->daddr), ntohs(tcph->dest), ntohl(iph->saddr),
|
||||||
ntohs(tcph->source), iph->tos);
|
ntohs(tcph->source), iph->tos);
|
||||||
|
|
||||||
dst = find_route(dev, iph->daddr, iph->saddr, tcph->dest, tcph->source,
|
dst = cxgb_find_route(&dev->rdev.lldi, get_real_dev,
|
||||||
iph->tos);
|
iph->daddr, iph->saddr, tcph->dest,
|
||||||
|
tcph->source, iph->tos);
|
||||||
if (!dst) {
|
if (!dst) {
|
||||||
pr_err("%s - failed to find dst entry!\n",
|
pr_err("%s - failed to find dst entry!\n",
|
||||||
__func__);
|
__func__);
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
|
|
||||||
#include <linux/tcp.h>
|
#include <linux/tcp.h>
|
||||||
#include <linux/ipv6.h>
|
#include <linux/ipv6.h>
|
||||||
|
#include <net/route.h>
|
||||||
|
|
||||||
#include "libcxgb_cm.h"
|
#include "libcxgb_cm.h"
|
||||||
|
|
||||||
|
@ -70,3 +71,46 @@ cxgb_get_4tuple(struct cpl_pass_accept_req *req, enum chip_type type,
|
||||||
*local_port = tcp->dest;
|
*local_port = tcp->dest;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(cxgb_get_4tuple);
|
EXPORT_SYMBOL(cxgb_get_4tuple);
|
||||||
|
|
||||||
|
static bool
|
||||||
|
cxgb_our_interface(struct cxgb4_lld_info *lldi,
|
||||||
|
struct net_device *(*get_real_dev)(struct net_device *),
|
||||||
|
struct net_device *egress_dev)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
egress_dev = get_real_dev(egress_dev);
|
||||||
|
for (i = 0; i < lldi->nports; i++)
|
||||||
|
if (lldi->ports[i] == egress_dev)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct dst_entry *
|
||||||
|
cxgb_find_route(struct cxgb4_lld_info *lldi,
|
||||||
|
struct net_device *(*get_real_dev)(struct net_device *),
|
||||||
|
__be32 local_ip, __be32 peer_ip, __be16 local_port,
|
||||||
|
__be16 peer_port, u8 tos)
|
||||||
|
{
|
||||||
|
struct rtable *rt;
|
||||||
|
struct flowi4 fl4;
|
||||||
|
struct neighbour *n;
|
||||||
|
|
||||||
|
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))
|
||||||
|
return NULL;
|
||||||
|
n = dst_neigh_lookup(&rt->dst, &peer_ip);
|
||||||
|
if (!n)
|
||||||
|
return NULL;
|
||||||
|
if (!cxgb_our_interface(lldi, get_real_dev, n->dev) &&
|
||||||
|
!(n->dev->flags & IFF_LOOPBACK)) {
|
||||||
|
neigh_release(n);
|
||||||
|
dst_release(&rt->dst);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
neigh_release(n);
|
||||||
|
return &rt->dst;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(cxgb_find_route);
|
||||||
|
|
|
@ -39,4 +39,8 @@
|
||||||
void
|
void
|
||||||
cxgb_get_4tuple(struct cpl_pass_accept_req *, enum chip_type,
|
cxgb_get_4tuple(struct cpl_pass_accept_req *, enum chip_type,
|
||||||
int *, __u8 *, __u8 *, __be16 *, __be16 *);
|
int *, __u8 *, __u8 *, __be16 *, __be16 *);
|
||||||
|
struct dst_entry *
|
||||||
|
cxgb_find_route(struct cxgb4_lld_info *,
|
||||||
|
struct net_device *(*)(struct net_device *),
|
||||||
|
__be32, __be32, __be16, __be16, u8);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -830,33 +830,6 @@ out:
|
||||||
return dst;
|
return dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct dst_entry *
|
|
||||||
cxgbit_find_route(struct cxgbit_device *cdev, __be32 local_ip, __be32 peer_ip,
|
|
||||||
__be16 local_port, __be16 peer_port, u8 tos)
|
|
||||||
{
|
|
||||||
struct rtable *rt;
|
|
||||||
struct flowi4 fl4;
|
|
||||||
struct neighbour *n;
|
|
||||||
|
|
||||||
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))
|
|
||||||
return NULL;
|
|
||||||
n = dst_neigh_lookup(&rt->dst, &peer_ip);
|
|
||||||
if (!n)
|
|
||||||
return NULL;
|
|
||||||
if (!cxgbit_our_interface(cdev, n->dev) &&
|
|
||||||
!(n->dev->flags & IFF_LOOPBACK)) {
|
|
||||||
neigh_release(n);
|
|
||||||
dst_release(&rt->dst);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
neigh_release(n);
|
|
||||||
return &rt->dst;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void cxgbit_set_tcp_window(struct cxgbit_sock *csk, struct port_info *pi)
|
static void cxgbit_set_tcp_window(struct cxgbit_sock *csk, struct port_info *pi)
|
||||||
{
|
{
|
||||||
unsigned int linkspeed;
|
unsigned int linkspeed;
|
||||||
|
@ -1315,10 +1288,11 @@ cxgbit_pass_accept_req(struct cxgbit_device *cdev, struct sk_buff *skb)
|
||||||
, __func__, cnp, tid,
|
, __func__, cnp, tid,
|
||||||
local_ip, peer_ip, ntohs(local_port),
|
local_ip, peer_ip, ntohs(local_port),
|
||||||
ntohs(peer_port), peer_mss);
|
ntohs(peer_port), peer_mss);
|
||||||
dst = cxgbit_find_route(cdev, *(__be32 *)local_ip,
|
dst = cxgb_find_route(&cdev->lldi, cxgbit_get_real_dev,
|
||||||
*(__be32 *)peer_ip,
|
*(__be32 *)local_ip,
|
||||||
local_port, peer_port,
|
*(__be32 *)peer_ip,
|
||||||
PASS_OPEN_TOS_G(ntohl(req->tos_stid)));
|
local_port, peer_port,
|
||||||
|
PASS_OPEN_TOS_G(ntohl(req->tos_stid)));
|
||||||
} else {
|
} else {
|
||||||
pr_debug("%s parent sock %p tid %u laddr %pI6 raddr %pI6 "
|
pr_debug("%s parent sock %p tid %u laddr %pI6 raddr %pI6 "
|
||||||
"lport %d rport %d peer_mss %d\n"
|
"lport %d rport %d peer_mss %d\n"
|
||||||
|
|
Loading…
Add table
Reference in a new issue