--- /home/korovkin/projects/eCos/trunk/packages/net/bsd_tcpip/current/src/sys/net/route.c 2003-07-24 22:04:25.000000000 +0400 +++ route.c 2007-02-21 16:30:01.000000000 +0300 @@ -137,6 +137,36 @@ } } +externC void if_indextoname(int indx, char *buf, int len); + +static int +rt_reinit_rtdelete_if( struct radix_node *rn, void *vifp ) +{ + struct rtentry *rt = (struct rtentry *)rn; //routing table + const char* ifname = (const char*)vifp; //interface name + char addr[64]; + if (rt->rt_ifa->ifa_addr->sa_family == AF_INET) { + if (rt->rt_ifp) + if_indextoname(rt->rt_ifp->if_index, addr, sizeof(addr)); + if (!rt->rt_ifp || !strcmp(addr, ifname)) + rtrequest(RTM_DELETE, rt_key(rt), rt->rt_gateway, rt_mask(rt), + 0, NULL); + } + return (0); +} + +void +cyg_route_reinit_if(char* ifname) +{ + int i; + for (i = 0; i < AF_MAX+1; i++) { + struct radix_node_head *rnh; + rnh = rt_tables[i]; + if (rnh) + (*rnh->rnh_walktree)(rnh, rt_reinit_rtdelete_if, ifname); + } +} + /* * Packet routing routines. */ --- /home/korovkin/projects/eCos/trunk/packages/net/common/current/include/network.h 2005-11-04 15:16:58.000000000 +0300 +++ network.h 2007-02-21 16:35:47.000000000 +0300 @@ -71,6 +71,7 @@ __externC void init_all_network_interfaces(void); __externC void cyg_route_reinit(void); +__externC void cyg_route_reinit_if(const char* ifname); __externC void perror(const char *) __THROW; __externC int close(int); __externC ssize_t read(int, void *, size_t); Index: dhcp_prot.c =================================================================== RCS file: /cvs/ecos/ecos-opt/net/net/common/current/src/dhcp_prot.c,v retrieving revision 1.20 diff -u -u -r1.20 dhcp_prot.c --- dhcp_prot.c 5 Mar 2006 12:48:37 -0000 1.20 +++ dhcp_prot.c 21 Feb 2007 13:40:21 -0000 @@ -361,7 +361,7 @@ int retcode = false; // Ensure clean slate - cyg_route_reinit(); // Force any existing routes to be forgotten + cyg_route_reinit_if(intf); // Force any existing routes to be forgotten s = socket(AF_INET, SOCK_DGRAM, 0); if (s < 0) { @@ -1388,7 +1388,7 @@ int retcode = false; // Ensure clean slate - cyg_route_reinit(); // Force any existing routes to be forgotten + cyg_route_reinit_if(intf); // Force any existing routes to be forgotten s = socket(AF_INET, SOCK_DGRAM, 0); if (s < 0) {