Loading drivers/infiniband/hw/cxgb4/cm.c +18 −52 Original line number Diff line number Diff line Loading @@ -465,46 +465,6 @@ static struct net_device *get_real_dev(struct net_device *egress_dev) return rdma_vlan_dev_real_dev(egress_dev) ? : egress_dev; } static int our_interface(struct c4iw_dev *dev, struct net_device *egress_dev) { int i; egress_dev = get_real_dev(egress_dev); for (i = 0; i < dev->rdev.lldi.nports; i++) if (dev->rdev.lldi.ports[i] == egress_dev) return 1; return 0; } static struct dst_entry *find_route6(struct c4iw_dev *dev, __u8 *local_ip, __u8 *peer_ip, __be16 local_port, __be16 peer_port, u8 tos, __u32 sin6_scope_id) { struct dst_entry *dst = NULL; if (IS_ENABLED(CONFIG_IPV6)) { struct flowi6 fl6; memset(&fl6, 0, sizeof(fl6)); memcpy(&fl6.daddr, peer_ip, 16); memcpy(&fl6.saddr, local_ip, 16); if (ipv6_addr_type(&fl6.daddr) & IPV6_ADDR_LINKLOCAL) fl6.flowi6_oif = sin6_scope_id; dst = ip6_route_output(&init_net, NULL, &fl6); if (!dst) goto out; if (!our_interface(dev, ip6_dst_idev(dst)->dev) && !(ip6_dst_idev(dst)->dev->flags & IFF_LOOPBACK)) { dst_release(dst); dst = NULL; } } out: return dst; } static void arp_failure_discard(void *handle, struct sk_buff *skb) { pr_err(MOD "ARP failure\n"); Loading Loading @@ -2197,9 +2157,12 @@ static int c4iw_reconnect(struct c4iw_ep *ep) iptype = 4; ra = (__u8 *)&raddr->sin_addr; } else { ep->dst = find_route6(ep->com.dev, laddr6->sin6_addr.s6_addr, ep->dst = cxgb_find_route6(&ep->com.dev->rdev.lldi, get_real_dev, laddr6->sin6_addr.s6_addr, raddr6->sin6_addr.s6_addr, laddr6->sin6_port, raddr6->sin6_port, 0, laddr6->sin6_port, raddr6->sin6_port, 0, raddr6->sin6_scope_id); iptype = 6; ra = (__u8 *)&raddr6->sin6_addr; Loading Loading @@ -2540,7 +2503,8 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb) , __func__, parent_ep, hwtid, local_ip, peer_ip, ntohs(local_port), ntohs(peer_port), peer_mss); dst = find_route6(dev, local_ip, peer_ip, local_port, peer_port, dst = cxgb_find_route6(&dev->rdev.lldi, get_real_dev, local_ip, peer_ip, local_port, peer_port, PASS_OPEN_TOS_G(ntohl(req->tos_stid)), ((struct sockaddr_in6 *) &parent_ep->com.local_addr)->sin6_scope_id); Loading Loading @@ -3339,9 +3303,11 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) __func__, laddr6->sin6_addr.s6_addr, ntohs(laddr6->sin6_port), raddr6->sin6_addr.s6_addr, ntohs(raddr6->sin6_port)); ep->dst = find_route6(dev, laddr6->sin6_addr.s6_addr, ep->dst = cxgb_find_route6(&dev->rdev.lldi, get_real_dev, laddr6->sin6_addr.s6_addr, raddr6->sin6_addr.s6_addr, laddr6->sin6_port, raddr6->sin6_port, 0, laddr6->sin6_port, raddr6->sin6_port, 0, raddr6->sin6_scope_id); } if (!ep->dst) { Loading drivers/net/ethernet/chelsio/libcxgb/libcxgb_cm.c +33 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ #include <linux/tcp.h> #include <linux/ipv6.h> #include <net/route.h> #include <net/ip6_route.h> #include "libcxgb_cm.h" Loading Loading @@ -114,3 +115,35 @@ cxgb_find_route(struct cxgb4_lld_info *lldi, return &rt->dst; } EXPORT_SYMBOL(cxgb_find_route); struct dst_entry * cxgb_find_route6(struct cxgb4_lld_info *lldi, struct net_device *(*get_real_dev)(struct net_device *), __u8 *local_ip, __u8 *peer_ip, __be16 local_port, __be16 peer_port, u8 tos, __u32 sin6_scope_id) { struct dst_entry *dst = NULL; if (IS_ENABLED(CONFIG_IPV6)) { struct flowi6 fl6; memset(&fl6, 0, sizeof(fl6)); memcpy(&fl6.daddr, peer_ip, 16); memcpy(&fl6.saddr, local_ip, 16); if (ipv6_addr_type(&fl6.daddr) & IPV6_ADDR_LINKLOCAL) fl6.flowi6_oif = sin6_scope_id; dst = ip6_route_output(&init_net, NULL, &fl6); if (!dst) goto out; if (!cxgb_our_interface(lldi, get_real_dev, ip6_dst_idev(dst)->dev) && !(ip6_dst_idev(dst)->dev->flags & IFF_LOOPBACK)) { dst_release(dst); dst = NULL; } } out: return dst; } EXPORT_SYMBOL(cxgb_find_route6); drivers/net/ethernet/chelsio/libcxgb/libcxgb_cm.h +4 −0 Original line number Diff line number Diff line Loading @@ -43,4 +43,8 @@ struct dst_entry * cxgb_find_route(struct cxgb4_lld_info *, struct net_device *(*)(struct net_device *), __be32, __be32, __be16, __be16, u8); struct dst_entry * cxgb_find_route6(struct cxgb4_lld_info *, struct net_device *(*)(struct net_device *), __u8 *, __u8 *, __be16, __be16, u8, __u32); #endif drivers/target/iscsi/cxgbit/cxgbit_cm.c +6 −45 Original line number Diff line number Diff line Loading @@ -790,46 +790,6 @@ void _cxgbit_free_csk(struct kref *kref) kfree(csk); } static int cxgbit_our_interface(struct cxgbit_device *cdev, struct net_device *egress_dev) { u8 i; egress_dev = cxgbit_get_real_dev(egress_dev); for (i = 0; i < cdev->lldi.nports; i++) if (cdev->lldi.ports[i] == egress_dev) return 1; return 0; } static struct dst_entry * cxgbit_find_route6(struct cxgbit_device *cdev, __u8 *local_ip, __u8 *peer_ip, __be16 local_port, __be16 peer_port, u8 tos, __u32 sin6_scope_id) { struct dst_entry *dst = NULL; if (IS_ENABLED(CONFIG_IPV6)) { struct flowi6 fl6; memset(&fl6, 0, sizeof(fl6)); memcpy(&fl6.daddr, peer_ip, 16); memcpy(&fl6.saddr, local_ip, 16); if (ipv6_addr_type(&fl6.daddr) & IPV6_ADDR_LINKLOCAL) fl6.flowi6_oif = sin6_scope_id; dst = ip6_route_output(&init_net, NULL, &fl6); if (!dst) goto out; if (!cxgbit_our_interface(cdev, ip6_dst_idev(dst)->dev) && !(ip6_dst_idev(dst)->dev->flags & IFF_LOOPBACK)) { dst_release(dst); dst = NULL; } } out: return dst; } static void cxgbit_set_tcp_window(struct cxgbit_sock *csk, struct port_info *pi) { unsigned int linkspeed; Loading Loading @@ -1299,7 +1259,8 @@ cxgbit_pass_accept_req(struct cxgbit_device *cdev, struct sk_buff *skb) , __func__, cnp, tid, local_ip, peer_ip, ntohs(local_port), ntohs(peer_port), peer_mss); dst = cxgbit_find_route6(cdev, local_ip, peer_ip, dst = cxgb_find_route6(&cdev->lldi, cxgbit_get_real_dev, local_ip, peer_ip, local_port, peer_port, PASS_OPEN_TOS_G(ntohl(req->tos_stid)), ((struct sockaddr_in6 *) Loading Loading
drivers/infiniband/hw/cxgb4/cm.c +18 −52 Original line number Diff line number Diff line Loading @@ -465,46 +465,6 @@ static struct net_device *get_real_dev(struct net_device *egress_dev) return rdma_vlan_dev_real_dev(egress_dev) ? : egress_dev; } static int our_interface(struct c4iw_dev *dev, struct net_device *egress_dev) { int i; egress_dev = get_real_dev(egress_dev); for (i = 0; i < dev->rdev.lldi.nports; i++) if (dev->rdev.lldi.ports[i] == egress_dev) return 1; return 0; } static struct dst_entry *find_route6(struct c4iw_dev *dev, __u8 *local_ip, __u8 *peer_ip, __be16 local_port, __be16 peer_port, u8 tos, __u32 sin6_scope_id) { struct dst_entry *dst = NULL; if (IS_ENABLED(CONFIG_IPV6)) { struct flowi6 fl6; memset(&fl6, 0, sizeof(fl6)); memcpy(&fl6.daddr, peer_ip, 16); memcpy(&fl6.saddr, local_ip, 16); if (ipv6_addr_type(&fl6.daddr) & IPV6_ADDR_LINKLOCAL) fl6.flowi6_oif = sin6_scope_id; dst = ip6_route_output(&init_net, NULL, &fl6); if (!dst) goto out; if (!our_interface(dev, ip6_dst_idev(dst)->dev) && !(ip6_dst_idev(dst)->dev->flags & IFF_LOOPBACK)) { dst_release(dst); dst = NULL; } } out: return dst; } static void arp_failure_discard(void *handle, struct sk_buff *skb) { pr_err(MOD "ARP failure\n"); Loading Loading @@ -2197,9 +2157,12 @@ static int c4iw_reconnect(struct c4iw_ep *ep) iptype = 4; ra = (__u8 *)&raddr->sin_addr; } else { ep->dst = find_route6(ep->com.dev, laddr6->sin6_addr.s6_addr, ep->dst = cxgb_find_route6(&ep->com.dev->rdev.lldi, get_real_dev, laddr6->sin6_addr.s6_addr, raddr6->sin6_addr.s6_addr, laddr6->sin6_port, raddr6->sin6_port, 0, laddr6->sin6_port, raddr6->sin6_port, 0, raddr6->sin6_scope_id); iptype = 6; ra = (__u8 *)&raddr6->sin6_addr; Loading Loading @@ -2540,7 +2503,8 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb) , __func__, parent_ep, hwtid, local_ip, peer_ip, ntohs(local_port), ntohs(peer_port), peer_mss); dst = find_route6(dev, local_ip, peer_ip, local_port, peer_port, dst = cxgb_find_route6(&dev->rdev.lldi, get_real_dev, local_ip, peer_ip, local_port, peer_port, PASS_OPEN_TOS_G(ntohl(req->tos_stid)), ((struct sockaddr_in6 *) &parent_ep->com.local_addr)->sin6_scope_id); Loading Loading @@ -3339,9 +3303,11 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) __func__, laddr6->sin6_addr.s6_addr, ntohs(laddr6->sin6_port), raddr6->sin6_addr.s6_addr, ntohs(raddr6->sin6_port)); ep->dst = find_route6(dev, laddr6->sin6_addr.s6_addr, ep->dst = cxgb_find_route6(&dev->rdev.lldi, get_real_dev, laddr6->sin6_addr.s6_addr, raddr6->sin6_addr.s6_addr, laddr6->sin6_port, raddr6->sin6_port, 0, laddr6->sin6_port, raddr6->sin6_port, 0, raddr6->sin6_scope_id); } if (!ep->dst) { Loading
drivers/net/ethernet/chelsio/libcxgb/libcxgb_cm.c +33 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ #include <linux/tcp.h> #include <linux/ipv6.h> #include <net/route.h> #include <net/ip6_route.h> #include "libcxgb_cm.h" Loading Loading @@ -114,3 +115,35 @@ cxgb_find_route(struct cxgb4_lld_info *lldi, return &rt->dst; } EXPORT_SYMBOL(cxgb_find_route); struct dst_entry * cxgb_find_route6(struct cxgb4_lld_info *lldi, struct net_device *(*get_real_dev)(struct net_device *), __u8 *local_ip, __u8 *peer_ip, __be16 local_port, __be16 peer_port, u8 tos, __u32 sin6_scope_id) { struct dst_entry *dst = NULL; if (IS_ENABLED(CONFIG_IPV6)) { struct flowi6 fl6; memset(&fl6, 0, sizeof(fl6)); memcpy(&fl6.daddr, peer_ip, 16); memcpy(&fl6.saddr, local_ip, 16); if (ipv6_addr_type(&fl6.daddr) & IPV6_ADDR_LINKLOCAL) fl6.flowi6_oif = sin6_scope_id; dst = ip6_route_output(&init_net, NULL, &fl6); if (!dst) goto out; if (!cxgb_our_interface(lldi, get_real_dev, ip6_dst_idev(dst)->dev) && !(ip6_dst_idev(dst)->dev->flags & IFF_LOOPBACK)) { dst_release(dst); dst = NULL; } } out: return dst; } EXPORT_SYMBOL(cxgb_find_route6);
drivers/net/ethernet/chelsio/libcxgb/libcxgb_cm.h +4 −0 Original line number Diff line number Diff line Loading @@ -43,4 +43,8 @@ struct dst_entry * cxgb_find_route(struct cxgb4_lld_info *, struct net_device *(*)(struct net_device *), __be32, __be32, __be16, __be16, u8); struct dst_entry * cxgb_find_route6(struct cxgb4_lld_info *, struct net_device *(*)(struct net_device *), __u8 *, __u8 *, __be16, __be16, u8, __u32); #endif
drivers/target/iscsi/cxgbit/cxgbit_cm.c +6 −45 Original line number Diff line number Diff line Loading @@ -790,46 +790,6 @@ void _cxgbit_free_csk(struct kref *kref) kfree(csk); } static int cxgbit_our_interface(struct cxgbit_device *cdev, struct net_device *egress_dev) { u8 i; egress_dev = cxgbit_get_real_dev(egress_dev); for (i = 0; i < cdev->lldi.nports; i++) if (cdev->lldi.ports[i] == egress_dev) return 1; return 0; } static struct dst_entry * cxgbit_find_route6(struct cxgbit_device *cdev, __u8 *local_ip, __u8 *peer_ip, __be16 local_port, __be16 peer_port, u8 tos, __u32 sin6_scope_id) { struct dst_entry *dst = NULL; if (IS_ENABLED(CONFIG_IPV6)) { struct flowi6 fl6; memset(&fl6, 0, sizeof(fl6)); memcpy(&fl6.daddr, peer_ip, 16); memcpy(&fl6.saddr, local_ip, 16); if (ipv6_addr_type(&fl6.daddr) & IPV6_ADDR_LINKLOCAL) fl6.flowi6_oif = sin6_scope_id; dst = ip6_route_output(&init_net, NULL, &fl6); if (!dst) goto out; if (!cxgbit_our_interface(cdev, ip6_dst_idev(dst)->dev) && !(ip6_dst_idev(dst)->dev->flags & IFF_LOOPBACK)) { dst_release(dst); dst = NULL; } } out: return dst; } static void cxgbit_set_tcp_window(struct cxgbit_sock *csk, struct port_info *pi) { unsigned int linkspeed; Loading Loading @@ -1299,7 +1259,8 @@ cxgbit_pass_accept_req(struct cxgbit_device *cdev, struct sk_buff *skb) , __func__, cnp, tid, local_ip, peer_ip, ntohs(local_port), ntohs(peer_port), peer_mss); dst = cxgbit_find_route6(cdev, local_ip, peer_ip, dst = cxgb_find_route6(&cdev->lldi, cxgbit_get_real_dev, local_ip, peer_ip, local_port, peer_port, PASS_OPEN_TOS_G(ntohl(req->tos_stid)), ((struct sockaddr_in6 *) Loading