2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Runtime Library
4 * PURPOSE: Network Address Translation implementation
5 * PROGRAMMER: Alex Ionescu (alexi@tinykrnl.org)
8 /* INCLUDES *****************************************************************/
15 /* maximum length of an ipv4 address expressed as a string */
16 #define IPV4_ADDR_STRING_MAX_LEN 16
18 /* maximum length of an ipv4 port expressed as a string */
19 #define IPV4_PORT_STRING_MAX_LEN 7 /* with the leading ':' */
21 /* network to host order conversion for little endian machines */
22 #define WN2H(w) (((w & 0xFF00) >> 8) | ((w & 0x00FF) << 8))
24 /* FUNCTIONS ***************************************************************/
31 RtlIpv4AddressToStringA(IN
struct in_addr
*Addr
,
34 CHAR Buffer
[IPV4_ADDR_STRING_MAX_LEN
];
40 Length
= sprintf(Buffer
, "%u.%u.%u.%u", Addr
->S_un
.S_un_b
.s_b1
,
41 Addr
->S_un
.S_un_b
.s_b2
,
42 Addr
->S_un
.S_un_b
.s_b3
,
43 Addr
->S_un
.S_un_b
.s_b4
);
54 RtlIpv4AddressToStringExA(IN
struct in_addr
*Address
,
56 OUT PCHAR AddressString
,
57 IN OUT PULONG AddressStringLength
)
59 CHAR Buffer
[IPV4_ADDR_STRING_MAX_LEN
+IPV4_PORT_STRING_MAX_LEN
];
62 if (!Address
|| !AddressString
|| !AddressStringLength
)
63 return STATUS_INVALID_PARAMETER
;
65 Length
= sprintf(Buffer
, "%u.%u.%u.%u", Address
->S_un
.S_un_b
.s_b1
,
66 Address
->S_un
.S_un_b
.s_b2
,
67 Address
->S_un
.S_un_b
.s_b3
,
68 Address
->S_un
.S_un_b
.s_b4
);
70 if (Port
) Length
+= sprintf(Buffer
+ Length
, ":%u", WN2H(Port
));
72 if (*AddressStringLength
> Length
)
74 *AddressStringLength
= Length
+ 1;
75 strcpy(AddressString
, Buffer
);
76 return STATUS_SUCCESS
;
79 *AddressStringLength
= Length
+ 1;
80 return STATUS_INVALID_PARAMETER
;
88 RtlIpv4AddressToStringW(IN
struct in_addr
*Addr
,
91 WCHAR Buffer
[IPV4_ADDR_STRING_MAX_LEN
];
97 Length
= swprintf(Buffer
, L
"%u.%u.%u.%u", Addr
->S_un
.S_un_b
.s_b1
,
98 Addr
->S_un
.S_un_b
.s_b2
,
99 Addr
->S_un
.S_un_b
.s_b3
,
100 Addr
->S_un
.S_un_b
.s_b4
);
112 RtlIpv4AddressToStringExW(IN
struct in_addr
*Address
,
114 OUT PWCHAR AddressString
,
115 IN OUT PULONG AddressStringLength
)
117 WCHAR Buffer
[IPV4_ADDR_STRING_MAX_LEN
+IPV4_PORT_STRING_MAX_LEN
];
120 if (!Address
|| !AddressString
|| !AddressStringLength
)
121 return STATUS_INVALID_PARAMETER
;
123 Length
= swprintf(Buffer
, L
"%u.%u.%u.%u", Address
->S_un
.S_un_b
.s_b1
,
124 Address
->S_un
.S_un_b
.s_b2
,
125 Address
->S_un
.S_un_b
.s_b3
,
126 Address
->S_un
.S_un_b
.s_b4
);
128 if (Port
) Length
+= swprintf(Buffer
+ Length
, L
":%u", WN2H(Port
));
130 if (*AddressStringLength
> Length
)
132 *AddressStringLength
= Length
+ 1;
133 wcscpy(AddressString
, Buffer
);
134 return STATUS_SUCCESS
;
137 *AddressStringLength
= Length
+ 1;
138 return STATUS_INVALID_PARAMETER
;
146 RtlIpv4StringToAddressA(IN PCHAR String
,
148 OUT PCHAR
*Terminator
,
149 OUT
struct in_addr
*Addr
)
152 return STATUS_NOT_IMPLEMENTED
;
160 RtlIpv4StringToAddressExA(IN PCHAR AddressString
,
162 OUT
struct in_addr
*Address
,
166 return STATUS_NOT_IMPLEMENTED
;
174 RtlIpv4StringToAddressW(IN PCWSTR String
,
176 OUT LPWSTR
*Terminator
,
177 OUT
struct in_addr
*Addr
)
180 return STATUS_NOT_IMPLEMENTED
;
188 RtlIpv4StringToAddressExW(IN PWCHAR AddressString
,
190 OUT
struct in_addr
*Address
,
194 return STATUS_NOT_IMPLEMENTED
;
202 RtlIpv6AddressToStringA(IN
struct in6_addr
*Addr
,
206 return STATUS_NOT_IMPLEMENTED
;
214 RtlIpv6AddressToStringExA(IN
struct in6_addr
*Address
,
217 OUT PCHAR AddressString
,
218 IN OUT PULONG AddressStringLength
)
221 return STATUS_NOT_IMPLEMENTED
;
229 RtlIpv6AddressToStringW(IN
struct in6_addr
*Addr
,
233 return STATUS_NOT_IMPLEMENTED
;
241 RtlIpv6AddressToStringExW(IN
struct in6_addr
*Address
,
244 IN OUT PWCHAR AddressString
,
245 IN OUT PULONG AddressStringLength
)
248 return STATUS_NOT_IMPLEMENTED
;
256 RtlIpv6StringToAddressA(IN PCHAR Name
,
257 OUT PCHAR
*Terminator
,
258 OUT
struct in6_addr
*Addr
)
261 return STATUS_NOT_IMPLEMENTED
;
269 RtlIpv6StringToAddressExA(IN PCHAR AddressString
,
270 OUT
struct in6_addr
*Address
,
275 return STATUS_NOT_IMPLEMENTED
;
283 RtlIpv6StringToAddressW(IN PWCHAR Name
,
284 OUT PCHAR
*Terminator
,
285 OUT
struct in6_addr
*Addr
)
288 return STATUS_NOT_IMPLEMENTED
;
296 RtlIpv6StringToAddressExW(IN PWCHAR AddressName
,
297 OUT
struct in6_addr
*Address
,
302 return STATUS_NOT_IMPLEMENTED
;