Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
slapos
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Douglas
slapos
Commits
7ca8acee
Commit
7ca8acee
authored
Feb 14, 2013
by
Jondy Zhao
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Windows XP doesn't support IPV6_V6ONLY options (net.c)
Fix issues to get the route table. Add README.cygwin
parent
5fe4e2ab
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
249 additions
and
157 deletions
+249
-157
component/babeld/README.cygwin
component/babeld/README.cygwin
+52
-0
component/babeld/cyginet.c
component/babeld/cyginet.c
+123
-98
component/babeld/cyginet.h
component/babeld/cyginet.h
+6
-10
component/babeld/kernel_cygwin.c
component/babeld/kernel_cygwin.c
+66
-48
component/babeld/net.c
component/babeld/net.c
+2
-1
No files found.
component/babeld/README.cygwin
0 → 100644
View file @
7ca8acee
Introduction
============
Babeld for windows can work in the Cygwin 1.7 and later.
Changed files
-------------
Makefile
net.c
kernel.c
New files
---------
kernel_cygwin.c
cyginet.h
cyginet.c
README.cygwin
Building in the cygwin
======================
Required packages:
Cygwin 1.7
gcc 4.5.3 for cygwin
In the Windows XP,
$ PLATFORM_DEFINES="-D_WIN32_WINNT=0x0503" make
Later Windows Vista,
$ PLATFORM_DEFINES="-D_WIN32_WINNT=0x0600" make
Interface Names
===============
In the Windows, GUID is used as unique interface names. You can list
all the interfaces by the following command:
$ ipv6 if | grep "^Interface" -A 1
--
Interface 2: Automatic Tunneling Pseudo-Interface
Guid {48FCE3FC-EC30-E50E-F1A7-71172AEEE3AE}
--
Interface 1: Loopback Pseudo-Interface
Guid {6BD113CC-5EC2-7638-B953-0B889DA72014}
...
When call babled, use GUID as interface name:
$ ./babeld.exe {6BD113CC-5EC2-7638-B953-0B889DA72014}
component/babeld/cyginet.c
View file @
7ca8acee
...
...
@@ -202,9 +202,8 @@ libwinet_run_command(const char *command)
* Gateway could be an address or interface name.
*
*/
static
int
libwinet_dump_ipv6_route_table
(
struct
kernel
_route
*
routes
,
libwinet_dump_ipv6_route_table
(
struct
cyginet
_route
*
routes
,
int
maxroutes
)
{
#define MAX_LINE_SIZE 80
...
...
@@ -216,13 +215,19 @@ libwinet_dump_ipv6_route_table(struct kernel_route *routes,
int
count
=
0
;
int
ignored
=
0
;
IN6_ADDR
*
sin6
;
struct
kernel_route
*
proute
=
routes
;
struct
sockaddr_in6
*
dest
;
struct
sockaddr_in6
*
gate
;
struct
cyginet_route
route
;
struct
cyginet_route
*
proute
=
routes
;
output
=
popen
(
command
,
"r"
);
if
(
!
output
)
return
-
1
;
dest
=
(
struct
sockaddr_in6
*
)
&
(
route
.
prefix
);
gate
=
(
struct
sockaddr_in6
*
)
&
(
route
.
gateway
);
/* Ignore the first line */
fgets
(
buffer
,
MAX_LINE_SIZE
,
output
);
...
...
@@ -240,41 +245,43 @@ libwinet_dump_ipv6_route_table(struct kernel_route *routes,
/* The first field of route entry */
if
(
strncmp
(
buffer
,
"Prefix"
,
6
)
==
0
)
{
sin6
=
(
IN6_ADDR
*
)
&
(
proute
->
prefix
);
memset
(
&
route
,
0
,
sizeof
(
struct
cyginet_route
));
if
(
NULL
==
(
p
=
strchr
(
s
,
'/'
)))
break
;
*
p
++
=
0
;
/*
* Maybe it will be "fe80::5efe:10.85.0.127", ignore it
*/
if
(
inet_pton
(
AF_INET6
,
s
,
sin6
)
!=
1
)
if
(
inet_pton
(
AF_INET6
,
s
,
&
(
dest
->
sin6_addr
)
)
!=
1
)
ignored
=
1
;
proute
->
plen
=
strtol
(
p
,
NULL
,
10
);
dest
->
sin6_family
=
AF_INET6
;
route
.
plen
=
strtol
(
p
,
NULL
,
10
);
}
else
if
(
strncmp
(
buffer
,
"Interface"
,
9
)
==
0
)
proute
->
ifindex
=
strtol
(
buffer
+
9
,
NULL
,
10
);
route
.
ifindex
=
strtol
(
buffer
+
9
,
NULL
,
10
);
else
if
(
strncmp
(
buffer
,
"Gateway"
,
7
)
==
0
)
{
sin6
=
(
IN6_ADDR
*
)
&
(
proute
->
gw
);
if
(
inet_pton
(
AF_INET6
,
s
,
sin6
)
!=
1
)
memset
(
sin6
,
0
,
sizeof
(
IN6_ADDR
));
if
(
inet_pton
(
AF_INET6
,
s
,
&
(
gate
->
sin6_addr
))
==
1
)
gate
->
sin6_family
=
AF_INET6
;
}
else
if
(
strncmp
(
buffer
,
"Metric"
,
6
)
==
0
)
proute
->
metric
=
strtol
(
s
,
NULL
,
10
);
route
.
metric
=
strtol
(
s
,
NULL
,
10
);
/* Last field of the route entry */
else
if
(
strncmp
(
buffer
,
"Site Prefix Length"
,
18
)
==
0
)
{
if
(
ignored
)
ignored
=
0
;
else
if
(
!
ignored
)
{
proute
->
proto
=
MIB_IPPROTO_OTHER
;
/* ?? */
count
++
;
route
.
proto
=
MIB_IPPROTO_OTHER
;
/* ?? */
if
((
maxroutes
>
count
)
&&
(
proute
!=
NULL
))
{
memcpy
(
proute
,
&
route
,
sizeof
(
struct
cyginet_route
));
proute
++
;
if
(
count
>
maxroutes
)
break
;
}
count
++
;
}
}
...
...
@@ -1015,31 +1022,6 @@ cyginet_loopback_index(int family)
return
libwinet_get_loopback_index
(
family
);
}
static
PMIB_IPFORWARDTABLE
libwinet_get_ipforward_table
(
int
forder
)
{
DWORD
dwSize
=
0
;
PMIB_IPFORWARDTABLE
pIpForwardTable
;
pIpForwardTable
=
(
PMIB_IPFORWARDTABLE
)
MALLOC
(
sizeof
(
MIB_IPFORWARDTABLE
));
if
(
NULL
==
pIpForwardTable
)
return
NULL
;
if
(
ERROR_INSUFFICIENT_BUFFER
==
GetIpForwardTable
(
pIpForwardTable
,
&
dwSize
,
forder
))
{
FREE
(
pIpForwardTable
);
pIpForwardTable
=
(
PMIB_IPFORWARDTABLE
)
MALLOC
(
dwSize
);
if
(
pIpForwardTable
==
NULL
)
return
NULL
;
}
if
(
NO_ERROR
==
GetIpForwardTable
(
pIpForwardTable
,
&
dwSize
,
forder
))
return
pIpForwardTable
;
return
NULL
;
}
/*
* There are 3 ways to dump route table in the Windows:
*
...
...
@@ -1057,11 +1039,11 @@ libwinet_get_ipforward_table(int forder)
*
*/
int
cyginet_dump_route_table
(
struct
kernel
_route
*
routes
,
int
maxroutes
)
cyginet_dump_route_table
(
struct
cyginet
_route
*
routes
,
int
maxroutes
)
{
ULONG
NumEntries
=
-
1
;
struct
kernel
_route
*
proute
;
struct
cyginet
_route
*
proute
;
int
i
;
#if _WIN32_WINNT < _WIN32_WINNT_VISTA
...
...
@@ -1076,21 +1058,38 @@ cyginet_dump_route_table(struct kernel_route *routes, int maxroutes)
SOCKADDR_IN
*
paddr
;
PMIB_IPFORWARDTABLE
pIpForwardTable
;
PMIB_IPFORWARDROW
pRow
;
if
(
NULL
==
(
pIpForwardTable
=
libwinet_get_ipforward_table
(
0
)))
DWORD
dwSize
=
sizeof
(
MIB_IPFORWARDTABLE
);
pIpForwardTable
=
(
PMIB_IPFORWARDTABLE
)
MALLOC
(
dwSize
);
if
(
NULL
==
pIpForwardTable
)
return
-
1
;
if
(
ERROR_INSUFFICIENT_BUFFER
==
GetIpForwardTable
(
pIpForwardTable
,
&
dwSize
,
0
))
{
FREE
(
pIpForwardTable
);
pIpForwardTable
=
(
PMIB_IPFORWARDTABLE
)
MALLOC
(
dwSize
);
if
(
pIpForwardTable
==
NULL
)
return
-
1
;
}
if
(
NO_ERROR
!=
GetIpForwardTable
(
pIpForwardTable
,
&
dwSize
,
0
))
return
-
1
;
{
proute
=
routes
+
NumEntries
;
NumEntries
+=
pIpForwardTable
->
dwNumEntries
;
if
(
NumEntries
>
maxroutes
)
{
if
((
routes
==
NULL
)
||
(
NumEntries
>
maxroutes
)
)
{
FREE
(
pIpForwardTable
);
return
-
1
;
return
NumEntries
;
}
pRow
=
pIpForwardTable
->
table
;
for
(
i
=
0
;
i
<
(
int
)
pIpForwardTable
->
dwNumEntries
;
i
++
,
proute
++
,
pRow
++
)
{
/* libwinet_map_ifindex_to_ipv6ifindex */
proute
->
ifindex
=
pRow
->
dwForwardIfIndex
;
proute
->
metric
=
pRow
->
dwForwardMetric1
;
...
...
@@ -1100,16 +1099,15 @@ cyginet_dump_route_table(struct kernel_route *routes, int maxroutes)
/* Note that the IPv4 addresses returned in GetIpForwardTable
* entries are in network byte order
*/
paddr
=
(
SOCKADDR_IN
*
)
proute
->
prefix
;
paddr
=
(
struct
sockaddr_in
*
)
&
(
proute
->
prefix
)
;
paddr
->
sin_family
=
AF_INET
;
(
paddr
->
sin_addr
).
S_un
.
S_addr
=
pRow
->
dwForwardDest
;
paddr
=
(
SOCKADDR_IN
*
)
proute
->
gw
;
paddr
=
(
struct
sockaddr_in
*
)
&
(
proute
->
gateway
)
;
paddr
->
sin_family
=
AF_INET
;
(
paddr
->
sin_addr
).
S_un
.
S_addr
=
pRow
->
dwForwardNextHop
;
}
FREE
(
pIpForwardTable
);
}
#else
PMIB_IPFORWARD_TABLE2
pIpForwardTable2
;
...
...
@@ -1120,9 +1118,13 @@ cyginet_dump_route_table(struct kernel_route *routes, int maxroutes)
pIpForwardTable2
0
))
{
if
(
pIpForwardTable2
->
NumEntries
<
maxroutes
)
{
NumEntries
=
pIpForwardTable2
->
dwNumEntries
;
if
((
routes
==
NULL
)
||
(
NumEntries
>
maxroutes
))
{
FreeMibTable
(
pIpForwardTable2
);
return
NumEntries
;
}
proute
=
routes
+
NumEntri
es
;
proute
=
rout
es
;
NumEntries
=
pIpForwardTable2
->
dwNumEntries
;
pRow2
=
pIpForwardTable2
->
Table
;
...
...
@@ -1135,13 +1137,11 @@ cyginet_dump_route_table(struct kernel_route *routes, int maxroutes)
(
pRow2
->
DestinationPrefix
).
DestinationPrefix
,
sizeof
(
SOCKADDR_INET
)
);
memcpy
(
proute
->
gw
,
memcpy
(
proute
->
gateway
,
pRow2
->
NextHop
,
sizeof
(
SOCKADDR_INET
)
);
}
}
FreeMibTable
(
pIpForwardTable2
);
}
#endif
...
...
@@ -1209,6 +1209,31 @@ void cyginet_cleanup()
/* The following functions are reserved. */
#if 0
static PMIB_IPFORWARDTABLE
libwinet_get_ipforward_table(int forder)
{
DWORD dwSize = sizeof(MIB_IPFORWARDTABLE);
PMIB_IPFORWARDTABLE pIpForwardTable;
pIpForwardTable = (PMIB_IPFORWARDTABLE)MALLOC(dwSize);
if (NULL == pIpForwardTable)
return NULL;
if (ERROR_INSUFFICIENT_BUFFER == GetIpForwardTable(pIpForwardTable,
&dwSize,
forder
)) {
FREE(pIpForwardTable);
pIpForwardTable = (PMIB_IPFORWARDTABLE) MALLOC(dwSize);
if (pIpForwardTable == NULL)
return NULL;
}
if (NO_ERROR == GetIpForwardTable(pIpForwardTable,
&dwSize,
forder))
return pIpForwardTable;
return NULL;
}
static int
convert_ipv6_route_table2()
{
...
...
@@ -1969,8 +1994,8 @@ runTestCases()
printf
(
"
\n\n
Test libwinet_dump_ipv6_route_table:
\n\n
"
);
{
struct
kernel
_route
routes
[
100
];
memset
(
routes
,
0
,
sizeof
(
struct
kernel
_route
)
*
100
);
struct
cyginet
_route
routes
[
100
];
memset
(
routes
,
0
,
sizeof
(
struct
cyginet
_route
)
*
100
);
int
n
=
libwinet_dump_ipv6_route_table
(
routes
,
100
);
printf
(
"Get route numbers: %d
\n
"
,
n
);
}
...
...
@@ -2182,8 +2207,8 @@ runTestCases()
printf
(
"
\n\n
Test cyginet_dump_route_table:
\n\n
"
);
do
{
#define MAX_ROUTES 120
struct
kernel
_route
routes
[
MAX_ROUTES
];
memset
(
routes
,
0
,
sizeof
(
struct
kernel
_route
)
*
MAX_ROUTES
);
struct
cyginet
_route
routes
[
MAX_ROUTES
];
memset
(
routes
,
0
,
sizeof
(
struct
cyginet
_route
)
*
MAX_ROUTES
);
int
n
=
cyginet_dump_route_table
(
routes
,
MAX_ROUTES
);
printf
(
"Get route numbers: %d
\n
"
,
n
);
}
while
(
0
);
...
...
component/babeld/cyginet.h
View file @
7ca8acee
...
...
@@ -75,20 +75,16 @@ struct sockaddr_dl {
contains both if name and ll address */
};
#if defined(INSIDE_CYGINET)
/* Copy from babeld/kernel.h */
#define RTPROT_BABEL_LOCAL -2
#define KERNEL_INFINITY 0xFFFF
struct
kernel_route
{
unsigned
char
prefix
[
16
];
struct
cyginet_route
{
struct
sockaddr
prefix
;
int
plen
;
int
metric
;
unsigned
int
ifindex
;
int
proto
;
unsigned
char
gw
[
16
]
;
struct
sockaddr
gateway
;
};
/* End of Copy */
#if defined(INSIDE_CYGINET)
struct
ifaddrs
{
struct
ifaddrs
*
ifa_next
;
...
...
@@ -156,7 +152,7 @@ int cyginet_interface_mtu(const char *, int);
int
cyginet_interface_operational
(
const
char
*
,
int
);
int
cyginet_interface_ipv4
(
const
char
*
,
int
,
unsigned
char
*
);
int
cyginet_dump_route_table
(
struct
kernel
_route
*
,
int
);
int
cyginet_dump_route_table
(
struct
cyginet
_route
*
,
int
);
int
cyginet_loopback_index
(
int
);
int
cyginet_add_route_entry
(
const
struct
sockaddr
*
,
unsigned
short
,
...
...
component/babeld/kernel_cygwin.c
View file @
7ca8acee
...
...
@@ -519,7 +519,7 @@ print_kernel_route(int add, struct kernel_route *route)
}
static
int
parse_kernel_route
(
struct
kernel_route
*
route
)
parse_kernel_route
(
struct
cyginet_route
*
src
,
struct
kernel_route
*
route
)
{
struct
sockaddr
*
sa
;
...
...
@@ -535,9 +535,16 @@ parse_kernel_route(struct kernel_route *route)
return
-
1
;
}
sa
=
(
struct
sockaddr
*
)
route
->
prefix
;
memset
(
route
,
0
,
sizeof
(
struct
kernel_route
));
route
->
plen
=
src
->
plen
;
route
->
metric
=
src
->
metric
;
route
->
proto
=
src
->
proto
;
route
->
ifindex
=
src
->
ifindex
;
sa
=
&
(
src
->
prefix
);
if
(
sa
->
sa_family
==
AF_INET6
)
{
struct
sockaddr_in6
*
sin6
=
(
struct
sockaddr_in6
*
)
sa
;
memcpy
(
route
->
prefix
,
&
sin6
->
sin6_addr
,
16
);
if
(
IN6_IS_ADDR_LINKLOCAL
(
&
sin6
->
sin6_addr
)
||
IN6_IS_ADDR_MC_LINKLOCAL
(
&
sin6
->
sin6_addr
))
return
-
1
;
...
...
@@ -555,9 +562,10 @@ parse_kernel_route(struct kernel_route *route)
}
/* Gateway */
sa
=
(
struct
sockaddr
*
)
route
->
gw
;
sa
=
&
(
src
->
gateway
)
;
if
(
sa
->
sa_family
==
AF_INET6
)
{
struct
sockaddr_in6
*
sin6
=
(
struct
sockaddr_in6
*
)
sa
;
memcpy
(
route
->
gw
,
&
sin6
->
sin6_addr
,
16
);
if
(
IN6_IS_ADDR_LINKLOCAL
(
&
sin6
->
sin6_addr
))
{
route
->
ifindex
=
IN6_LINKLOCAL_IFINDEX
(
sin6
->
sin6_addr
);
SET_IN6_LINKLOCAL_IFINDEX
(
sin6
->
sin6_addr
,
0
);
...
...
@@ -583,30 +591,40 @@ kernel_routes(struct kernel_route *routes, int maxroutes)
{
int
rc
,
i
;
int
count
;
struct
kernel_route
*
proute
=
routes
;
struct
kernel_route
*
pdest
=
proute
;
memset
(
routes
,
0
,
sizeof
(
struct
kernel_route
)
*
maxroutes
);
struct
kernel_route
*
proute
=
routes
;
struct
cyginet_route
*
ptable
;
rc
=
cyginet_dump_route_table
(
routes
,
maxroutes
);
rc
=
cyginet_dump_route_table
(
NULL
,
0
);
if
(
rc
<
0
)
return
-
1
;
if
(
rc
==
0
)
return
0
;
rc
+=
10
;
if
(
NULL
==
(
ptable
=
calloc
(
rc
,
sizeof
(
struct
cyginet_route
))))
return
-
1
;
count
=
0
;
for
(
i
=
0
;
i
<
rc
;
i
++
,
proute
++
)
{
rc
=
cyginet_dump_route_table
(
ptable
,
rc
);
if
(
rc
<
0
)
{
free
(
ptable
);
return
-
1
;
}
if
(
parse_kernel_route
(
proute
)
!=
0
)
continue
;
for
(
i
=
0
,
count
=
0
;
i
<
rc
;
i
++
)
{
if
(
p
route
!=
pdest
)
memcpy
(
pdest
,
proute
,
sizeof
(
struct
kernel_route
))
;
if
(
p
arse_kernel_route
(
ptable
+
i
,
proute
)
!=
0
)
continue
;
if
(
debug
>
2
)
print_kernel_route
(
RTM_ADD
,
p
dest
);
print_kernel_route
(
RTM_ADD
,
p
route
);
pdest
++
;
if
(
maxroutes
>
rc
)
proute
++
;
count
++
;
}
return
(
pdest
-
routes
);
free
(
ptable
);
return
count
;
}
int
...
...
component/babeld/net.c
View file @
7ca8acee
...
...
@@ -19,7 +19,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
...
...
@@ -50,9 +49,11 @@ babel_socket(int port)
if
(
s
<
0
)
return
-
1
;
#if !defined(_WIN32_WINNT) || _WIN32_WINNT >= 0x0600
rc
=
setsockopt
(
s
,
IPPROTO_IPV6
,
IPV6_V6ONLY
,
&
one
,
sizeof
(
one
));
if
(
rc
<
0
)
goto
fail
;
#endif
rc
=
setsockopt
(
s
,
SOL_SOCKET
,
SO_REUSEADDR
,
&
one
,
sizeof
(
one
));
if
(
rc
<
0
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment