ip_config.patch From: Sebastian Sumpf --- net/ipv4/ipconfig.c | 55 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 10 deletions(-) diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c index 0bc7412..a92c6e3 100644 --- a/net/ipv4/ipconfig.c +++ b/net/ipv4/ipconfig.c @@ -133,7 +133,7 @@ int ic_proto_enabled __initdata = 0 static int ic_host_name_set __initdata; /* Host name set by us? */ __be32 ic_myaddr = NONE; /* My IP address */ -static __be32 ic_netmask = NONE; /* Netmask for local subnet */ +__be32 ic_netmask = NONE; /* Netmask for local subnet */ __be32 ic_gateway = NONE; /* Gateway IP address */ __be32 ic_addrservaddr = NONE; /* IP Address of the IP addresses'server */ @@ -153,7 +153,7 @@ static char dhcp_client_identifier[253] __initdata; /* Persistent data: */ static int ic_proto_used; /* Protocol used, if any */ -static __be32 ic_nameservers[CONF_NAMESERVERS_MAX]; /* DNS Server IP addresses */ +__be32 ic_nameservers[CONF_NAMESERVERS_MAX]; /* DNS Server IP addresses */ static u8 ic_domain[64]; /* DNS (not NIS) domain name */ /* @@ -435,6 +435,33 @@ static int __init ic_setup_routes(void) return 0; } +static int __init ic_delete_routes(void) +{ + /* No need to delete device routes, only the default route... */ + + if (ic_gateway != NONE) { + struct rtentry rm; + int err; + + memset(&rm, 0, sizeof(rm)); + if ((ic_gateway ^ ic_myaddr) & ic_netmask) { + pr_err("IP-Config: Gateway not on directly connected network\n"); + return -1; + } + set_sockaddr((struct sockaddr_in *) &rm.rt_dst, 0, 0); + set_sockaddr((struct sockaddr_in *) &rm.rt_genmask, 0, 0); + set_sockaddr((struct sockaddr_in *) &rm.rt_gateway, ic_gateway, 0); + rm.rt_flags = RTF_UP | RTF_GATEWAY; + if ((err = ic_route_ioctl(SIOCDELRT, &rm)) < 0) { + pr_err("IP-Config: Cannot delete default route (%d)\n", + err); + return -1; + } + } + + return 0; +} + /* * Fill in default values for all missing parameters. */ @@ -1531,24 +1558,24 @@ static int __init ip_auto_config(void) */ pr_info("IP-Config: Complete:\n"); - pr_info(" device=%s, hwaddr=%*phC, ipaddr=%pI4, mask=%pI4, gw=%pI4\n", - ic_dev->name, ic_dev->addr_len, ic_dev->dev_addr, - &ic_myaddr, &ic_netmask, &ic_gateway); + pr_info(" device=%s, len=%u hwaddr=" MAC_FMT ", ipaddr=" IP_FMT ", mask=" IP_FMT " , gw=" IP_FMT "\n", + ic_dev->name, ic_dev->addr_len, MAC_ARG(ic_dev->dev_addr), + IP_ARG(ic_myaddr), IP_ARG(ic_netmask), IP_ARG(ic_gateway)); pr_info(" host=%s, domain=%s, nis-domain=%s\n", utsname()->nodename, ic_domain, utsname()->domainname); - pr_info(" bootserver=%pI4, rootserver=%pI4, rootpath=%s", - &ic_servaddr, &root_server_addr, root_server_path); + pr_info(" bootserver=" IP_FMT ", rootserver=" IP_FMT ", rootpath=%s\n", + IP_ARG(ic_servaddr), IP_ARG(root_server_addr), root_server_path); if (ic_dev_mtu) pr_cont(", mtu=%d", ic_dev_mtu); for (i = 0; i < CONF_NAMESERVERS_MAX; i++) if (ic_nameservers[i] != NONE) { - pr_info(" nameserver%u=%pI4", - i, &ic_nameservers[i]); + pr_info(" nameserver%u=" IP_FMT, + i, IP_ARG(ic_nameservers[i])); break; } for (i++; i < CONF_NAMESERVERS_MAX; i++) if (ic_nameservers[i] != NONE) - pr_cont(", nameserver%u=%pI4", i, &ic_nameservers[i]); + pr_cont(", nameserver%u=" IP_FMT, i, IP_ARG(ic_nameservers[i])); pr_cont("\n"); #endif /* !SILENT */ @@ -1621,6 +1648,14 @@ static int __init ip_auto_config_setup(char *addrs) ic_set_manually = 1; ic_enable = 1; + ic_delete_routes(); + + ic_myaddr = NONE; + ic_netmask = NONE; + ic_gateway = NONE; + ic_servaddr = NONE; + ic_got_reply = 0; + /* * If any dhcp, bootp etc options are set, leave autoconfig on * and skip the below static IP processing.