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
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Klaus Wölfel
slapos
Commits
791bc592
Commit
791bc592
authored
Apr 07, 2013
by
Jondy Zhao
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Use IN6ADDR_ANY as ipv6 blackhole gateway instead IN6ADDR_LOOPBACK.
parent
582eb114
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
156 additions
and
100 deletions
+156
-100
component/babeld/README.cygwin
component/babeld/README.cygwin
+3
-0
component/babeld/cyginet.c
component/babeld/cyginet.c
+125
-77
component/babeld/cyginet.h
component/babeld/cyginet.h
+4
-2
component/babeld/kernel_cygwin.c
component/babeld/kernel_cygwin.c
+24
-21
No files found.
component/babeld/README.cygwin
View file @
791bc592
...
...
@@ -196,3 +196,6 @@ Notes
format to specify interface index in the link local address:
fe80::2ff:38ff:fed8:7d97%11
10. For ipv4, blackhole route doesn't work now. I can't find a simple
way to do it in the Windows.
\ No newline at end of file
component/babeld/cyginet.c
View file @
791bc592
...
...
@@ -24,6 +24,7 @@
#include <stdio.h>
#include <unistd.h>
#include <wchar.h>
#include <assert.h>
#define INSIDE_BABELD_CYGINET
#include "cyginet.h"
...
...
@@ -861,7 +862,6 @@ cyginet_blackhole_index(struct in6_addr* addr6, char * addr)
}
FREE
(
pAdaptAddr
);
}
return
dwReturn
;
}
...
...
@@ -958,8 +958,7 @@ libwinet_edit_route_entry(const struct sockaddr *dest,
/* Add ipv4 route before Windows Vista, use IP Helper API */
else
{
MIB_IPFORWARDROW
Row
;
unsigned
long
Res
;
unsigned
long
Res
;
struct
in_addr
mask
;
plen2mask
(
plen
,
&
mask
);
...
...
@@ -972,12 +971,12 @@ libwinet_edit_route_entry(const struct sockaddr *dest,
Row
.
dwForwardMask
=
mask
.
S_un
.
S_addr
;
/*
* MIB_IPROUTE_TYPE_DIRECT <==> dwForwardNextHop == dwForwardDest
* MIB_IPROUTE_TYPE_LOCAL <==> dwForwardNextHop in local interfaces
* MIB_IPROUTE_TYPE_INDIRECT all the others
* Refer to:
* http://technet.microsoft.com/en-us/library/dd379495(v=ws.10).aspx
*/
Row
.
dwForwardType
=
Row
.
dwForwardNextHop
==
Row
.
dwForwardDest
?
\
MIB_IPROUTE_TYPE_DIRECT
:
MIB_IPROUTE_TYPE_INDIRECT
;
Row
.
dwForwardType
=
MIB_IPROUTE_TYPE_INDIRECT
;
Row
.
dwForwardType
=
(
Row
.
dwForwardNextHop
==
Row
.
dwForwardDest
)
?
MIB_IPROUTE_TYPE_DIRECT
:
MIB_IPROUTE_TYPE_INDIRECT
;
Row
.
dwForwardProto
=
MIB_IPPROTO_NETMGMT
;
Row
.
dwForwardAge
=
0
;
Row
.
dwForwardNextHopAS
=
0
;
...
...
@@ -1004,7 +1003,7 @@ libwinet_edit_route_entry(const struct sockaddr *dest,
return
-
1
;
}
#if 0 /* Use route command */
#if 0 /* Use route command */
else {
/* route ADD dest MASK mask gate METRIC n IF index */
/* route CHANGE dest MASK mask gate METRIC n IF index */
...
...
@@ -1533,7 +1532,6 @@ cyginet_dump_route_table(struct cyginet_route *routes, int maxroutes)
proute
->
metric
=
pRow
->
dwForwardMetric1
;
proute
->
proto
=
pRow
->
dwForwardProto
;
proute
->
plen
=
mask2len
((
unsigned
char
*
)
&
(
pRow
->
dwForwardMask
),
4
);
/* Note that the IPv4 addresses returned in GetIpForwardTable
* entries are in network byte order
*/
...
...
@@ -1629,7 +1627,7 @@ cyginet_read_route_socket(void *buffer, size_t size)
return
0
;
}
int
int
cyginet_refresh_interface_table
()
{
return
libwinet_refresh_interface_map_table
();
...
...
@@ -1685,37 +1683,102 @@ cyginet_ifname(const char * guidname)
return
NULL
;
}
int
cyginet_add_ipentry
(
int
ifindex
,
struct
sockaddr
*
addr
)
static
int
libwinet_edit_netentry
(
int
operation
,
int
ifindex
,
struct
sockaddr
*
addr
,
int
type
)
{
MIB_IPNETROW
row
;
PLIBWINET_INTERFACE_MAP_TABLE
p
;
if
(
!
g_interface_map_table
)
libwinet_refresh_interface_map_table
();
p
=
g_interface_map_table
;
while
(
p
)
{
if
(
p
->
IfIndex
==
ifindex
)
{
row
.
dwPhysAddrLen
=
p
->
PhysicalAddressLength
;
if
(
row
.
dwPhysAddrLen
>
MAXLEN_PHYSADDR
)
MIB_IPNETROW
row
=
{
0
};
DWORD
dwRetVal
=
NO_ERROR
;
DWORD
dest
=
(((
SOCKADDR_IN
*
)
addr
)
->
sin_addr
).
S_un
.
S_addr
;
if
(
operation
==
1
)
{
/* We need send an arp request to get mac address */
/* TO DO: src should be address assigned to ifindex */
DWORD
src
=
0
;
if
(
type
!=
MIB_IPNET_TYPE_INVALID
)
{
dwRetVal
=
SendARP
(
dest
,
src
,
(
PULONG
)
row
.
bPhysAddr
,
&
row
.
dwPhysAddrLen
);
if
(
dwRetVal
!=
NO_ERROR
)
return
-
1
;
memcpy
(
row
.
bPhysAddr
,
p
->
PhysicalAddress
,
row
.
dwPhysAddrLen
);
break
;
}
p
=
p
->
next
;
row
.
dwIndex
=
ifindex
;
row
.
dwAddr
=
dest
;
row
.
dwType
=
MIB_IPNET_TYPE_DYNAMIC
;
dwRetVal
=
CreateIpNetEntry
(
&
row
);
}
if
(
row
.
dwPhysAddrLen
)
{
row
.
dwIndex
=
ifindex
;
row
.
dwAddr
=
(((
SOCKADDR_IN
*
)
addr
)
->
sin_addr
).
S_un
.
S_addr
;
row
.
dwType
=
MIB_IPNET_TYPE_DYNAMIC
;
return
CreateIpNetEntry
(
&
row
);
else
if
(
operation
==
0
)
{
row
.
dwIndex
=
ifindex
;
row
.
dwAddr
=
dest
;
dwRetVal
=
DeleteIpNetEntry
(
&
row
);
}
return
-
1
;
else
assert
(
0
);
return
0
?
dwRetVal
==
NO_ERROR
:
dwRetVal
;
}
/* The following functions are reserved. */
#if 0
int
cyginet_search_netentry(int add, int ifindex, struct sockaddr *addr)
{
MIB_IPNETROW row = {0};
MIB_IPNETTABLE * ptable;
MIB_IPNETROW * prow = NULL;
DWORD dwSize;
DWORD dwRetVal = NO_ERROR;
DWORD dest = (((SOCKADDR_IN*)addr) -> sin_addr).S_un.S_addr;
DWORD n;
ptable = (MIB_IPNETTABLE *) MALLOC(sizeof (MIB_IPNETTABLE));
if (ptable == NULL)
return -1;
/* Make an initial call to get the necessary size into dwSize */
dwSize = sizeof (MIB_IPNETTABLE);
if (GetIpNetTable(ptable, &dwSize, FALSE) == ERROR_INSUFFICIENT_BUFFER) {
FREE(ptable);
ptable = (MIB_IPNETTABLE *) MALLOC(dwSize);
if (ptable == NULL)
return -1;
}
/* Make a second call to get the actual data we want. */
if ((dwRetVal = GetIpNetTable(ptable, &dwSize, FALSE)) != NO_ERROR) {
FREE(ptable);
return -1;
}
/* Search entry in the table */
prow = ptable -> table;
for (n = 0; n < ptable -> dwNumEntries; n++, prow++)
if ( prow -> dwAddr == dest)
break;
if (add) {
if (!prow) {
/* We need send an arp request to get mac address */
/* TO DO: src should be address assigned to ifindex */
DWORD src = 0;
dwRetVal = SendARP(dest, src, (PULONG)row.bPhysAddr, &row.dwPhysAddrLen);
if (dwRetVal != NO_ERROR) {
FREE(ptable);
return -1;
}
row.dwIndex = ifindex;
row.dwAddr = dest;
row.dwType = MIB_IPNET_TYPE_DYNAMIC;
dwRetVal = CreateIpNetEntry ( &row );
}
}
else {
if (prow)
dwRetVal = DeleteIpNetEntry(prow);
}
FREE(ptable);
return 0 ? dwRetVal == NO_ERROR : dwRetVal;
}
char *
cyginet_ipv4_index2ifname(int ifindex)
{
...
...
@@ -2432,52 +2495,6 @@ DWORD GetConnectedNetworks()
/* ------------------------------------------------------------- */
#ifdef TEST_CYGINET
// The following #defines are from routprot.h in the Platform Software Develoment Kit (SDK)
#define PROTO_TYPE_UCAST 0
#define PROTOCOL_ID(Type, VendorId, ProtocolId) \
(((
Type
&
0x03
)
<<
30
)
|
((
VendorId
&
0x3FFF
)
<<
16
)
|
(
ProtocolId
&
0xFFFF
))
#define PROTO_VENDOR_ID 0x3FAA
DWORD
(
WINAPI
*
fRtmRegisterEntity
)(
PRTM_ENTITY_INFO
,
PRTM_ENTITY_EXPORT_METHODS
,
RTM_EVENT_CALLBACK
,
WINBOOL
,
PRTM_REGN_PROFILE
,
PRTM_ENTITY_HANDLE
);
DWORD
(
WINAPI
*
fRtmDeregisterEntity
)(
RTM_ENTITY_HANDLE
);
int
test_rtm2
()
{
HMODULE
lib
;
if
((
lib
=
LoadLibraryW
(
L"rtm.dll"
)))
{
fRtmRegisterEntity
=
GetProcAddress
(
lib
,
(
LPCSTR
)
"RtmRegisterEntity"
);
fRtmDeregisterEntity
=
GetProcAddress
(
lib
,
(
LPCSTR
)
"RtmDeregisterEntity"
);
FreeLibrary
(
lib
);
}
else
return
-
1
;
RTM_ENTITY_HANDLE
RtmRegHandle
;
RTM_ENTITY_INFO
EntityInfo
;
RTM_REGN_PROFILE
RegnProfile
;
DWORD
dwRet
=
ERROR_SUCCESS
;
EntityInfo
.
RtmInstanceId
=
0
;
EntityInfo
.
AddressFamily
=
AF_INET
;
EntityInfo
.
EntityId
.
EntityProtocolId
=
PROTO_IP_OTHER
;
EntityInfo
.
EntityId
.
EntityInstanceId
=
PROTOCOL_ID
(
PROTO_TYPE_UCAST
,
PROTO_VENDOR_ID
,
PROTO_IP_OTHER
);
// Register the new entity
dwRet
=
fRtmRegisterEntity
(
&
EntityInfo
,
NULL
,
NULL
,
FALSE
,
&
RegnProfile
,
&
RtmRegHandle
);
if
(
dwRet
!=
ERROR_SUCCESS
){
// Registration failed - Log an Error and Quit
return
-
1
;
}
// Clean-up: Deregister the new entity
dwRet
=
fRtmDeregisterEntity
(
RtmRegHandle
);
if
(
dwRet
!=
ERROR_SUCCESS
){
// Registration failed - Log an Error and Quit
return
-
1
;
}
return
0
;
}
VOID
PrintAllInterfaces
()
{
IP_ADAPTER_ADDRESSES
*
pAdaptAddr
=
NULL
;
...
...
@@ -2755,6 +2772,15 @@ runTestCases()
}
}
printf
(
"
\n\n
Test cyginet_dump_route_table:
\n\n
"
);
do
{
#define MAX_ROUTES 120
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
);
printf
(
"
\n\n
Test libwinet_monitor_route_thread_proc:
\n\n
"
);
do
{
int
mypipes
[
2
];
...
...
@@ -2923,6 +2949,7 @@ runTestCases()
printf
(
"Delete Ipv6 route return %d
\n
"
,
n
);
}
while
(
0
);
}
int
main
(
int
argc
,
char
*
argv
[])
...
...
@@ -2976,6 +3003,27 @@ int main(int argc, char* argv[])
printf
(
"libwinet_refresh_interface_map_table failed
\n
"
);
}
printf
(
"
\n\n
Test ipv4 blackhole route:
\n\n
"
);
do
{
SOCKADDR_IN
dest
=
{
AF_INET
,
0
,
{{{
INADDR_ANY
}}},
{
0
}
};
SOCKADDR_IN
gate
=
{
AF_INET
,
0
,
{{{
INADDR_ANY
}}},
{
0
}
};
int
ifindex
=
1
;
int
n
;
if
(
inet_pton
(
AF_INET
,
"123.58.180.0"
,
&
dest
.
sin_addr
)
!=
1
)
break
;
if
(
inet_pton
(
AF_INET
,
"127.0.0.1"
,
&
gate
.
sin_addr
)
!=
1
)
break
;
n
=
libwinet_edit_route_entry
((
struct
sockaddr
*
)
&
dest
,
24
,
(
struct
sockaddr
*
)
&
gate
,
ifindex
,
1
,
RTM_ADD
);
printf
(
"Add blackhole route return: %d"
,
n
);
}
while
(
0
);
runTestCases
();
/* printf("\n\nTest libwinet_init_ipv6_interface:\n\n"); */
...
...
component/babeld/cyginet.h
View file @
791bc592
...
...
@@ -90,6 +90,10 @@
IPv6 Addresses, it explains the relation between link-local address
and interface id
http://msdn.microsoft.com/en-us/library/aa921042.aspx
TCP/IP (v4 and v6) Technical Reference, it shows ipv4 and ipv6 how
to work in the windows. (Recommended)
http://technet.microsoft.com/en-us/library/dd379473(v=ws.10).aspx
*/
#ifndef __CYGIFNET_H__
...
...
@@ -220,8 +224,6 @@ int cyginet_delete_route_entry(const struct sockaddr *, unsigned short,
int
cyginet_update_route_entry
(
const
struct
sockaddr
*
,
unsigned
short
,
const
struct
sockaddr
*
,
int
,
unsigned
int
);
int
cyginet_add_ipentry
(
int
,
struct
sockaddr
*
);
char
*
cyginet_ifname
(
const
char
*
);
char
*
cyginet_guidname
(
const
char
*
);
int
cyginet_refresh_interface_table
();
...
...
component/babeld/kernel_cygwin.c
View file @
791bc592
...
...
@@ -116,7 +116,7 @@ static int kernel_pipe_handles[2];
*
* For ipv6, no global options to enable forwarding, but for each
* interface respectively.
*
*
* Option 2:
*
* ICMPV6CTL_REDIRACCEPT
...
...
@@ -140,7 +140,7 @@ static int kernel_pipe_handles[2];
* Refer to:
* http://technet.microsoft.com/en-us/library/cc766102(v=ws.10).aspx
* http://msdn.microsoft.com/en-us/library/aa915651.aspx
*
*
* Notice the msdn page of Windows CE, value is "EnableICMPRedirects",
* it's plural. But I'd rather use singluar form "EnableICMPRedirect".
*
...
...
@@ -158,7 +158,7 @@ kernel_setup(int setup)
return
-
1
;
/* We don't disable ICMPv6 redirect in the Windows */
/*
/*
if ((rc = cyginet_set_icmp6_redirect_accept(0)) == -1) {
fprintf(stderr, "Cannot disable ICMPv6 redirect.\n");
return -1;
...
...
@@ -171,7 +171,7 @@ kernel_setup(int setup)
);
return -1;
}
*/
*/
FOR_ALL_INTERFACES
(
ifp
)
{
if
(
cyginet_set_interface_forwards
(
ifp
->
name
,
1
)
==
-
1
)
{
fprintf
(
stderr
,
"Cannot enable IPv6 forwarding.
\n
"
);
...
...
@@ -305,8 +305,10 @@ kernel_route(int operation, const unsigned char *dest, unsigned short plen,
const
unsigned
char
*
newgate
,
int
newifindex
,
unsigned
int
newmetric
)
{
char
blackhole_addr6
[
1
][
1
][
16
]
=
{{{
0
}}};
char
blackhole_addr
[
1
][
1
][
16
]
=
{{{
0
}}};
char
local6
[
1
][
1
][
16
]
=
{{
IN6ADDR_ANY_INIT
}};
char
local4
[
1
][
1
][
16
]
=
{{{
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x7f
,
0x00
,
0x00
,
0x01
}}};
int
rc
,
ipv4
;
int
route_ifindex
;
int
prefix_len
;
...
...
@@ -353,8 +355,6 @@ kernel_route(int operation, const unsigned char *dest, unsigned short plen,
IN6_IS_ADDR_UNSPECIFIED
(
newgate
))
return
0
;
kdebugf
(
"kernel_route: %s %s/%d metric %d dev %d nexthop %s
\n
"
,
operation
==
ROUTE_ADD
?
"add"
:
operation
==
ROUTE_FLUSH
?
"flush"
:
"change"
,
...
...
@@ -390,27 +390,30 @@ kernel_route(int operation, const unsigned char *dest, unsigned short plen,
if
(
ipv4
)
{
PUSHADDR
(
destination
,
dest
);
if
(
metric
==
KERNEL_INFINITY
)
PUSHADDR
(
gateway
,
**
blackhole_addr
);
if
(
metric
==
KERNEL_INFINITY
)
{
/* blackhole route, now it doesn't work */
kdebugf
(
"Error: ipv4 blackhole route doesn't work.
\n
"
);
return
-
1
;
assert
(
operation
!=
ROUTE_MODIFY
);
PUSHADDR
(
gateway
,
**
local4
);
}
else
if
(
plen
==
128
&&
memcmp
(
dest
+
12
,
gate
+
12
,
4
)
==
0
)
{
/* It means add arp record, add dest ip to this interface */
if
(
cyginet_add_ipentry
(
ifindex
,
(
struct
sockaddr
*
)
&
destination
)
!=
0
)
return
-
1
;
assert
(
operation
!=
ROUTE_MODIFY
);
PUSHADDR
(
gateway
,
gate
);
/* MIB_IPROUTE_TYPE_DIRECT */
}
else
PUSHADDR
(
gateway
,
gate
);
PUSHADDR
(
gateway
,
gate
);
/* MIB_IPROUTE_TYPE_INDIRECT */
}
else
{
PUSHADDR6
(
destination
,
dest
);
if
(
metric
==
KERNEL_INFINITY
)
PUSHADDR6
(
gateway
,
**
blackhole_addr
6
);
else
PUSHADDR6
(
gateway
,
**
local
6
);
else
PUSHADDR6
(
gateway
,
gate
);
}
#undef PUSHADDR
#undef PUSHADDR6
/* what if route_ifindex == 0 */
/* what if route_ifindex == 0 */
switch
(
operation
)
{
case
ROUTE_FLUSH
:
rc
=
cyginet_delete_route_entry
((
struct
sockaddr
*
)
&
destination
,
...
...
@@ -465,7 +468,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
)
...
...
@@ -619,7 +622,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
=
0
;
routes
[
i
].
metric
=
0
;
routes
[
i
].
ifindex
=
ifindex
;
routes
[
i
].
proto
=
RTPROT_BABEL_LOCAL
;
memset
(
routes
[
i
].
gw
,
0
,
16
);
...
...
@@ -643,7 +646,7 @@ kernel_callback(int (*fn)(int, void*), void *closure)
kdebugf
(
"Kernel table changed.
\n
"
);
cyginet_refresh_interface_table
();
clear_kernel_socket_event
();
return
fn
(
~
0
,
closure
);
}
...
...
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