Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
8f207fe7
Commit
8f207fe7
authored
Aug 02, 2021
by
Huw Davies
Committed by
Alexandre Julliard
Aug 02, 2021
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
iphlpapi: Implement GetIpForwardTable2().
Signed-off-by:
Huw Davies
<
huw@codeweavers.com
>
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
f1793fd8
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
117 additions
and
13 deletions
+117
-13
iphlpapi_main.c
dlls/iphlpapi/iphlpapi_main.c
+117
-11
nsi.c
dlls/nsi/tests/nsi.c
+0
-2
No files found.
dlls/iphlpapi/iphlpapi_main.c
View file @
8f207fe7
...
...
@@ -2229,6 +2229,123 @@ DWORD WINAPI GetIpForwardTable(PMIB_IPFORWARDTABLE pIpForwardTable, PULONG pdwSi
return
ret
;
}
static
void
forward_row2_fill
(
MIB_IPFORWARD_ROW2
*
row
,
USHORT
fam
,
void
*
key
,
struct
nsi_ip_forward_rw
*
rw
,
void
*
dyn
,
struct
nsi_ip_forward_static
*
stat
)
{
struct
nsi_ipv4_forward_key
*
key4
=
(
struct
nsi_ipv4_forward_key
*
)
key
;
struct
nsi_ipv6_forward_key
*
key6
=
(
struct
nsi_ipv6_forward_key
*
)
key
;
struct
nsi_ipv4_forward_dynamic
*
dyn4
=
(
struct
nsi_ipv4_forward_dynamic
*
)
dyn
;
struct
nsi_ipv6_forward_dynamic
*
dyn6
=
(
struct
nsi_ipv6_forward_dynamic
*
)
dyn
;
if
(
fam
==
WS_AF_INET
)
{
row
->
InterfaceLuid
=
key4
->
luid
;
row
->
DestinationPrefix
.
Prefix
.
Ipv4
.
sin_family
=
fam
;
row
->
DestinationPrefix
.
Prefix
.
Ipv4
.
sin_port
=
0
;
row
->
DestinationPrefix
.
Prefix
.
Ipv4
.
sin_addr
=
key4
->
prefix
;
memset
(
&
row
->
DestinationPrefix
.
Prefix
.
Ipv4
.
sin_zero
,
0
,
sizeof
(
row
->
DestinationPrefix
.
Prefix
.
Ipv4
.
sin_zero
)
);
row
->
DestinationPrefix
.
PrefixLength
=
key4
->
prefix_len
;
row
->
NextHop
.
Ipv4
.
sin_family
=
fam
;
row
->
NextHop
.
Ipv4
.
sin_port
=
0
;
row
->
NextHop
.
Ipv4
.
sin_addr
=
key4
->
next_hop
;
memset
(
&
row
->
NextHop
.
Ipv4
.
sin_zero
,
0
,
sizeof
(
row
->
NextHop
.
Ipv4
.
sin_zero
)
);
row
->
Age
=
dyn4
->
age
;
}
else
{
row
->
InterfaceLuid
=
key6
->
luid
;
row
->
DestinationPrefix
.
Prefix
.
Ipv6
.
sin6_family
=
fam
;
row
->
DestinationPrefix
.
Prefix
.
Ipv6
.
sin6_port
=
0
;
row
->
DestinationPrefix
.
Prefix
.
Ipv6
.
sin6_flowinfo
=
0
;
row
->
DestinationPrefix
.
Prefix
.
Ipv6
.
sin6_addr
=
key6
->
prefix
;
row
->
DestinationPrefix
.
Prefix
.
Ipv6
.
sin6_scope_id
=
0
;
row
->
DestinationPrefix
.
PrefixLength
=
key6
->
prefix_len
;
row
->
NextHop
.
Ipv6
.
sin6_family
=
fam
;
row
->
NextHop
.
Ipv6
.
sin6_port
=
0
;
row
->
NextHop
.
Ipv6
.
sin6_flowinfo
=
0
;
row
->
NextHop
.
Ipv6
.
sin6_addr
=
key6
->
next_hop
;
row
->
NextHop
.
Ipv6
.
sin6_scope_id
=
0
;
row
->
Age
=
dyn6
->
age
;
}
row
->
InterfaceIndex
=
stat
->
if_index
;
row
->
SitePrefixLength
=
rw
->
site_prefix_len
;
row
->
ValidLifetime
=
rw
->
valid_lifetime
;
row
->
PreferredLifetime
=
rw
->
preferred_lifetime
;
row
->
Metric
=
rw
->
metric
;
row
->
Protocol
=
rw
->
protocol
;
row
->
Loopback
=
rw
->
loopback
;
row
->
AutoconfigureAddress
=
rw
->
autoconf
;
row
->
Publish
=
rw
->
publish
;
row
->
Immortal
=
rw
->
immortal
;
row
->
Origin
=
stat
->
origin
;
}
/******************************************************************
* GetIpForwardTable2 (IPHLPAPI.@)
*/
DWORD
WINAPI
GetIpForwardTable2
(
ADDRESS_FAMILY
family
,
MIB_IPFORWARD_TABLE2
**
table
)
{
void
*
key
[
2
]
=
{
NULL
,
NULL
};
struct
nsi_ip_forward_rw
*
rw
[
2
]
=
{
NULL
,
NULL
};
void
*
dyn
[
2
]
=
{
NULL
,
NULL
};
struct
nsi_ip_forward_static
*
stat
[
2
]
=
{
NULL
,
NULL
};
static
const
USHORT
fam
[
2
]
=
{
WS_AF_INET
,
WS_AF_INET6
};
static
const
DWORD
key_size
[
2
]
=
{
sizeof
(
struct
nsi_ipv4_forward_key
),
sizeof
(
struct
nsi_ipv6_forward_key
)
};
static
const
DWORD
dyn_size
[
2
]
=
{
sizeof
(
struct
nsi_ipv4_forward_dynamic
),
sizeof
(
struct
nsi_ipv6_forward_dynamic
)
};
DWORD
err
=
ERROR_SUCCESS
,
i
,
size
,
count
[
2
]
=
{
0
,
0
};
TRACE
(
"%u, %p
\n
"
,
family
,
table
);
if
(
!
table
||
(
family
!=
WS_AF_INET
&&
family
!=
WS_AF_INET6
&&
family
!=
WS_AF_UNSPEC
))
return
ERROR_INVALID_PARAMETER
;
for
(
i
=
0
;
i
<
2
;
i
++
)
{
if
(
family
!=
WS_AF_UNSPEC
&&
family
!=
fam
[
i
])
continue
;
err
=
NsiAllocateAndGetTable
(
1
,
ip_module_id
(
fam
[
i
]
),
NSI_IP_FORWARD_TABLE
,
key
+
i
,
key_size
[
i
],
(
void
**
)
rw
+
i
,
sizeof
(
**
rw
),
dyn
+
i
,
dyn_size
[
i
],
(
void
**
)
stat
+
i
,
sizeof
(
**
stat
),
count
+
i
,
0
);
if
(
err
)
count
[
i
]
=
0
;
}
size
=
FIELD_OFFSET
(
MIB_IPFORWARD_TABLE2
,
Table
[
count
[
0
]
+
count
[
1
]
]);
*
table
=
heap_alloc
(
size
);
if
(
!*
table
)
{
err
=
ERROR_NOT_ENOUGH_MEMORY
;
goto
err
;
}
(
*
table
)
->
NumEntries
=
count
[
0
]
+
count
[
1
];
for
(
i
=
0
;
i
<
count
[
0
];
i
++
)
{
MIB_IPFORWARD_ROW2
*
row
=
(
*
table
)
->
Table
+
i
;
struct
nsi_ipv4_forward_key
*
key4
=
(
struct
nsi_ipv4_forward_key
*
)
key
[
0
];
struct
nsi_ipv4_forward_dynamic
*
dyn4
=
(
struct
nsi_ipv4_forward_dynamic
*
)
dyn
[
0
];
forward_row2_fill
(
row
,
fam
[
0
],
key4
+
i
,
rw
[
0
]
+
i
,
dyn4
+
i
,
stat
[
0
]
+
i
);
}
for
(
i
=
0
;
i
<
count
[
1
];
i
++
)
{
MIB_IPFORWARD_ROW2
*
row
=
(
*
table
)
->
Table
+
count
[
0
]
+
i
;
struct
nsi_ipv6_forward_key
*
key6
=
(
struct
nsi_ipv6_forward_key
*
)
key
[
1
];
struct
nsi_ipv6_forward_dynamic
*
dyn6
=
(
struct
nsi_ipv6_forward_dynamic
*
)
dyn
[
1
];
forward_row2_fill
(
row
,
fam
[
1
],
key6
+
i
,
rw
[
1
]
+
i
,
dyn6
+
i
,
stat
[
1
]
+
i
);
}
err:
for
(
i
=
0
;
i
<
2
;
i
++
)
NsiFreeTable
(
key
[
i
],
rw
[
i
],
dyn
[
i
],
stat
[
i
]
);
return
err
;
}
/******************************************************************
* GetIpNetTable (IPHLPAPI.@)
...
...
@@ -3557,17 +3674,6 @@ char *WINAPI IPHLP_if_indextoname( NET_IFINDEX index, char *name )
}
/******************************************************************
* GetIpForwardTable2 (IPHLPAPI.@)
*/
DWORD
WINAPI
GetIpForwardTable2
(
ADDRESS_FAMILY
family
,
PMIB_IPFORWARD_TABLE2
*
table
)
{
static
int
once
;
if
(
!
once
++
)
FIXME
(
"(%u %p): stub
\n
"
,
family
,
table
);
return
ERROR_NOT_SUPPORTED
;
}
/******************************************************************
* GetIpNetTable2 (IPHLPAPI.@)
*/
DWORD
WINAPI
GetIpNetTable2
(
ADDRESS_FAMILY
family
,
PMIB_IPNET_TABLE2
*
table
)
...
...
dlls/nsi/tests/nsi.c
View file @
8f207fe7
...
...
@@ -531,9 +531,7 @@ todo_wine_if (family == AF_INET6)
dyn_size
=
dyn_sizes
[
i
];
err
=
GetIpForwardTable2
(
family
,
&
table
);
todo_wine
ok
(
!
err
,
"got %d
\n
"
,
err
);
if
(
err
)
{
winetest_pop_context
();
return
;
}
ok
(
table
->
NumEntries
==
count
,
"table entries %d count %d
\n
"
,
table
->
NumEntries
,
count
);
for
(
i
=
0
;
i
<
count
;
i
++
)
...
...
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