Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c76284af authored by Michael Chan's avatar Michael Chan Committed by David S. Miller
Browse files

cnic: Simplify route checking during iSCSI connection.



With a separate IP address for iSCSI, connections should proceed
whether or not we can get a route to the target from the network stack.
It is possible that the network IP address may not reach the iSCSI target.

Signed-off-by: default avatarMichael Chan <mchan@broadcom.com>
Signed-off-by: default avatarBenjamin Li <benli@broadcom.com>
Signed-off-by: default avatarEddie Wai <waie@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d02a5e6c
Loading
Loading
Loading
Loading
+13 −24
Original line number Original line Diff line number Diff line
@@ -2860,8 +2860,8 @@ static int cnic_get_route(struct cnic_sock *csk, struct cnic_sockaddr *saddr)
{
{
	struct cnic_dev *dev = csk->dev;
	struct cnic_dev *dev = csk->dev;
	struct cnic_local *cp = dev->cnic_priv;
	struct cnic_local *cp = dev->cnic_priv;
	int is_v6, err, rc = -ENETUNREACH;
	int is_v6, rc = 0;
	struct dst_entry *dst;
	struct dst_entry *dst = NULL;
	struct net_device *realdev;
	struct net_device *realdev;
	u32 local_port;
	u32 local_port;


@@ -2877,39 +2877,31 @@ static int cnic_get_route(struct cnic_sock *csk, struct cnic_sockaddr *saddr)
	clear_bit(SK_F_IPV6, &csk->flags);
	clear_bit(SK_F_IPV6, &csk->flags);


	if (is_v6) {
	if (is_v6) {
#if defined(CONFIG_IPV6) || (defined(CONFIG_IPV6_MODULE) && defined(MODULE))
		set_bit(SK_F_IPV6, &csk->flags);
		set_bit(SK_F_IPV6, &csk->flags);
		err = cnic_get_v6_route(&saddr->remote.v6, &dst);
		cnic_get_v6_route(&saddr->remote.v6, &dst);
		if (err)
			return err;

		if (!dst || dst->error || !dst->dev)
			goto err_out;


		memcpy(&csk->dst_ip[0], &saddr->remote.v6.sin6_addr,
		memcpy(&csk->dst_ip[0], &saddr->remote.v6.sin6_addr,
		       sizeof(struct in6_addr));
		       sizeof(struct in6_addr));
		csk->dst_port = saddr->remote.v6.sin6_port;
		csk->dst_port = saddr->remote.v6.sin6_port;
		local_port = saddr->local.v6.sin6_port;
		local_port = saddr->local.v6.sin6_port;
#else
		return rc;
#endif


	} else {
	} else {
		err = cnic_get_v4_route(&saddr->remote.v4, &dst);
		cnic_get_v4_route(&saddr->remote.v4, &dst);
		if (err)
			return err;

		if (!dst || dst->error || !dst->dev)
			goto err_out;


		csk->dst_ip[0] = saddr->remote.v4.sin_addr.s_addr;
		csk->dst_ip[0] = saddr->remote.v4.sin_addr.s_addr;
		csk->dst_port = saddr->remote.v4.sin_port;
		csk->dst_port = saddr->remote.v4.sin_port;
		local_port = saddr->local.v4.sin_port;
		local_port = saddr->local.v4.sin_port;
	}
	}


	csk->vlan_id = cnic_get_vlan(dst->dev, &realdev);
	csk->vlan_id = 0;
	if (realdev != dev->netdev)
	csk->mtu = dev->netdev->mtu;
		goto err_out;
	if (dst && dst->dev) {
		u16 vlan = cnic_get_vlan(dst->dev, &realdev);
		if (realdev == dev->netdev) {
			csk->vlan_id = vlan;
			csk->mtu = dst_mtu(dst);
		}
	}


	if (local_port >= CNIC_LOCAL_PORT_MIN &&
	if (local_port >= CNIC_LOCAL_PORT_MIN &&
	    local_port < CNIC_LOCAL_PORT_MAX) {
	    local_port < CNIC_LOCAL_PORT_MAX) {
@@ -2927,9 +2919,6 @@ static int cnic_get_route(struct cnic_sock *csk, struct cnic_sockaddr *saddr)
	}
	}
	csk->src_port = local_port;
	csk->src_port = local_port;


	csk->mtu = dst_mtu(dst);
	rc = 0;

err_out:
err_out:
	dst_release(dst);
	dst_release(dst);
	return rc;
	return rc;