diff options
Diffstat (limited to 'drivers/scsi/cxgb3i/cxgb3i_offload.c')
-rw-r--r-- | drivers/scsi/cxgb3i/cxgb3i_offload.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/drivers/scsi/cxgb3i/cxgb3i_offload.c b/drivers/scsi/cxgb3i/cxgb3i_offload.c index e11c9c180f39..c1d5be4adf9c 100644 --- a/drivers/scsi/cxgb3i/cxgb3i_offload.c +++ b/drivers/scsi/cxgb3i/cxgb3i_offload.c | |||
@@ -1479,12 +1479,13 @@ static struct net_device *cxgb3_egress_dev(struct net_device *root_dev, | |||
1479 | return NULL; | 1479 | return NULL; |
1480 | } | 1480 | } |
1481 | 1481 | ||
1482 | static struct rtable *find_route(__be32 saddr, __be32 daddr, | 1482 | static struct rtable *find_route(struct net_device *dev, |
1483 | __be32 saddr, __be32 daddr, | ||
1483 | __be16 sport, __be16 dport) | 1484 | __be16 sport, __be16 dport) |
1484 | { | 1485 | { |
1485 | struct rtable *rt; | 1486 | struct rtable *rt; |
1486 | struct flowi fl = { | 1487 | struct flowi fl = { |
1487 | .oif = 0, | 1488 | .oif = dev ? dev->ifindex : 0, |
1488 | .nl_u = { | 1489 | .nl_u = { |
1489 | .ip4_u = { | 1490 | .ip4_u = { |
1490 | .daddr = daddr, | 1491 | .daddr = daddr, |
@@ -1573,36 +1574,40 @@ out_err: | |||
1573 | * | 1574 | * |
1574 | * return 0 if active open request is sent, < 0 otherwise. | 1575 | * return 0 if active open request is sent, < 0 otherwise. |
1575 | */ | 1576 | */ |
1576 | int cxgb3i_c3cn_connect(struct s3_conn *c3cn, struct sockaddr_in *usin) | 1577 | int cxgb3i_c3cn_connect(struct net_device *dev, struct s3_conn *c3cn, |
1578 | struct sockaddr_in *usin) | ||
1577 | { | 1579 | { |
1578 | struct rtable *rt; | 1580 | struct rtable *rt; |
1579 | struct net_device *dev; | ||
1580 | struct cxgb3i_sdev_data *cdata; | 1581 | struct cxgb3i_sdev_data *cdata; |
1581 | struct t3cdev *cdev; | 1582 | struct t3cdev *cdev; |
1582 | __be32 sipv4; | 1583 | __be32 sipv4; |
1583 | int err; | 1584 | int err; |
1584 | 1585 | ||
1586 | c3cn_conn_debug("c3cn 0x%p, dev 0x%p.\n", c3cn, dev); | ||
1587 | |||
1585 | if (usin->sin_family != AF_INET) | 1588 | if (usin->sin_family != AF_INET) |
1586 | return -EAFNOSUPPORT; | 1589 | return -EAFNOSUPPORT; |
1587 | 1590 | ||
1588 | c3cn->daddr.sin_port = usin->sin_port; | 1591 | c3cn->daddr.sin_port = usin->sin_port; |
1589 | c3cn->daddr.sin_addr.s_addr = usin->sin_addr.s_addr; | 1592 | c3cn->daddr.sin_addr.s_addr = usin->sin_addr.s_addr; |
1590 | 1593 | ||
1591 | rt = find_route(c3cn->saddr.sin_addr.s_addr, | 1594 | rt = find_route(dev, c3cn->saddr.sin_addr.s_addr, |
1592 | c3cn->daddr.sin_addr.s_addr, | 1595 | c3cn->daddr.sin_addr.s_addr, |
1593 | c3cn->saddr.sin_port, | 1596 | c3cn->saddr.sin_port, |
1594 | c3cn->daddr.sin_port); | 1597 | c3cn->daddr.sin_port); |
1595 | if (rt == NULL) { | 1598 | if (rt == NULL) { |
1596 | c3cn_conn_debug("NO route to 0x%x, port %u.\n", | 1599 | c3cn_conn_debug("NO route to 0x%x, port %u, dev %s.\n", |
1597 | c3cn->daddr.sin_addr.s_addr, | 1600 | c3cn->daddr.sin_addr.s_addr, |
1598 | ntohs(c3cn->daddr.sin_port)); | 1601 | ntohs(c3cn->daddr.sin_port), |
1602 | dev ? dev->name : "any"); | ||
1599 | return -ENETUNREACH; | 1603 | return -ENETUNREACH; |
1600 | } | 1604 | } |
1601 | 1605 | ||
1602 | if (rt->rt_flags & (RTCF_MULTICAST | RTCF_BROADCAST)) { | 1606 | if (rt->rt_flags & (RTCF_MULTICAST | RTCF_BROADCAST)) { |
1603 | c3cn_conn_debug("multi-cast route to 0x%x, port %u.\n", | 1607 | c3cn_conn_debug("multi-cast route to 0x%x, port %u, dev %s.\n", |
1604 | c3cn->daddr.sin_addr.s_addr, | 1608 | c3cn->daddr.sin_addr.s_addr, |
1605 | ntohs(c3cn->daddr.sin_port)); | 1609 | ntohs(c3cn->daddr.sin_port), |
1610 | dev ? dev->name : "any"); | ||
1606 | ip_rt_put(rt); | 1611 | ip_rt_put(rt); |
1607 | return -ENETUNREACH; | 1612 | return -ENETUNREACH; |
1608 | } | 1613 | } |