netdev_findby_ipv[4|6]addr return netdev_default() as last resort but don't return loopback device if another network device is in the UP state.

This commit is contained in:
Xiang Xiao
2018-08-26 14:40:47 -06:00
committed by Gregory Nutt
parent da1a323f34
commit fd1405d976
2 changed files with 19 additions and 30 deletions
+11 -6
View File
@@ -1,7 +1,7 @@
/**************************************************************************** /****************************************************************************
* net/netdev/netdev_default.c * net/netdev/netdev_default.c
* *
* Copyright (C) 2014-2015 Gregory Nutt. All rights reserved. * Copyright (C) 2014-2015, 2018 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org> * Author: Gregory Nutt <gnutt@nuttx.org>
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@@ -72,6 +72,7 @@
FAR struct net_driver_s *netdev_default(void) FAR struct net_driver_s *netdev_default(void)
{ {
FAR struct net_driver_s *ret = NULL;
FAR struct net_driver_s *dev; FAR struct net_driver_s *dev;
/* Examine each registered network device */ /* Examine each registered network device */
@@ -83,17 +84,21 @@ FAR struct net_driver_s *netdev_default(void)
if ((dev->d_flags & IFF_UP) != 0) if ((dev->d_flags & IFF_UP) != 0)
{ {
/* Return a reference to the first device we find that is in the UP /* Return a reference to the first device that we find in the UP
* state. * state (but not the loopback device unless it is the only
* device).
*/ */
net_unlock(); ret = dev;
return dev; if (dev->d_lltype != NET_LL_LOOPBACK)
{
break;
}
} }
} }
net_unlock(); net_unlock();
return NULL; return ret;
} }
#endif /* CONFIG_NET */ #endif /* CONFIG_NET */
+8 -24
View File
@@ -203,13 +203,9 @@ FAR struct net_driver_s *netdev_findby_ipv4addr(in_addr_t lipaddr,
* broadcast packet out ALL locally available networks. I am not * broadcast packet out ALL locally available networks. I am not
* sure of that and, in any event, there is nothing we can do * sure of that and, in any event, there is nothing we can do
* about that here. * about that here.
*
* REVISIT: For now, arbitrarily return the first network
* interface in the list of network devices. The broadcast
* will be sent on that device only.
*/ */
return g_netdevices; return netdev_default();
} }
else else
{ {
@@ -250,15 +246,11 @@ FAR struct net_driver_s *netdev_findby_ipv4addr(in_addr_t lipaddr,
#endif /* CONFIG_NET_ROUTE */ #endif /* CONFIG_NET_ROUTE */
/* The above lookup will fail if the packet is being sent out of our /* The above lookup will fail if the packet is being sent out of our
* out subnet to a router and there is no routing information. * out subnet to a router and there is no routing information. Let's
* try the default network device.
*/ */
/* If we will did not find the network device, then we might as well fail return netdev_default();
* because we are not configured properly to determine the route to the
* destination.
*/
return dev;
} }
#endif /* CONFIG_NET_IPv4 */ #endif /* CONFIG_NET_IPv4 */
@@ -302,13 +294,9 @@ FAR struct net_driver_s *netdev_findby_ipv6addr(const net_ipv6addr_t lipaddr,
* broadcast packet out ALL locally available networks. I am not * broadcast packet out ALL locally available networks. I am not
* sure of that and, in any event, there is nothing we can do * sure of that and, in any event, there is nothing we can do
* about that here. * about that here.
*
* REVISIT: For now, arbitrarily return the first network
* interface in the list of network devices. The broadcast
* will be sent on that device only.
*/ */
return g_netdevices; return netdev_default();
} }
else else
{ {
@@ -349,15 +337,11 @@ FAR struct net_driver_s *netdev_findby_ipv6addr(const net_ipv6addr_t lipaddr,
#endif /* CONFIG_NET_ROUTE */ #endif /* CONFIG_NET_ROUTE */
/* The above lookup will fail if the packet is being sent out of our /* The above lookup will fail if the packet is being sent out of our
* out subnet to a router and there is no routing information. * out subnet to a router and there is no routing information. Let's
* try the default network device.
*/ */
/* If we will did not find the network device, then we might as well fail return netdev_default();
* because we are not configured properly to determine the route to the
* destination.
*/
return dev;
} }
#endif /* CONFIG_NET_IPv6 */ #endif /* CONFIG_NET_IPv6 */