return NO_ERROR;
}
-UINT
-GetAddressOption(INT Level, INT OptionName)
+static
+void
+GetTdiTypeId(
+ _In_ INT Level,
+ _In_ INT OptionName,
+ _Out_ PULONG TdiType,
+ _Out_ PULONG TdiId)
{
switch (Level)
{
case SOL_SOCKET:
+ *TdiType = INFO_TYPE_ADDRESS_OBJECT;
switch (OptionName)
{
case SO_KEEPALIVE:
break;
case IPPROTO_IP:
+ *TdiType = INFO_TYPE_ADDRESS_OBJECT;
switch (OptionName)
{
case IP_TTL:
- return AO_OPTION_TTL;
+ *TdiId = AO_OPTION_TTL;
+ return;
case IP_DONTFRAGMENT:
- return AO_OPTION_IP_DONTFRAGMENT;
+ *TdiId = AO_OPTION_IP_DONTFRAGMENT;
+ return;
#if 0
case IP_RECEIVE_BROADCAST:
- return AO_OPTION_BROADCAST;
+ *TdiId = AO_OPTION_BROADCAST;
+ return;
#endif
case IP_HDRINCL:
- return AO_OPTION_IP_HDRINCL;
+ *TdiId = AO_OPTION_IP_HDRINCL;
+ return;
default:
break;
case IPPROTO_TCP:
switch (OptionName)
{
+ *TdiType = INFO_TYPE_CONNECTION;
case TCP_NODELAY:
- /* FIXME: Return proper option */
- ASSERT(FALSE);
- break;
+ *TdiId = TCP_SOCKET_NODELAY;
+ return;
default:
break;
}
}
DPRINT1("Unknown level/option name: %d %d\n", Level, OptionName);
- return 0;
+ *TdiType = 0;
+ *TdiId = 0;
}
INT
IN INT OptionLength)
{
PSOCKET_CONTEXT Context = HelperDllSocketContext;
- UINT RealOptionName;
+ ULONG TdiType, TdiId;
INT Status;
PTCP_REQUEST_SET_INFORMATION_EX Info;
PQUEUED_REQUEST Queued, NextQueued;
switch (OptionName)
{
case TCP_NODELAY:
- /* FIXME -- Send this to TCPIP */
- DPRINT1("Set: TCP_NODELAY not yet supported\n");
- return 0;
+ if (OptionLength < sizeof(CHAR))
+ {
+ return WSAEFAULT;
+ }
+ break;
default:
/* Invalid option */
}
/* If we get here, GetAddressOption must return something valid */
- RealOptionName = GetAddressOption(Level, OptionName);
- ASSERT(RealOptionName != 0);
+ GetTdiTypeId(Level, OptionName, &TdiId, &TdiType);
+ ASSERT((TdiId != 0) && (TdiType != 0));
Info = HeapAlloc(GetProcessHeap(), 0, sizeof(*Info) + OptionLength);
if (!Info)
Info->ID.toi_entity.tei_entity = Context->AddrFileEntityType;
Info->ID.toi_entity.tei_instance = Context->AddrFileInstance;
Info->ID.toi_class = INFO_CLASS_PROTOCOL;
- Info->ID.toi_type = INFO_TYPE_ADDRESS_OBJECT;
- Info->ID.toi_id = RealOptionName;
+ Info->ID.toi_type = TdiType;
+ Info->ID.toi_id = TdiId;
Info->BufferSize = OptionLength;
memcpy(Info->Buffer, OptionValue, OptionLength);