summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2007-01-16 05:09:13 +0100
committerMichael Brown2007-01-16 05:09:13 +0100
commitf11da20f25ce4535f2731e403071b03f7118d40f (patch)
treeb9b42be84a4d0c071ad2434805ff0651ecb84665
parentImprove debugging (diff)
downloadipxe-f11da20f25ce4535f2731e403071b03f7118d40f.tar.gz
ipxe-f11da20f25ce4535f2731e403071b03f7118d40f.tar.xz
ipxe-f11da20f25ce4535f2731e403071b03f7118d40f.zip
When a network device is specified to tcpip_tx() or it's children, treat
it as a fallback network device rather than an explicitly forced network device. Clear routing table entries before re-attempting DHCP.
-rw-r--r--src/net/ipv4.c4
-rw-r--r--src/net/tcpip.c2
-rw-r--r--src/net/udp.c2
-rw-r--r--src/usr/dhcpmgmt.c3
4 files changed, 7 insertions, 4 deletions
diff --git a/src/net/ipv4.c b/src/net/ipv4.c
index 1b93cf4a..8a1e8df3 100644
--- a/src/net/ipv4.c
+++ b/src/net/ipv4.c
@@ -350,7 +350,7 @@ static int ipv4_ll_addr ( struct in_addr dest, struct in_addr src,
* @v pkb Packet buffer
* @v tcpip Transport-layer protocol
* @v st_dest Destination network-layer address
- * @v netdev Network device (or NULL to route automatically)
+ * @v netdev Network device to use if no route found, or NULL
* @v trans_csum Transport-layer checksum to complete, or NULL
* @ret rc Status
*
@@ -394,7 +394,7 @@ static int ipv4_tx ( struct pk_buff *pkb,
if ( ( rc = ipv4_ll_addr ( next_hop, iphdr->src, netdev,
ll_dest ) ) != 0 ) {
DBG ( "IPv4 has no link-layer address for %s: %s\n",
- inet_ntoa ( iphdr->dest ), strerror ( rc ) );
+ inet_ntoa ( next_hop ), strerror ( rc ) );
goto err;
}
diff --git a/src/net/tcpip.c b/src/net/tcpip.c
index 00f81cd9..26565a5b 100644
--- a/src/net/tcpip.c
+++ b/src/net/tcpip.c
@@ -65,7 +65,7 @@ int tcpip_rx ( struct pk_buff *pkb, uint8_t tcpip_proto,
* @v pkb Packet buffer
* @v tcpip_protocol Transport-layer protocol
* @v st_dest Destination address
- * @v netdev Network device (or NULL to route automatically)
+ * @v netdev Network device to use if no route found, or NULL
* @v trans_csum Transport-layer checksum to complete, or NULL
* @ret rc Return status code
*/
diff --git a/src/net/udp.c b/src/net/udp.c
index 7966de09..34acc53f 100644
--- a/src/net/udp.c
+++ b/src/net/udp.c
@@ -143,7 +143,7 @@ int udp_senddata ( struct udp_connection *conn ) {
*
* @v conn UDP connection
* @v peer Destination address
- * @v netdev Net device via which to send (or NULL)
+ * @v netdev Network device to use if no route found, or NULL
* @v data Data to send
* @v len Length of data
* @ret rc Return status code
diff --git a/src/usr/dhcpmgmt.c b/src/usr/dhcpmgmt.c
index 0e36d555..90ed62bf 100644
--- a/src/usr/dhcpmgmt.c
+++ b/src/usr/dhcpmgmt.c
@@ -58,6 +58,9 @@ int dhcp ( struct net_device *netdev ) {
dhcp_options = NULL;
}
+ /* Clear any existing routing table entry */
+ del_ipv4_address ( netdev );
+
/* Issue DHCP request */
printf ( "DHCP (%s %s)...", netdev->name, netdev_hwaddr ( netdev ) );
memset ( &dhcp, 0, sizeof ( dhcp ) );