implement user mode catchable exceptions, refactor system status codes to use NTLSTATUS_ prefix, update build scripts to use shared literal macros for linker arguments, update named queue lifetime cleanup to include KeNamedQueueUnpublishHandle.
This commit is contained in:
1 parent
1f5477cf66
commit
b7fcfce6f7
140 files changed
+7649
-3943
No files matched your search
+172
-172
@@ -134,21 +134,21 @@ static NET_STACK_PROVIDER gLwipProvider = {
|
||||
// Implements the err To Status operation.
|
||||
static KSTATUS LwipErrToStatus(err_t err) {
|
||||
switch (err) {
|
||||
case ERR_OK: return STATUS_SUCCESS;
|
||||
case ERR_MEM: return STATUS_NO_MEMORY;
|
||||
case ERR_BUF: return STATUS_BUFFER_TOO_SMALL;
|
||||
case ERR_TIMEOUT: return STATUS_TIMEOUT;
|
||||
case ERR_WOULDBLOCK:return STATUS_WOULD_BLOCK;
|
||||
case ERR_RTE: return STATUS_NOT_FOUND;
|
||||
case ERR_VAL: return STATUS_INVALID_PARAMETER;
|
||||
case ERR_ARG: return STATUS_INVALID_PARAMETER;
|
||||
case ERR_USE: return STATUS_ALREADY_EXISTS;
|
||||
case ERR_ISCONN: return STATUS_ALREADY_EXISTS;
|
||||
case ERR_CONN: return STATUS_OBJECT_DEAD;
|
||||
case ERR_CLSD: return STATUS_OBJECT_DEAD;
|
||||
case ERR_ABRT: return STATUS_OBJECT_DEAD;
|
||||
case ERR_RST: return STATUS_OBJECT_DEAD;
|
||||
default: return STATUS_FAILURE;
|
||||
case ERR_OK: return NTLSTATUS_SUCCESS;
|
||||
case ERR_MEM: return NTLSTATUS_NO_MEMORY;
|
||||
case ERR_BUF: return NTLSTATUS_BUFFER_TOO_SMALL;
|
||||
case ERR_TIMEOUT: return NTLSTATUS_TIMEOUT;
|
||||
case ERR_WOULDBLOCK:return NTLSTATUS_WOULD_BLOCK;
|
||||
case ERR_RTE: return NTLSTATUS_NOT_FOUND;
|
||||
case ERR_VAL: return NTLSTATUS_INVALID_PARAMETER;
|
||||
case ERR_ARG: return NTLSTATUS_INVALID_PARAMETER;
|
||||
case ERR_USE: return NTLSTATUS_ALREADY_EXISTS;
|
||||
case ERR_ISCONN: return NTLSTATUS_ALREADY_EXISTS;
|
||||
case ERR_CONN: return NTLSTATUS_OBJECT_DEAD;
|
||||
case ERR_CLSD: return NTLSTATUS_OBJECT_DEAD;
|
||||
case ERR_ABRT: return NTLSTATUS_OBJECT_DEAD;
|
||||
case ERR_RST: return NTLSTATUS_OBJECT_DEAD;
|
||||
default: return NTLSTATUS_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -199,36 +199,36 @@ static KSTATUS LwipGetSettingIpv4(const char* section, const char* key,
|
||||
ip4_addr_t* out, int required) {
|
||||
char value[LWIP_SETTINGS_VALUE_MAX];
|
||||
KSTATUS st = KeGetSettingString(section, key, value, sizeof(value));
|
||||
if (st == STATUS_NOT_FOUND && !required)
|
||||
return STATUS_NOT_FOUND;
|
||||
if (st == NTLSTATUS_NOT_FOUND && !required)
|
||||
return NTLSTATUS_NOT_FOUND;
|
||||
if (!KSUCCESS(st))
|
||||
return st;
|
||||
if (!LwipParseIpv4(value, out)) {
|
||||
DbgPrint("lwIP: invalid IPv4 setting [%s] %s=%s\n", section, key, value);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
}
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static KSTATUS LwipGetSettingIpv6(const char* section, const char* key,
|
||||
ip6_addr_t* out, int required) {
|
||||
char value[LWIP_SETTINGS_VALUE_MAX];
|
||||
KSTATUS st = KeGetSettingString(section, key, value, sizeof(value));
|
||||
if (st == STATUS_NOT_FOUND && !required)
|
||||
return STATUS_NOT_FOUND;
|
||||
if (st == NTLSTATUS_NOT_FOUND && !required)
|
||||
return NTLSTATUS_NOT_FOUND;
|
||||
if (!KSUCCESS(st))
|
||||
return st;
|
||||
if (!ip6addr_aton(value, out)) {
|
||||
DbgPrint("lwIP: invalid IPv6 setting [%s] %s=%s\n", section, key, value);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
}
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static KSTATUS LwipLoadIpv6Config(const char* section, LWIP_NETIF_CONFIG* cfg) {
|
||||
char mode[LWIP_SETTINGS_VALUE_MAX];
|
||||
KSTATUS st = KeGetSettingString(section, "ipv6", mode, sizeof(mode));
|
||||
if (st == STATUS_NOT_FOUND) {
|
||||
if (st == NTLSTATUS_NOT_FOUND) {
|
||||
cfg->EnableIpv6 = 1;
|
||||
cfg->Ipv6Autoconfig = 1;
|
||||
} else if (!KSUCCESS(st)) {
|
||||
@@ -246,40 +246,40 @@ static KSTATUS LwipLoadIpv6Config(const char* section, LWIP_NETIF_CONFIG* cfg) {
|
||||
return st;
|
||||
} else {
|
||||
DbgPrint("lwIP: invalid IPv6 mode [%s] ipv6=%s\n", section, mode);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (!cfg->EnableIpv6)
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
|
||||
st = LwipGetSettingIpv6(section, "dns6", &cfg->Dns6, 0);
|
||||
if (KSUCCESS(st))
|
||||
cfg->HasDns6 = 1;
|
||||
else if (st != STATUS_NOT_FOUND)
|
||||
else if (st != NTLSTATUS_NOT_FOUND)
|
||||
return st;
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Copies section Name.
|
||||
static KSTATUS LwipCopySectionName(char* out, size_t outSize, const char* prefix, const char* name) {
|
||||
if (!out || !outSize || !prefix || !name)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
size_t prefixLen = strlen(prefix);
|
||||
size_t nameLen = strlen(name);
|
||||
if (prefixLen + nameLen + 1 > outSize)
|
||||
return STATUS_BUFFER_TOO_SMALL;
|
||||
return NTLSTATUS_BUFFER_TOO_SMALL;
|
||||
|
||||
memcpy(out, prefix, prefixLen);
|
||||
memcpy(out + prefixLen, name, nameLen + 1);
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Loads config From Section.
|
||||
static KSTATUS LwipLoadConfigFromSection(const char* section, LWIP_NETIF_CONFIG* cfg) {
|
||||
if (!section || !cfg)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
char mode[LWIP_SETTINGS_VALUE_MAX];
|
||||
KSTATUS st = KeGetSettingString(section, "mode", mode, sizeof(mode));
|
||||
@@ -289,7 +289,7 @@ static KSTATUS LwipLoadConfigFromSection(const char* section, LWIP_NETIF_CONFIG*
|
||||
memset(cfg, 0, sizeof(*cfg));
|
||||
size_t sectionLen = strlen(section);
|
||||
if (sectionLen >= sizeof(cfg->Section))
|
||||
return STATUS_BUFFER_TOO_SMALL;
|
||||
return NTLSTATUS_BUFFER_TOO_SMALL;
|
||||
memcpy(cfg->Section, section, sectionLen + 1);
|
||||
|
||||
if (strcmp(mode, "static") == 0) {
|
||||
@@ -311,19 +311,19 @@ static KSTATUS LwipLoadConfigFromSection(const char* section, LWIP_NETIF_CONFIG*
|
||||
st = LwipGetSettingIpv4(section, "dns", &cfg->Dns4, 0);
|
||||
if (KSUCCESS(st))
|
||||
cfg->HasDns4 = 1;
|
||||
else if (st != STATUS_NOT_FOUND)
|
||||
else if (st != NTLSTATUS_NOT_FOUND)
|
||||
return st;
|
||||
return LwipLoadIpv6Config(section, cfg);
|
||||
}
|
||||
|
||||
DbgPrint("lwIP: invalid network mode [%s] mode=%s\n", section, mode);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
// Loads netif Config.
|
||||
static KSTATUS LwipLoadNetifConfig(const NET_DEVICE* device, LWIP_NETIF_CONFIG* cfg) {
|
||||
if (!device || !cfg)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
char section[64];
|
||||
KSTATUS st = LwipCopySectionName(section, sizeof(section),
|
||||
@@ -333,9 +333,9 @@ static KSTATUS LwipLoadNetifConfig(const NET_DEVICE* device, LWIP_NETIF_CONFIG*
|
||||
|
||||
st = LwipLoadConfigFromSection(section, cfg);
|
||||
if (KSUCCESS(st))
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
|
||||
if (st != STATUS_NOT_FOUND) {
|
||||
if (st != NTLSTATUS_NOT_FOUND) {
|
||||
DbgPrint("lwIP: invalid settings for [%s] (0x%x)\n", section, st);
|
||||
return st;
|
||||
}
|
||||
@@ -347,13 +347,13 @@ static KSTATUS LwipLoadNetifConfig(const NET_DEVICE* device, LWIP_NETIF_CONFIG*
|
||||
return st;
|
||||
}
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Implements the socket Lock operation.
|
||||
static KSTATUS LwipSocketLock(LWIP_PROVIDER_SOCKET* s) {
|
||||
if (!s || !s->Lock)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
return KeWaitSemaphore(s->Lock);
|
||||
}
|
||||
|
||||
@@ -407,12 +407,12 @@ static void LwipSocketCallback(struct netconn* conn, enum netconn_evt evt, u16_t
|
||||
static KSTATUS LwipSocketAllocateWithConn(uint32_t domain, uint32_t type, uint32_t protocol,
|
||||
struct netconn* conn, LWIP_PROVIDER_SOCKET** out) {
|
||||
if (!conn || !out)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
*out = NULL;
|
||||
|
||||
LWIP_PROVIDER_SOCKET* s = (LWIP_PROVIDER_SOCKET*)MmAllocatePool(sizeof(*s));
|
||||
if (!s)
|
||||
return STATUS_NO_MEMORY;
|
||||
return NTLSTATUS_NO_MEMORY;
|
||||
memset(s, 0, sizeof(*s));
|
||||
|
||||
KSTATUS st = KeSemaphoreCreate(1, 1, &s->Lock);
|
||||
@@ -430,7 +430,7 @@ static KSTATUS LwipSocketAllocateWithConn(uint32_t domain, uint32_t type, uint32
|
||||
netconn_set_recvtimeout(conn, 0);
|
||||
netconn_set_sendtimeout(conn, 0);
|
||||
*out = s;
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
@@ -452,13 +452,13 @@ static KSTATUS LwipSocketWaitRecvNetbuf(LWIP_PROVIDER_SOCKET* s,
|
||||
volatile uint8_t* cancelRequested,
|
||||
err_t* errOut) {
|
||||
if (!s || !s->Conn || !bufferOut || !errOut)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
*bufferOut = NULL;
|
||||
*errOut = ERR_OK;
|
||||
|
||||
if (!cancelRequested || s->NonBlocking) {
|
||||
*errOut = netconn_recv(s->Conn, bufferOut);
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
uint32_t originalTimeout = s->ReceiveTimeoutMs;
|
||||
@@ -466,7 +466,7 @@ static KSTATUS LwipSocketWaitRecvNetbuf(LWIP_PROVIDER_SOCKET* s,
|
||||
for (;;) {
|
||||
if (LwipSocketCancelRequested(cancelRequested)) {
|
||||
netconn_set_recvtimeout(s->Conn, originalTimeout);
|
||||
return STATUS_CANCELLED;
|
||||
return NTLSTATUS_CANCELLED;
|
||||
}
|
||||
|
||||
uint32_t remaining = 0;
|
||||
@@ -474,7 +474,7 @@ static KSTATUS LwipSocketWaitRecvNetbuf(LWIP_PROVIDER_SOCKET* s,
|
||||
if (elapsed >= originalTimeout) {
|
||||
netconn_set_recvtimeout(s->Conn, originalTimeout);
|
||||
*errOut = ERR_TIMEOUT;
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
remaining = originalTimeout - elapsed;
|
||||
}
|
||||
@@ -485,7 +485,7 @@ static KSTATUS LwipSocketWaitRecvNetbuf(LWIP_PROVIDER_SOCKET* s,
|
||||
if (err != ERR_TIMEOUT) {
|
||||
netconn_set_recvtimeout(s->Conn, originalTimeout);
|
||||
*errOut = err;
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
elapsed += slice;
|
||||
@@ -498,13 +498,13 @@ static KSTATUS LwipSocketWaitAccept(LWIP_PROVIDER_SOCKET* s,
|
||||
volatile uint8_t* cancelRequested,
|
||||
err_t* errOut) {
|
||||
if (!s || !s->Conn || !acceptedOut || !errOut)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
*acceptedOut = NULL;
|
||||
*errOut = ERR_OK;
|
||||
|
||||
if (!cancelRequested || s->NonBlocking) {
|
||||
*errOut = netconn_accept(s->Conn, acceptedOut);
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
uint32_t originalTimeout = s->ReceiveTimeoutMs;
|
||||
@@ -512,7 +512,7 @@ static KSTATUS LwipSocketWaitAccept(LWIP_PROVIDER_SOCKET* s,
|
||||
for (;;) {
|
||||
if (LwipSocketCancelRequested(cancelRequested)) {
|
||||
netconn_set_recvtimeout(s->Conn, originalTimeout);
|
||||
return STATUS_CANCELLED;
|
||||
return NTLSTATUS_CANCELLED;
|
||||
}
|
||||
|
||||
uint32_t remaining = 0;
|
||||
@@ -520,7 +520,7 @@ static KSTATUS LwipSocketWaitAccept(LWIP_PROVIDER_SOCKET* s,
|
||||
if (elapsed >= originalTimeout) {
|
||||
netconn_set_recvtimeout(s->Conn, originalTimeout);
|
||||
*errOut = ERR_TIMEOUT;
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
remaining = originalTimeout - elapsed;
|
||||
}
|
||||
@@ -531,7 +531,7 @@ static KSTATUS LwipSocketWaitAccept(LWIP_PROVIDER_SOCKET* s,
|
||||
if (err != ERR_TIMEOUT) {
|
||||
netconn_set_recvtimeout(s->Conn, originalTimeout);
|
||||
*errOut = err;
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
elapsed += slice;
|
||||
@@ -539,9 +539,9 @@ static KSTATUS LwipSocketWaitAccept(LWIP_PROVIDER_SOCKET* s,
|
||||
}
|
||||
|
||||
static int LwipSocketAddressValid(const SYS_SOCKET_ADDRESS_K* address, size_t addressSize) {
|
||||
if (!address || addressSize < sizeof(SYS_SOCKET_ADDRESS_K))
|
||||
if (!address || addressSize != sizeof(SYS_SOCKET_ADDRESS_K))
|
||||
return 0;
|
||||
if (address->Size < sizeof(SYS_SOCKET_ADDRESS_K))
|
||||
if (address->Size != sizeof(SYS_SOCKET_ADDRESS_K))
|
||||
return 0;
|
||||
return address->Family == SYS_AF_INET || address->Family == SYS_AF_INET6;
|
||||
}
|
||||
@@ -559,10 +559,10 @@ static int LwipSocketFamilyMatches(const LWIP_PROVIDER_SOCKET* s, const SYS_SOCK
|
||||
// Implements the socket Make Ip operation.
|
||||
static KSTATUS LwipSocketMakeIp(const SYS_SOCKET_ADDRESS_K* address, ip_addr_t* out) {
|
||||
if (!address || !out)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (address->Family == SYS_AF_INET) {
|
||||
IP_ADDR4(out, address->Address[0], address->Address[1], address->Address[2], address->Address[3]);
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
if (address->Family == SYS_AF_INET6) {
|
||||
uint32_t a0 = ((uint32_t)address->Address[0] << 24) | ((uint32_t)address->Address[1] << 16) |
|
||||
@@ -575,9 +575,9 @@ static KSTATUS LwipSocketMakeIp(const SYS_SOCKET_ADDRESS_K* address, ip_addr_t*
|
||||
((uint32_t)address->Address[14] << 8) | (uint32_t)address->Address[15];
|
||||
IP_ADDR6_HOST(out, a0, a1, a2, a3);
|
||||
ip6_addr_set_zone(ip_2_ip6(out), (u8_t)address->ScopeId);
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
return NTLSTATUS_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
// Implements the socket Fill Address operation.
|
||||
@@ -756,9 +756,9 @@ static void LwipInitDone(void* arg) {
|
||||
// Implements the stack Initialize operation.
|
||||
static KSTATUS LwipStackInitialize(const HAL_API* hal) {
|
||||
if (gLwipInitialized)
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
if (!hal || !hal->Timer.QueryTicks)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
LwipPortSetTimerQuery(hal->Timer.QueryTicks);
|
||||
|
||||
@@ -775,24 +775,24 @@ static KSTATUS LwipStackInitialize(const HAL_API* hal) {
|
||||
|
||||
gLwipInitialized = 1;
|
||||
DbgPrint("lwIP: tcpip thread initialized\n");
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Implements the provider Attach Device operation.
|
||||
static KSTATUS LwipProviderAttachDevice(NET_DEVICE* device) {
|
||||
if (!gLwipInitialized)
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
return NTLSTATUS_NOT_SUPPORTED;
|
||||
if (!device || device->Index >= LWIP_MAX_NETIFS)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (device->HardwareAddressLength != NET_ETHERNET_ADDRESS_LENGTH)
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
return NTLSTATUS_NOT_SUPPORTED;
|
||||
|
||||
if (gBindings[device->Index])
|
||||
return STATUS_ALREADY_EXISTS;
|
||||
return NTLSTATUS_ALREADY_EXISTS;
|
||||
|
||||
LWIP_BINDING* b = (LWIP_BINDING*)MmAllocatePool(sizeof(*b));
|
||||
if (!b)
|
||||
return STATUS_NO_MEMORY;
|
||||
return NTLSTATUS_NO_MEMORY;
|
||||
memset(b, 0, sizeof(*b));
|
||||
b->Device = device;
|
||||
|
||||
@@ -818,13 +818,13 @@ static KSTATUS LwipProviderAttachDevice(NET_DEVICE* device) {
|
||||
if (err == ERR_OK)
|
||||
st = KeWaitSemaphore(done);
|
||||
else
|
||||
st = STATUS_FAILURE;
|
||||
st = NTLSTATUS_FAILURE;
|
||||
|
||||
ObDereferenceObject(&done->Header);
|
||||
|
||||
if (!KSUCCESS(st) || ctx.Result != ERR_OK) {
|
||||
MmFreePool(b);
|
||||
return KSUCCESS(st) ? STATUS_FAILURE : st;
|
||||
return KSUCCESS(st) ? NTLSTATUS_FAILURE : st;
|
||||
}
|
||||
|
||||
gBindings[device->Index] = b;
|
||||
@@ -834,79 +834,79 @@ static KSTATUS LwipProviderAttachDevice(NET_DEVICE* device) {
|
||||
b->Config.Section,
|
||||
b->Config.UseDhcp ? "dhcp" : "static",
|
||||
b->Config.EnableIpv6 ? (b->Config.HasStaticIpv6 ? "static" : "auto") : "off");
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Implements the provider Receive Frame operation.
|
||||
static KSTATUS LwipProviderReceiveFrame(NET_DEVICE* device, const void* frame, size_t length) {
|
||||
if (!gLwipInitialized)
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
return NTLSTATUS_NOT_SUPPORTED;
|
||||
if (!device || device->Index >= LWIP_MAX_NETIFS || !frame)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
LWIP_BINDING* b = gBindings[device->Index];
|
||||
if (!b || !b->Attached)
|
||||
return STATUS_NOT_FOUND;
|
||||
return NTLSTATUS_NOT_FOUND;
|
||||
|
||||
if (length < NET_ETHERNET_HEADER_LENGTH || length > NET_ETHERNET_MAX_FRAME)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
struct pbuf* p = pbuf_alloc(PBUF_RAW, (u16_t)length, PBUF_POOL);
|
||||
if (!p)
|
||||
p = pbuf_alloc(PBUF_RAW, (u16_t)length, PBUF_RAM);
|
||||
if (!p)
|
||||
return STATUS_NO_MEMORY;
|
||||
return NTLSTATUS_NO_MEMORY;
|
||||
|
||||
if (pbuf_take(p, frame, (u16_t)length) != ERR_OK) {
|
||||
pbuf_free(p);
|
||||
return STATUS_BUFFER_TOO_SMALL;
|
||||
return NTLSTATUS_BUFFER_TOO_SMALL;
|
||||
}
|
||||
|
||||
err_t err = b->Netif.input(p, &b->Netif);
|
||||
if (err != ERR_OK) {
|
||||
pbuf_free(p);
|
||||
return STATUS_FAILURE;
|
||||
return NTLSTATUS_FAILURE;
|
||||
}
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Implements the provider Socket Create operation.
|
||||
static KSTATUS LwipProviderSocketCreate(uint32_t domain, uint32_t type, uint32_t protocol, void** outSocket) {
|
||||
if (!outSocket)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
*outSocket = NULL;
|
||||
|
||||
if (!gLwipInitialized)
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
return NTLSTATUS_NOT_SUPPORTED;
|
||||
if (domain != SYS_AF_INET && domain != SYS_AF_INET6)
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
return NTLSTATUS_NOT_SUPPORTED;
|
||||
|
||||
int ipv6 = domain == SYS_AF_INET6;
|
||||
enum netconn_type netconnType;
|
||||
u8_t rawProtocol = 0;
|
||||
if (type == SYS_SOCK_STREAM) {
|
||||
if (protocol != 0 && protocol != SYS_IPPROTO_TCP)
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
return NTLSTATUS_NOT_SUPPORTED;
|
||||
netconnType = ipv6 ? NETCONN_TCP_IPV6 : NETCONN_TCP;
|
||||
protocol = SYS_IPPROTO_TCP;
|
||||
} else if (type == SYS_SOCK_DGRAM) {
|
||||
if (protocol != 0 && protocol != SYS_IPPROTO_UDP)
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
return NTLSTATUS_NOT_SUPPORTED;
|
||||
netconnType = ipv6 ? NETCONN_UDP_IPV6 : NETCONN_UDP;
|
||||
protocol = SYS_IPPROTO_UDP;
|
||||
} else if (type == SYS_SOCK_RAW) {
|
||||
if ((!ipv6 && protocol != SYS_IPPROTO_ICMP) || (ipv6 && protocol != SYS_IPPROTO_ICMPV6))
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
return NTLSTATUS_NOT_SUPPORTED;
|
||||
netconnType = ipv6 ? NETCONN_RAW_IPV6 : NETCONN_RAW;
|
||||
rawProtocol = ipv6 ? IP6_NEXTH_ICMP6 : IP_PROTO_ICMP;
|
||||
} else {
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
return NTLSTATUS_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
struct netconn* conn = netconn_new_with_proto_and_callback(netconnType, rawProtocol, NULL);
|
||||
if (!conn)
|
||||
return STATUS_NO_MEMORY;
|
||||
return NTLSTATUS_NO_MEMORY;
|
||||
|
||||
LWIP_PROVIDER_SOCKET* s = NULL;
|
||||
KSTATUS st = LwipSocketAllocateWithConn(domain, type, protocol, conn, &s);
|
||||
@@ -916,7 +916,7 @@ static KSTATUS LwipProviderSocketCreate(uint32_t domain, uint32_t type, uint32_t
|
||||
}
|
||||
|
||||
*outSocket = s;
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Implements the provider Socket Close operation.
|
||||
@@ -950,13 +950,13 @@ static void LwipProviderSocketClose(void* socket) {
|
||||
static KSTATUS LwipProviderBind(void* socket, const SYS_SOCKET_ADDRESS_K* address, size_t addressSize) {
|
||||
LWIP_PROVIDER_SOCKET* s = (LWIP_PROVIDER_SOCKET*)socket;
|
||||
if (!s || !address)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (!LwipSocketAddressValid(address, addressSize))
|
||||
return STATUS_BUFFER_TOO_SMALL;
|
||||
return NTLSTATUS_BUFFER_TOO_SMALL;
|
||||
if ((s->Type != SYS_SOCK_STREAM && s->Type != SYS_SOCK_DGRAM) || !s->Conn)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (!LwipSocketFamilyMatches(s, address))
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
return NTLSTATUS_NOT_SUPPORTED;
|
||||
|
||||
KSTATUS st = LwipSocketLock(s);
|
||||
if (!KSUCCESS(st))
|
||||
@@ -964,7 +964,7 @@ static KSTATUS LwipProviderBind(void* socket, const SYS_SOCKET_ADDRESS_K* addres
|
||||
|
||||
if (s->Connected || s->Listening || s->ShutdownRead || s->ShutdownWrite) {
|
||||
LwipSocketUnlock(s);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
ip_addr_t ip;
|
||||
@@ -985,9 +985,9 @@ static KSTATUS LwipProviderBind(void* socket, const SYS_SOCKET_ADDRESS_K* addres
|
||||
static KSTATUS LwipProviderListen(void* socket, uint32_t backlog) {
|
||||
LWIP_PROVIDER_SOCKET* s = (LWIP_PROVIDER_SOCKET*)socket;
|
||||
if (!s)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (s->Type != SYS_SOCK_STREAM || !s->Conn)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (backlog > 255u)
|
||||
backlog = 255u;
|
||||
|
||||
@@ -997,7 +997,7 @@ static KSTATUS LwipProviderListen(void* socket, uint32_t backlog) {
|
||||
|
||||
if (s->Connected || s->ShutdownRead || s->ShutdownWrite) {
|
||||
LwipSocketUnlock(s);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
err_t err = netconn_listen_with_backlog(s->Conn, (u8_t)backlog);
|
||||
@@ -1014,13 +1014,13 @@ static KSTATUS LwipProviderListen(void* socket, uint32_t backlog) {
|
||||
static KSTATUS LwipProviderAccept(void* socket, void** acceptedOut, SYS_SOCKET_ADDRESS_K* remoteOut, volatile uint8_t* cancelRequested) {
|
||||
LWIP_PROVIDER_SOCKET* s = (LWIP_PROVIDER_SOCKET*)socket;
|
||||
if (!s || !acceptedOut)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
*acceptedOut = NULL;
|
||||
if (remoteOut)
|
||||
memset(remoteOut, 0, sizeof(*remoteOut));
|
||||
|
||||
if (s->Type != SYS_SOCK_STREAM || !s->Conn)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
KSTATUS st = LwipSocketLock(s);
|
||||
if (!KSUCCESS(st))
|
||||
@@ -1028,7 +1028,7 @@ static KSTATUS LwipProviderAccept(void* socket, void** acceptedOut, SYS_SOCKET_A
|
||||
|
||||
if (!s->Listening || s->ShutdownRead || s->ShutdownWrite) {
|
||||
LwipSocketUnlock(s);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
struct netconn* acceptedConn = NULL;
|
||||
@@ -1041,7 +1041,7 @@ static KSTATUS LwipProviderAccept(void* socket, void** acceptedOut, SYS_SOCKET_A
|
||||
if (err != ERR_OK)
|
||||
return LwipErrToStatus(err);
|
||||
if (!acceptedConn)
|
||||
return STATUS_FAILURE;
|
||||
return NTLSTATUS_FAILURE;
|
||||
|
||||
LWIP_PROVIDER_SOCKET* accepted = NULL;
|
||||
st = LwipSocketAllocateWithConn(s->Domain, s->Type, s->Protocol, acceptedConn, &accepted);
|
||||
@@ -1066,20 +1066,20 @@ static KSTATUS LwipProviderAccept(void* socket, void** acceptedOut, SYS_SOCKET_A
|
||||
}
|
||||
|
||||
*acceptedOut = accepted;
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Implements the provider Connect operation.
|
||||
static KSTATUS LwipProviderConnect(void* socket, const SYS_SOCKET_ADDRESS_K* address, size_t addressSize, volatile uint8_t* cancelRequested) {
|
||||
LWIP_PROVIDER_SOCKET* s = (LWIP_PROVIDER_SOCKET*)socket;
|
||||
if (!s || !address)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (!LwipSocketAddressValid(address, addressSize))
|
||||
return STATUS_BUFFER_TOO_SMALL;
|
||||
return NTLSTATUS_BUFFER_TOO_SMALL;
|
||||
if ((s->Type != SYS_SOCK_STREAM && s->Type != SYS_SOCK_DGRAM) || !s->Conn)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (!LwipSocketFamilyMatches(s, address))
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
return NTLSTATUS_NOT_SUPPORTED;
|
||||
|
||||
KSTATUS st = LwipSocketLock(s);
|
||||
if (!KSUCCESS(st))
|
||||
@@ -1087,11 +1087,11 @@ static KSTATUS LwipProviderConnect(void* socket, const SYS_SOCKET_ADDRESS_K* add
|
||||
|
||||
if (s->Listening) {
|
||||
LwipSocketUnlock(s);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
}
|
||||
if (s->ShutdownRead || s->ShutdownWrite) {
|
||||
LwipSocketUnlock(s);
|
||||
return STATUS_OBJECT_DEAD;
|
||||
return NTLSTATUS_OBJECT_DEAD;
|
||||
}
|
||||
|
||||
ip_addr_t ip;
|
||||
@@ -1117,7 +1117,7 @@ static KSTATUS LwipProviderConnect(void* socket, const SYS_SOCKET_ADDRESS_K* add
|
||||
netconn_set_nonblocking(s->Conn, wasNonBlocking || s->NonBlocking);
|
||||
s->Connected = 1;
|
||||
LwipSocketUnlock(s);
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
if (err != ERR_INPROGRESS) {
|
||||
netconn_set_nonblocking(s->Conn, wasNonBlocking || s->NonBlocking);
|
||||
@@ -1132,7 +1132,7 @@ static KSTATUS LwipProviderConnect(void* socket, const SYS_SOCKET_ADDRESS_K* add
|
||||
s->ShutdownWrite = 1;
|
||||
netconn_set_nonblocking(s->Conn, wasNonBlocking || s->NonBlocking);
|
||||
LwipSocketUnlock(s);
|
||||
return STATUS_CANCELLED;
|
||||
return NTLSTATUS_CANCELLED;
|
||||
}
|
||||
|
||||
if (s->Conn->state != NETCONN_CONNECT) {
|
||||
@@ -1141,7 +1141,7 @@ static KSTATUS LwipProviderConnect(void* socket, const SYS_SOCKET_ADDRESS_K* add
|
||||
if (err == ERR_OK) {
|
||||
s->Connected = 1;
|
||||
LwipSocketUnlock(s);
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
LwipSocketUnlock(s);
|
||||
return LwipErrToStatus(err);
|
||||
@@ -1161,15 +1161,15 @@ static KSTATUS LwipProviderSend(void* socket, const void* buffer, size_t length,
|
||||
if (sentOut)
|
||||
*sentOut = 0;
|
||||
if (!s || (!buffer && length))
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (flags != 0)
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
return NTLSTATUS_NOT_SUPPORTED;
|
||||
if (length > LWIP_PROVIDER_SOCKET_IO_MAX_BYTES)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (length == 0)
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
if (s->Type != SYS_SOCK_STREAM || !s->Conn)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
KSTATUS st = LwipSocketLock(s);
|
||||
if (!KSUCCESS(st))
|
||||
@@ -1177,11 +1177,11 @@ static KSTATUS LwipProviderSend(void* socket, const void* buffer, size_t length,
|
||||
|
||||
if (s->Listening) {
|
||||
LwipSocketUnlock(s);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
}
|
||||
if (s->ShutdownWrite) {
|
||||
LwipSocketUnlock(s);
|
||||
return STATUS_OBJECT_DEAD;
|
||||
return NTLSTATUS_OBJECT_DEAD;
|
||||
}
|
||||
|
||||
size_t written = 0;
|
||||
@@ -1236,7 +1236,7 @@ static KSTATUS LwipReceiveFromBuffered(LWIP_PROVIDER_SOCKET* s, uint8_t* out,
|
||||
|
||||
if (copiedOut)
|
||||
*copiedOut = copied;
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Implements the provider Receive operation.
|
||||
@@ -1245,15 +1245,15 @@ static KSTATUS LwipProviderReceive(void* socket, void* buffer, size_t length, ui
|
||||
if (receivedOut)
|
||||
*receivedOut = 0;
|
||||
if (!s || (!buffer && length))
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (flags != 0)
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
return NTLSTATUS_NOT_SUPPORTED;
|
||||
if (length > LWIP_PROVIDER_SOCKET_IO_MAX_BYTES)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (length == 0)
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
if (s->Type != SYS_SOCK_STREAM || !s->Conn)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
KSTATUS st = LwipSocketLock(s);
|
||||
if (!KSUCCESS(st))
|
||||
@@ -1261,11 +1261,11 @@ static KSTATUS LwipProviderReceive(void* socket, void* buffer, size_t length, ui
|
||||
|
||||
if (s->Listening) {
|
||||
LwipSocketUnlock(s);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
}
|
||||
if (s->ShutdownRead) {
|
||||
LwipSocketUnlock(s);
|
||||
return STATUS_OBJECT_DEAD;
|
||||
return NTLSTATUS_OBJECT_DEAD;
|
||||
}
|
||||
|
||||
size_t copied = 0;
|
||||
@@ -1288,7 +1288,7 @@ static KSTATUS LwipProviderReceive(void* socket, void* buffer, size_t length, ui
|
||||
if (receivedOut)
|
||||
*receivedOut = 0;
|
||||
LwipSocketUnlock(s);
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
if (err != ERR_OK) {
|
||||
LwipSocketUnlock(s);
|
||||
@@ -1308,7 +1308,7 @@ static KSTATUS LwipProviderReceive(void* socket, void* buffer, size_t length, ui
|
||||
*receivedOut = copied;
|
||||
|
||||
LwipSocketUnlock(s);
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static KSTATUS LwipProviderSendTo(void* socket, const void* buffer, size_t length, uint32_t flags,
|
||||
@@ -1317,21 +1317,21 @@ static KSTATUS LwipProviderSendTo(void* socket, const void* buffer, size_t lengt
|
||||
if (sentOut)
|
||||
*sentOut = 0;
|
||||
if (!s || (!buffer && length) || !remote)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (!LwipSocketAddressValid(remote, remoteSize))
|
||||
return STATUS_BUFFER_TOO_SMALL;
|
||||
return NTLSTATUS_BUFFER_TOO_SMALL;
|
||||
if (flags != 0)
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
return NTLSTATUS_NOT_SUPPORTED;
|
||||
if (s->Type == SYS_SOCK_DGRAM && length > LWIP_PROVIDER_SOCKET_UDP_MAX_BYTES)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (s->Type == SYS_SOCK_RAW && length > LWIP_PROVIDER_SOCKET_RAW_MAX_BYTES)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (!LwipSocketFamilyMatches(s, remote))
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
return NTLSTATUS_NOT_SUPPORTED;
|
||||
if (length == 0)
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
if ((s->Type != SYS_SOCK_DGRAM && s->Type != SYS_SOCK_RAW) || !s->Conn)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
KSTATUS st = LwipSocketLock(s);
|
||||
if (!KSUCCESS(st))
|
||||
@@ -1339,13 +1339,13 @@ static KSTATUS LwipProviderSendTo(void* socket, const void* buffer, size_t lengt
|
||||
|
||||
if (s->ShutdownWrite) {
|
||||
LwipSocketUnlock(s);
|
||||
return STATUS_OBJECT_DEAD;
|
||||
return NTLSTATUS_OBJECT_DEAD;
|
||||
}
|
||||
|
||||
struct netbuf* nb = netbuf_new();
|
||||
if (!nb) {
|
||||
LwipSocketUnlock(s);
|
||||
return STATUS_NO_MEMORY;
|
||||
return NTLSTATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
err_t err = netbuf_ref(nb, buffer, (u16_t)length);
|
||||
@@ -1372,17 +1372,17 @@ static KSTATUS LwipProviderReceiveFrom(void* socket, void* buffer, size_t length
|
||||
if (receivedOut)
|
||||
*receivedOut = 0;
|
||||
if (!s || (!buffer && length))
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (flags != 0)
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
return NTLSTATUS_NOT_SUPPORTED;
|
||||
if (s->Type == SYS_SOCK_DGRAM && length > LWIP_PROVIDER_SOCKET_UDP_MAX_BYTES)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (s->Type == SYS_SOCK_RAW && length > LWIP_PROVIDER_SOCKET_RAW_MAX_BYTES)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (length == 0)
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
if ((s->Type != SYS_SOCK_DGRAM && s->Type != SYS_SOCK_RAW) || !s->Conn)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
KSTATUS st = LwipSocketLock(s);
|
||||
if (!KSUCCESS(st))
|
||||
@@ -1390,7 +1390,7 @@ static KSTATUS LwipProviderReceiveFrom(void* socket, void* buffer, size_t length
|
||||
|
||||
if (s->ShutdownRead) {
|
||||
LwipSocketUnlock(s);
|
||||
return STATUS_OBJECT_DEAD;
|
||||
return NTLSTATUS_OBJECT_DEAD;
|
||||
}
|
||||
|
||||
struct netbuf* nb = NULL;
|
||||
@@ -1406,7 +1406,7 @@ static KSTATUS LwipProviderReceiveFrom(void* socket, void* buffer, size_t length
|
||||
}
|
||||
if (!nb) {
|
||||
LwipSocketUnlock(s);
|
||||
return STATUS_FAILURE;
|
||||
return NTLSTATUS_FAILURE;
|
||||
}
|
||||
|
||||
size_t copied = 0;
|
||||
@@ -1448,11 +1448,11 @@ static KSTATUS LwipProviderReceiveFrom(void* socket, void* buffer, size_t length
|
||||
static KSTATUS LwipProviderSetOption(void* socket, uint32_t option, const void* value, size_t valueSize) {
|
||||
LWIP_PROVIDER_SOCKET* s = (LWIP_PROVIDER_SOCKET*)socket;
|
||||
if (!s || !value)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (valueSize != sizeof(uint32_t))
|
||||
return STATUS_BUFFER_TOO_SMALL;
|
||||
return NTLSTATUS_BUFFER_TOO_SMALL;
|
||||
if (!s->Conn)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
uint32_t v = 0;
|
||||
memcpy(&v, value, sizeof(v));
|
||||
@@ -1476,11 +1476,11 @@ static KSTATUS LwipProviderSetOption(void* socket, uint32_t option, const void*
|
||||
break;
|
||||
default:
|
||||
LwipSocketUnlock(s);
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
return NTLSTATUS_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
LwipSocketUnlock(s);
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Implements the provider Get Option operation.
|
||||
@@ -1489,11 +1489,11 @@ static KSTATUS LwipProviderGetOption(void* socket, uint32_t option, void* value,
|
||||
if (actualSizeOut)
|
||||
*actualSizeOut = sizeof(uint32_t);
|
||||
if (!s || !value)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (valueSize < sizeof(uint32_t))
|
||||
return STATUS_BUFFER_TOO_SMALL;
|
||||
return NTLSTATUS_BUFFER_TOO_SMALL;
|
||||
if (!s->Conn)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
KSTATUS st = LwipSocketLock(s);
|
||||
if (!KSUCCESS(st))
|
||||
@@ -1512,19 +1512,19 @@ static KSTATUS LwipProviderGetOption(void* socket, uint32_t option, void* value,
|
||||
break;
|
||||
default:
|
||||
LwipSocketUnlock(s);
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
return NTLSTATUS_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
memcpy(value, &v, sizeof(v));
|
||||
LwipSocketUnlock(s);
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Implements the provider Poll operation.
|
||||
static KSTATUS LwipProviderPoll(void* socket, uint32_t events, uint32_t* returnedEventsOut) {
|
||||
LWIP_PROVIDER_SOCKET* s = (LWIP_PROVIDER_SOCKET*)socket;
|
||||
if (!s || !returnedEventsOut)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
uint32_t revents = 0;
|
||||
KSTATUS st = LwipSocketLock(s);
|
||||
@@ -1534,7 +1534,7 @@ static KSTATUS LwipProviderPoll(void* socket, uint32_t events, uint32_t* returne
|
||||
if (!s->Conn) {
|
||||
*returnedEventsOut = SYS_POLL_INVALID;
|
||||
LwipSocketUnlock(s);
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
err_t lastErr = netconn_err(s->Conn);
|
||||
@@ -1556,18 +1556,18 @@ static KSTATUS LwipProviderPoll(void* socket, uint32_t events, uint32_t* returne
|
||||
|
||||
*returnedEventsOut = revents;
|
||||
LwipSocketUnlock(s);
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Implements the provider Shutdown operation.
|
||||
static KSTATUS LwipProviderShutdown(void* socket, uint32_t how) {
|
||||
LWIP_PROVIDER_SOCKET* s = (LWIP_PROVIDER_SOCKET*)socket;
|
||||
if (!s)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (how != SYS_SHUTDOWN_READ && how != SYS_SHUTDOWN_WRITE && how != SYS_SHUTDOWN_BOTH)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (!s->Conn)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
KSTATUS st = LwipSocketLock(s);
|
||||
if (!KSUCCESS(st))
|
||||
@@ -1588,9 +1588,9 @@ static KSTATUS LwipProviderShutdown(void* socket, uint32_t how) {
|
||||
// Implements the provider Resolve Host operation.
|
||||
static KSTATUS LwipProviderResolveHost(const char* name, uint32_t family, SYS_SOCKET_ADDRESS_K* addressOut) {
|
||||
if (!name || !addressOut)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (!gLwipInitialized)
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
return NTLSTATUS_NOT_SUPPORTED;
|
||||
|
||||
u8_t dnsType;
|
||||
if (family == SYS_AF_INET)
|
||||
@@ -1598,7 +1598,7 @@ static KSTATUS LwipProviderResolveHost(const char* name, uint32_t family, SYS_SO
|
||||
else if (family == SYS_AF_INET6)
|
||||
dnsType = NETCONN_DNS_IPV6;
|
||||
else
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
return NTLSTATUS_NOT_SUPPORTED;
|
||||
|
||||
ip_addr_t resolved;
|
||||
err_t err = netconn_gethostbyname_addrtype(name, &resolved, dnsType);
|
||||
@@ -1606,17 +1606,17 @@ static KSTATUS LwipProviderResolveHost(const char* name, uint32_t family, SYS_SO
|
||||
return LwipErrToStatus(err);
|
||||
if ((family == SYS_AF_INET && !IP_IS_V4(&resolved)) ||
|
||||
(family == SYS_AF_INET6 && !IP_IS_V6(&resolved)))
|
||||
return STATUS_NOT_FOUND;
|
||||
return NTLSTATUS_NOT_FOUND;
|
||||
|
||||
LwipSocketFillAddress(addressOut, &resolved, 0);
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
// Dispatches a provider-private socket request carried by an IRP.
|
||||
static KSTATUS LwipDispatchSocketRequest(NET_SOCKET_IRP_REQUEST* request) {
|
||||
if (!request || request->Size != sizeof(*request))
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
switch (request->Operation) {
|
||||
case NetSocketIrpCreate:
|
||||
@@ -1626,7 +1626,7 @@ static KSTATUS LwipDispatchSocketRequest(NET_SOCKET_IRP_REQUEST* request) {
|
||||
request->u.Create.ProviderSocketOut);
|
||||
case NetSocketIrpClose:
|
||||
LwipProviderSocketClose(request->u.Close.Socket);
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
case NetSocketIrpBind:
|
||||
return LwipProviderBind(request->u.Bind.Socket,
|
||||
request->u.Bind.Address,
|
||||
@@ -1696,7 +1696,7 @@ static KSTATUS LwipDispatchSocketRequest(NET_SOCKET_IRP_REQUEST* request) {
|
||||
request->u.ResolveHost.Family,
|
||||
request->u.ResolveHost.AddressOut);
|
||||
default:
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1705,11 +1705,11 @@ static KSTATUS LwipDispatchInternalDeviceControl(DEVICE_OBJECT* device, IRP* irp
|
||||
(void)device;
|
||||
IO_STACK_LOCATION* ios = IoGetCurrentIrpStackLocation(irp);
|
||||
if (!ios)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (ios->Parameters.DeviceIoControl.IoControlCode != NET_IOCTL_SOCKET)
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
return NTLSTATUS_NOT_SUPPORTED;
|
||||
if (ios->Parameters.DeviceIoControl.InputLength < sizeof(NET_SOCKET_IRP_REQUEST))
|
||||
return STATUS_BUFFER_TOO_SMALL;
|
||||
return NTLSTATUS_BUFFER_TOO_SMALL;
|
||||
|
||||
NET_SOCKET_IRP_REQUEST* request = (NET_SOCKET_IRP_REQUEST*)ios->Parameters.DeviceIoControl.InputBuffer;
|
||||
return LwipDispatchSocketRequest(request);
|
||||
@@ -1757,5 +1757,5 @@ KSTATUS DriverEntry(const HAL_API* hal) {
|
||||
}
|
||||
|
||||
DbgPrint("lwIP: driver initialized\n");
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
Reference in new issue
Block a user