2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: drivers/net/afd/afd/tdiconn.c
5 * PURPOSE: Ancillary functions driver
6 * PROGRAMMER: Art Yerkes (ayerkes@speakeasy.net)
14 UINT
TdiAddressSizeFromType( UINT AddressType
) {
15 switch( AddressType
) {
17 return sizeof(TA_IP_ADDRESS
);
19 AFD_DbgPrint(MID_TRACE
,("TdiAddressSizeFromType - invalid type: %x\n", AddressType
));
25 UINT
TaLengthOfAddress( PTA_ADDRESS Addr
) {
26 UINT AddrLen
= 2 * sizeof( USHORT
) + Addr
->AddressLength
;
27 AFD_DbgPrint(MID_TRACE
,("AddrLen %x\n", AddrLen
));
31 UINT
TaLengthOfTransportAddress( PTRANSPORT_ADDRESS Addr
) {
32 UINT AddrLen
= 2 * sizeof( ULONG
) + Addr
->Address
[0].AddressLength
;
33 AFD_DbgPrint(MID_TRACE
,("AddrLen %x\n", AddrLen
));
37 VOID
TaCopyAddressInPlace( PTA_ADDRESS Target
,
38 PTA_ADDRESS Source
) {
39 UINT AddrLen
= TaLengthOfAddress( Source
);
40 RtlCopyMemory( Target
, Source
, AddrLen
);
43 PTA_ADDRESS
TaCopyAddress( PTA_ADDRESS Source
) {
44 UINT AddrLen
= TaLengthOfAddress( Source
);
45 PVOID Buffer
= ExAllocatePool( NonPagedPool
, AddrLen
);
46 RtlCopyMemory( Buffer
, Source
, AddrLen
);
50 VOID
TaCopyTransportAddressInPlace( PTRANSPORT_ADDRESS Target
,
51 PTRANSPORT_ADDRESS Source
) {
52 UINT AddrLen
= TaLengthOfTransportAddress( Source
);
53 RtlCopyMemory( Target
, Source
, AddrLen
);
56 PTRANSPORT_ADDRESS
TaCopyTransportAddress( PTRANSPORT_ADDRESS OtherAddress
) {
60 ASSERT(OtherAddress
->TAAddressCount
== 1);
61 AddrLen
= TaLengthOfTransportAddress( OtherAddress
);
62 A
= ExAllocatePool( NonPagedPool
, AddrLen
);
65 TaCopyTransportAddressInPlace( A
, OtherAddress
);
70 NTSTATUS TdiBuildNullConnectionInfoInPlace
71 ( PTDI_CONNECTION_INFORMATION ConnInfo
,
74 * FUNCTION: Builds a NULL TDI connection information structure
76 * ConnectionInfo = Address of buffer to place connection information
77 * Type = TDI style address type (TDI_ADDRESS_TYPE_XXX).
84 TdiAddressSize
= TdiAddressSizeFromType(Type
);
86 RtlZeroMemory(ConnInfo
,
87 sizeof(TDI_CONNECTION_INFORMATION
) +
90 ConnInfo
->OptionsLength
= sizeof(ULONG
);
91 ConnInfo
->RemoteAddressLength
= 0;
92 ConnInfo
->RemoteAddress
= NULL
;
94 return STATUS_SUCCESS
;
97 NTSTATUS TdiBuildNullConnectionInfo
98 ( PTDI_CONNECTION_INFORMATION
*ConnectionInfo
,
101 * FUNCTION: Builds a NULL TDI connection information structure
103 * ConnectionInfo = Address of buffer pointer to allocate connection
105 * Type = TDI style address type (TDI_ADDRESS_TYPE_XXX).
107 * Status of operation
110 PTDI_CONNECTION_INFORMATION ConnInfo
;
111 ULONG TdiAddressSize
;
114 TdiAddressSize
= TdiAddressSizeFromType(Type
);
116 ConnInfo
= (PTDI_CONNECTION_INFORMATION
)
117 ExAllocatePool(NonPagedPool
,
118 sizeof(TDI_CONNECTION_INFORMATION
) +
121 return STATUS_INSUFFICIENT_RESOURCES
;
123 Status
= TdiBuildNullConnectionInfoInPlace( ConnInfo
, Type
);
125 if (!NT_SUCCESS(Status
))
126 ExFreePool( ConnInfo
);
128 *ConnectionInfo
= ConnInfo
;
130 ConnInfo
->RemoteAddress
= (PTA_ADDRESS
)&ConnInfo
[1];
131 ConnInfo
->RemoteAddressLength
= TdiAddressSize
;
138 TdiBuildConnectionInfoInPlace
139 ( PTDI_CONNECTION_INFORMATION ConnectionInfo
,
140 PTRANSPORT_ADDRESS Address
) {
141 NTSTATUS Status
= STATUS_SUCCESS
;
143 RtlCopyMemory( ConnectionInfo
->RemoteAddress
,
145 ConnectionInfo
->RemoteAddressLength
);
152 TdiBuildConnectionInfo
153 ( PTDI_CONNECTION_INFORMATION
*ConnectionInfo
,
154 PTRANSPORT_ADDRESS Address
) {
155 NTSTATUS Status
= TdiBuildNullConnectionInfo
156 ( ConnectionInfo
, Address
->Address
[0].AddressType
);
158 if( NT_SUCCESS(Status
) )
159 TdiBuildConnectionInfoInPlace( *ConnectionInfo
, Address
);
165 TdiBuildConnectionInfoPair
166 ( PTDI_CONNECTION_INFO_PAIR ConnectionInfo
,
167 PTRANSPORT_ADDRESS From
, PTRANSPORT_ADDRESS To
)
169 * FUNCTION: Fill a TDI_CONNECTION_INFO_PAIR struct will the two addresses
172 * ConnectionInfo: The pair
173 * From: The from address
176 * Status of the operation
181 ULONG TdiAddressSize
;
183 /* FIXME: Get from socket information */
184 TdiAddressSize
= TdiAddressSizeFromType(From
->Address
[0].AddressType
);
185 SizeOfEntry
= TdiAddressSize
+ sizeof(TDI_CONNECTION_INFORMATION
);
187 LayoutFrame
= (PCHAR
)ExAllocatePool(NonPagedPool
, 2 * SizeOfEntry
);
190 AFD_DbgPrint(MIN_TRACE
, ("Insufficient resources.\n"));
191 return STATUS_INSUFFICIENT_RESOURCES
;
194 RtlZeroMemory( LayoutFrame
, 2 * SizeOfEntry
);
196 PTDI_CONNECTION_INFORMATION
197 FromTdiConn
= (PTDI_CONNECTION_INFORMATION
)LayoutFrame
,
198 ToTdiConn
= (PTDI_CONNECTION_INFORMATION
)LayoutFrame
+ SizeOfEntry
;
201 TdiBuildConnectionInfoInPlace( FromTdiConn
, From
);
203 TdiBuildNullConnectionInfoInPlace( FromTdiConn
,
204 From
->Address
[0].AddressType
);
207 TdiBuildConnectionInfoInPlace( ToTdiConn
, To
);
209 return STATUS_SUCCESS
;
212 PTA_ADDRESS
TdiGetRemoteAddress( PTDI_CONNECTION_INFORMATION TdiConn
)
214 * Convenience function that rounds out the abstraction of
215 * the TDI_CONNECTION_INFORMATION struct.
218 return TdiConn
->RemoteAddress
;