Commit 0f224483 authored by Jondy Zhao's avatar Jondy Zhao

Restore metric from 1 to 0;

Restore KERNEL_IFINITY from 9999 to 0xFFFF;
Add function libwinet_map_ifindex used to map interface index
between ipv4 and ipv6.
parent 3a55d749
......@@ -14,20 +14,15 @@ SRCS = babeld.c net.c kernel.c util.c interface.c source.c neighbour.c \
OBJS = babeld.o net.o kernel.o util.o interface.o source.o neighbour.o \
route.o xroute.o message.o resend.o configuration.o local.o
KERNEL_SOUCES = kernel_netlink.c kernel_socket.c
ifneq "$(WINVER)" ""
SRCS += cyginet.c
OBJS += cyginet.o
LDLIBS += -liphlpapi -lws2_32 -lwlanapi -lole32 -lsetupapi
KERNEL_SOUCES += kernel_cygwin.c
ifeq "$(WINVER)" "XP"
CFLAGS += -D_WIN32_WINNT=0x0503
endif
ifeq "$(WINVER)" "VISTA"
else
CLFAGS += -D_WIN32_WINNT=0x0600
endif
......@@ -67,7 +62,7 @@ uninstall:
clean:
-rm -f babeld babeld.html *.o *~ core TAGS gmon.out
kernel.o: $(KERNEL_SOURCES)
kernel.o: kernel_netlink.c kernel_socket.c kernel_cygwin.c
# Usage: ./testc.exe
# Verify most of the functions in the cyginet.c
......
......@@ -229,6 +229,59 @@ libwinet_refresh_interface_map_table()
return (NO_ERROR == dwRet);
}
static int
libwinet_map_ifindex(int family, int ifindex)
{
IP_ADAPTER_ADDRESSES *pAdaptAddr = NULL;
IP_ADAPTER_ADDRESSES *pTmpAdaptAddr = NULL;
DWORD dwRet = 0;
DWORD dwSize = 0x10000;
DWORD dwReturn = 0;
dwRet = GetAdaptersAddresses(AF_UNSPEC,
GAA_FLAG_SKIP_ANYCAST \
| GAA_FLAG_SKIP_MULTICAST \
| GAA_FLAG_SKIP_DNS_SERVER \
| GAA_FLAG_SKIP_FRIENDLY_NAME,
NULL,
pAdaptAddr,
&dwSize
);
if (ERROR_BUFFER_OVERFLOW == dwRet) {
FREE(pAdaptAddr);
if (NULL == (pAdaptAddr = (IP_ADAPTER_ADDRESSES*)MALLOC(dwSize)))
return 0;
dwRet = GetAdaptersAddresses(AF_UNSPEC,
GAA_FLAG_SKIP_ANYCAST \
| GAA_FLAG_SKIP_MULTICAST \
| GAA_FLAG_SKIP_DNS_SERVER \
| GAA_FLAG_SKIP_FRIENDLY_NAME,
NULL,
pAdaptAddr,
&dwSize
);
}
if (NO_ERROR == dwRet) {
pTmpAdaptAddr = pAdaptAddr;
while (pTmpAdaptAddr) {
if (family == AF_INET ? pTmpAdaptAddr -> IfIndex == ifindex
: pTmpAdaptAddr -> Ipv6IfIndex == ifindex) {
dwReturn = family == AF_INET ?
pTmpAdaptAddr -> Ipv6IfIndex : pTmpAdaptAddr -> IfIndex;
break;
}
pTmpAdaptAddr = pTmpAdaptAddr->Next;
}
FREE(pAdaptAddr);
}
return dwReturn;
}
static int
libwinet_get_interface_info(const char *ifname,
PLIBWINET_INTERFACE pinfo)
......@@ -320,7 +373,6 @@ static int
libwinet_run_command(const char *command)
{
FILE *output;
printf("libwinet_run_command: %s\n", command);
kdebugf("libwinet_run_command: %s\n", command);
output = popen (command, "r");
if (!output)
......@@ -788,7 +840,7 @@ libwinet_edit_route_entry(const struct sockaddr *dest,
Row.dwForwardDest = (((SOCKADDR_IN*)dest) -> sin_addr).S_un.S_addr;
Row.dwForwardPolicy = 0;
Row.dwForwardNextHop = (((SOCKADDR_IN*)gate) -> sin_addr).S_un.S_addr;
Row.dwForwardIfIndex = ifindex;
Row.dwForwardIfIndex = libwinet_map_ifindex(AF_INET6, ifindex);
/*
* MIB_IPROUTE_TYPE_DIRECT <==> dwForwardNextHop == dwForwardDest
* MIB_IPROUTE_TYPE_LOCAL <==> dwForwardNextHop == Ip of the interface
......@@ -864,7 +916,7 @@ libwinet_edit_route_entry(const struct sockaddr *dest,
smask,
sgate,
metric,
ifindex
libwinet_map_ifindex(AF_INET6, ifindex)
) >= MAX_BUFFER_SIZE)
return -1;
......@@ -880,7 +932,9 @@ libwinet_edit_route_entry(const struct sockaddr *dest,
memset(&Row2, 0, sizeof(MIB_IPFORWARDROW2));
Row2.InterfaceLuid = NULL;
Row2.InterfaceIndex = ifindex;
/* Maybe in the Vista, both of indexs are same. */
Row2.InterfaceIndex = dest->sa_family == AF_INET6 ?
ifindex : libwinet_map_ifindex(AF_INET6, ifindex);
Row2.DestinationPrefix.PrefixLength = plen;
memcpy(&Row2.DestinationPrefix.Prefix, dest, sizeof(SOCKADDR_INET));
memcpy(&Row2.NextHop, gate, sizeof(SOCKADDR_INET)) ;
......@@ -1339,8 +1393,8 @@ cyginet_dump_route_table(struct cyginet_route *routes, int maxroutes)
for (i = 0;
i < (int) pIpForwardTable->dwNumEntries;
i++, proute ++, pRow ++) {
/* Here the ifindex is the index of ipv4 interface */
proute -> ifindex = pRow -> dwForwardIfIndex;
/* Map Ipv4 ifindex to Ipv6 Ifindex, maybe return 0 */
proute -> ifindex = libwinet_map_ifindex(AF_INET, pRow -> dwForwardIfIndex);
proute -> metric = pRow -> dwForwardMetric1;
proute -> proto = pRow -> dwForwardProto;
proute -> plen = mask2len((unsigned char*)&(pRow -> dwForwardMask), 4);
......@@ -1818,58 +1872,6 @@ convert_ipv6_route_table_to_rtm(struct rt_msghdr *rtm,
return start;
}
static int
libwinet_map_ifindex_to_ipv6ifindex(int ifindex)
{
IP_ADAPTER_ADDRESSES *pAdaptAddr = NULL;
IP_ADAPTER_ADDRESSES *pTmpAdaptAddr = NULL;
DWORD dwRet = 0;
DWORD dwSize = 0x10000;
DWORD dwReturn = 0;
DWORD Family = AF_UNSPEC;
dwRet = GetAdaptersAddresses(Family,
GAA_FLAG_SKIP_ANYCAST \
| GAA_FLAG_SKIP_MULTICAST \
| GAA_FLAG_SKIP_DNS_SERVER \
| GAA_FLAG_SKIP_FRIENDLY_NAME,
NULL,
pAdaptAddr,
&dwSize
);
if (ERROR_BUFFER_OVERFLOW == dwRet) {
FREE(pAdaptAddr);
if (NULL == (pAdaptAddr = (IP_ADAPTER_ADDRESSES*)MALLOC(dwSize)))
return 0;
dwRet = GetAdaptersAddresses(Family,
GAA_FLAG_SKIP_ANYCAST \
| GAA_FLAG_SKIP_MULTICAST \
| GAA_FLAG_SKIP_DNS_SERVER \
| GAA_FLAG_SKIP_FRIENDLY_NAME,
NULL,
pAdaptAddr,
&dwSize
);
}
if (NO_ERROR == dwRet) {
pTmpAdaptAddr = pAdaptAddr;
while (pTmpAdaptAddr) {
if (pTmpAdaptAddr -> IfIndex == ifindex) {
dwReturn = pTmpAdaptAddr -> Ipv6IfIndex;
break;
}
pTmpAdaptAddr = pTmpAdaptAddr->Next;
}
FREE(pAdaptAddr);
}
return dwReturn;
}
static ULONG
convert_time_from_string_to_ulong(const char * stime)
{
......@@ -2405,6 +2407,21 @@ runTestCases()
}
*/
printf("\n\nTest libwinet_map_ifindex:\n\n");
{
int i;
for (i = 1; i < 32; i++) {
printf("Ipv4 ifindex %d map to: Ipv6 index %d\n",
i,
libwinet_map_ifindex(AF_INET, i)
);
printf("Ipv6 ifindex %d map to: Ipv4 index %d\n",
i,
libwinet_map_ifindex(AF_INET6, i)
);
}
}
printf("\n\nTest cyginet_set_ipv6_forwards:\n\n");
{
printf("cyginet_set_ipv6_forwards(1) return %d\n",
......
......@@ -23,11 +23,7 @@ THE SOFTWARE.
#include <netinet/in.h>
#include "babeld.h"
#if defined (_WIN32_WINNT)
#define KERNEL_INFINITY 9999
#else
#define KERNEL_INFINITY 0xFFFF
#endif
struct kernel_route {
unsigned char prefix[16];
......
......@@ -494,10 +494,7 @@ print_kernel_route(int add, struct kernel_route *route)
{
char *ifname = NULL;
char guidname[IFNAMSIZ];
if ((route->plen >= 96) && v4mapped(route->prefix)) {
ifname = cyginet_ipv4_index2ifname(route->prefix);
}
else if(if_indextoname(route->ifindex, guidname))
if(if_indextoname(route->ifindex, guidname))
ifname = cyginet_ifname(guidname);
fprintf(stderr,
......@@ -510,7 +507,7 @@ print_kernel_route(int add, struct kernel_route *route)
ifname ? ifname : "unk",
route->ifindex
);
}
}
static int
parse_kernel_route(struct cyginet_route *src, struct kernel_route *route)
......@@ -643,13 +640,6 @@ kernel_addresses(char *ifname, int ifindex, int ll,
ifap = ifa;
i = 0;
/* In the Linux, metric is set to 0, but it's invalid in the
Windows, so we set metric to 1 here.
And gateway to be set as 0 in the Linux, as the same reason, we
set it as prefix in the Windows.
*/
while(ifap && i < maxroutes) {
if((ifname != NULL && compare_ifname(ifap->ifa_name, ifname) != 0))
goto next;
......@@ -664,7 +654,7 @@ kernel_addresses(char *ifname, int ifindex, int ll,
reset those bytes to 0 before passing them to babeld. */
memset(routes[i].prefix + 2, 0, 2);
routes[i].plen = 128;
routes[i].metric = 1;
routes[i].metric = 0;
routes[i].ifindex = ifindex;
routes[i].proto = RTPROT_BABEL_LOCAL;
memcpy(routes[i].gw, routes[i].prefix, 16);
......@@ -680,7 +670,7 @@ kernel_addresses(char *ifname, int ifindex, int ll,
memcpy(routes[i].prefix, v4prefix, 12);
memcpy(routes[i].prefix + 12, &sin->sin_addr, 4);
routes[i].plen = 128;
routes[i].metric = 1;
routes[i].metric = 0;
routes[i].ifindex = ifindex;
routes[i].proto = RTPROT_BABEL_LOCAL;
memcpy(routes[i].gw, routes[i].prefix, 16);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment