VOID
TCPFinEventHandler(void *arg, err_t err)
{
- PCONNECTION_ENDPOINT Connection = arg;
+ PCONNECTION_ENDPOINT Connection = (PCONNECTION_ENDPOINT)arg;
+
+ DbgPrint("[IP, TCPFinEventHandler] Called for Connection( 0x%x )-> SocketContext = pcb (0x%x)\n", Connection, Connection->SocketContext);
/* Only clear the pointer if the shutdown was caused by an error */
if (err != ERR_OK)
{
/* We're already closed by the error so we don't want to call lwip_close */
+ DbgPrint("[IP, TCPFinEventHandler] MAKING Connection( 0x%x )-> SocketContext = pcb (0x%x) NULL\n", Connection, Connection->SocketContext);
Connection->SocketContext = NULL;
}
-
- DbgPrint("[IP, TCPFinEventHandler] Called for Connection( 0x%x )-> SocketContext = pcb (0x%x)\n", Connection, Connection->SocketContext);
FlushAllQueues(Connection, TCPTranslateError(err));
+
+ DbgPrint("[IP, TCPFinEventHandler] Done\n");
}
VOID
TCPAcceptEventHandler(void *arg, struct tcp_pcb *newpcb)
{
- PCONNECTION_ENDPOINT Connection = arg;
+ PCONNECTION_ENDPOINT Connection = (PCONNECTION_ENDPOINT)arg;
PTDI_BUCKET Bucket;
PLIST_ENTRY Entry;
PIRP Irp;
NTSTATUS Status;
KIRQL OldIrql;
- struct tcp_pcb* OldSocketContext;
DbgPrint("[IP, TCPAcceptEventHandler] Called\n");
LockObject(Bucket->AssociatedEndpoint, &OldIrql);
+ /* sanity assert...this should never be in anything else but a CLOSED state */
+ ASSERT(((struct tcp_pcb*)Bucket->AssociatedEndpoint->SocketContext)->state == CLOSED);
+
+ /* free socket context created in FileOpenConnection, as we're using a new one */
+ LibTCPClose(Bucket->AssociatedEndpoint, TRUE);
+
/* free previously created socket context (we don't use it, we use newpcb) */
- OldSocketContext = Bucket->AssociatedEndpoint->SocketContext;
Bucket->AssociatedEndpoint->SocketContext = newpcb;
- LibTCPAccept(newpcb,
- (struct tcp_pcb*)Connection->SocketContext,
- Bucket->AssociatedEndpoint);
+ LibTCPAccept(newpcb, (PTCP_PCB)Connection->SocketContext, Bucket->AssociatedEndpoint);
DbgPrint("[IP, TCPAcceptEventHandler] Trying to unlock Bucket->AssociatedEndpoint\n");
UnlockObject(Bucket->AssociatedEndpoint, OldIrql);
-
- /* sanity assert...this should never be in anything else but a CLOSED state */
- ASSERT(((struct tcp_pcb*)OldSocketContext)->state == CLOSED);
-
- /* free socket context created in FileOpenConnection, as we're using a new one */
- LibTCPClose(OldSocketContext, TRUE);
}
DereferenceObject(Bucket->AssociatedEndpoint);
("Connection->SocketContext: %x\n",
Connection->SocketContext));
- Status = TCPTranslateError(LibTCPSend(Connection->SocketContext,
+ Status = TCPTranslateError(LibTCPSend(Connection,
SendBuffer,
SendLen, TRUE));
VOID
TCPConnectEventHandler(void *arg, err_t err)
{
- PCONNECTION_ENDPOINT Connection = arg;
+ PCONNECTION_ENDPOINT Connection = (PCONNECTION_ENDPOINT)arg;
PTDI_BUCKET Bucket;
PLIST_ENTRY Entry;
KEVENT Event;
/* Input */
- struct tcp_pcb *Pcb;
+ PCONNECTION_ENDPOINT Connection;
struct ip_addr *IpAddress;
u16_t Port;
ASSERT(msg);
- msg->Error = tcp_bind(msg->Pcb, msg->IpAddress, ntohs(msg->Port));
+ msg->Error = tcp_bind((PTCP_PCB)msg->Connection->SocketContext,
+ msg->IpAddress,
+ ntohs(msg->Port));
KeSetEvent(&msg->Event, IO_NO_INCREMENT, FALSE);
}
err_t
-LibTCPBind(struct tcp_pcb *pcb, struct ip_addr *const ipaddr, const u16_t port)
+LibTCPBind(PCONNECTION_ENDPOINT Connection, struct ip_addr *const ipaddr, const u16_t port)
{
struct bind_callback_msg *msg;
err_t ret;
- if (!pcb)
+ if (!Connection->SocketContext)
return ERR_CLSD;
DbgPrint("[lwIP, LibTCPBind] Called\n");
if (msg)
{
KeInitializeEvent(&msg->Event, NotificationEvent, FALSE);
- msg->Pcb = pcb;
+ msg->Connection = Connection;
msg->IpAddress = ipaddr;
msg->Port = port;
else
ret = ERR_CLSD;
- DbgPrint("[lwIP, LibTCPBind] pcb = 0x%x\n", pcb);
+ DbgPrint("[lwIP, LibTCPBind] pcb = 0x%x\n", Connection->SocketContext);
DbgPrint("[lwIP, LibTCPBind] Done\n");
KEVENT Event;
/* Input */
- struct tcp_pcb *Pcb;
+ PCONNECTION_ENDPOINT Connection;
u8_t Backlog;
/* Output */
- struct tcp_pcb *NewPcb;
+ PTCP_PCB NewPcb;
};
static
DbgPrint("[lwIP, LibTCPListenCallback] Called\n");
- msg->NewPcb = tcp_listen_with_backlog(msg->Pcb, msg->Backlog);
+ msg->NewPcb = tcp_listen_with_backlog((PTCP_PCB)msg->Connection->SocketContext, msg->Backlog);
if (msg->NewPcb)
{
KeSetEvent(&msg->Event, IO_NO_INCREMENT, FALSE);
}
-struct tcp_pcb *
-LibTCPListen(struct tcp_pcb *pcb, const u8_t backlog)
+PTCP_PCB
+LibTCPListen(PCONNECTION_ENDPOINT Connection, const u8_t backlog)
{
struct listen_callback_msg *msg;
- void *ret;
+ PTCP_PCB ret;
- DbgPrint("[lwIP, LibTCPListen] Called on pcb = 0x%x\n", pcb);
+ DbgPrint("[lwIP, LibTCPListen] Called on pcb = 0x%x\n", Connection->SocketContext);
- if (!pcb)
+ if (!Connection->SocketContext)
return NULL;
msg = ExAllocatePool(NonPagedPool, sizeof(struct listen_callback_msg));
if (msg)
{
KeInitializeEvent(&msg->Event, NotificationEvent, FALSE);
- msg->Pcb = pcb;
+ msg->Connection = Connection;
msg->Backlog = backlog;
tcpip_callback_with_block(LibTCPListenCallback, msg, 1);
ret = NULL;
DbgPrint("[lwIP, LibTCPListen] pcb = 0x%x, newpcb = 0x%x, sizeof(pcb) = %d \n",
- pcb, ret, sizeof(struct tcp_pcb));
+ Connection->SocketContext, ret, sizeof(struct tcp_pcb));
DbgPrint("[lwIP, LibTCPListen] Done\n");
KEVENT Event;
/* Input */
- struct tcp_pcb *Pcb;
+ PCONNECTION_ENDPOINT Connection;
void *Data;
u16_t DataLength;
ASSERT(msg);
- if (tcp_sndbuf(msg->Pcb) < msg->DataLength)
+ if (tcp_sndbuf((PTCP_PCB)msg->Connection->SocketContext) < msg->DataLength)
{
msg->Error = ERR_INPROGRESS;
}
else
{
- msg->Error = tcp_write(msg->Pcb, msg->Data, msg->DataLength, TCP_WRITE_FLAG_COPY);
+ msg->Error = tcp_write((PTCP_PCB)msg->Connection->SocketContext,
+ msg->Data,
+ msg->DataLength,
+ TCP_WRITE_FLAG_COPY);
- tcp_output(msg->Pcb);
+ tcp_output((PTCP_PCB)msg->Connection->SocketContext);
}
KeSetEvent(&msg->Event, IO_NO_INCREMENT, FALSE);
}
err_t
-LibTCPSend(struct tcp_pcb *pcb, void *const dataptr, const u16_t len, const int safe)
+LibTCPSend(PCONNECTION_ENDPOINT Connection, void *const dataptr, const u16_t len, const int safe)
{
err_t ret;
- if (!pcb)
+ if (!Connection->SocketContext)
return ERR_CLSD;
/*
*/
if (safe)
{
- if (tcp_sndbuf(pcb) < len)
+ if (tcp_sndbuf((PTCP_PCB)Connection->SocketContext) < len)
{
ret = ERR_INPROGRESS;
}
else
{
- ret = tcp_write(pcb, dataptr, len, TCP_WRITE_FLAG_COPY);
- tcp_output(pcb);
+ ret = tcp_write((PTCP_PCB)Connection->SocketContext, dataptr, len, TCP_WRITE_FLAG_COPY);
+ tcp_output((PTCP_PCB)Connection->SocketContext);
}
return ret;
if (msg)
{
KeInitializeEvent(&msg->Event, NotificationEvent, FALSE);
- msg->Pcb = pcb;
+ msg->Connection = Connection;
msg->Data = dataptr;
msg->DataLength = len;
else
ret = ERR_CLSD;
- DbgPrint("[lwIP, LibTCPSend] pcb = 0x%x\n", pcb);
+ DbgPrint("[lwIP, LibTCPSend] pcb = 0x%x\n", Connection->SocketContext);
ExFreePool(msg);
KEVENT Event;
/* Input */
- struct tcp_pcb *Pcb;
+ PCONNECTION_ENDPOINT Connection;
struct ip_addr *IpAddress;
u16_t Port;
ASSERT(arg);
- tcp_recv(msg->Pcb, InternalRecvEventHandler);
- tcp_sent(msg->Pcb, InternalSendEventHandler);
+ tcp_recv((PTCP_PCB)msg->Connection->SocketContext, InternalRecvEventHandler);
+ tcp_sent((PTCP_PCB)msg->Connection->SocketContext, InternalSendEventHandler);
+
+ err_t Error = tcp_connect((PTCP_PCB)msg->Connection->SocketContext,
+ msg->IpAddress, ntohs(msg->Port),
+ InternalConnectEventHandler);
- err_t Error = tcp_connect(msg->Pcb, msg->IpAddress, ntohs(msg->Port), InternalConnectEventHandler);
msg->Error = Error == ERR_OK ? ERR_INPROGRESS : Error;
KeSetEvent(&msg->Event, IO_NO_INCREMENT, FALSE);
}
err_t
-LibTCPConnect(struct tcp_pcb *pcb, struct ip_addr *const ipaddr, const u16_t port)
+LibTCPConnect(PCONNECTION_ENDPOINT Connection, struct ip_addr *const ipaddr, const u16_t port)
{
struct connect_callback_msg *msg;
err_t ret;
DbgPrint("[lwIP, LibTCPConnect] Called\n");
- if (!pcb)
+ if (!Connection->SocketContext)
return ERR_CLSD;
msg = ExAllocatePool(NonPagedPool, sizeof(struct connect_callback_msg));
if (msg)
{
KeInitializeEvent(&msg->Event, NotificationEvent, FALSE);
- msg->Pcb = pcb;
+ msg->Connection = Connection;
msg->IpAddress = ipaddr;
msg->Port = port;
ExFreePool(msg);
- DbgPrint("[lwIP, LibTCPConnect] pcb = 0x%x\n", pcb);
+ DbgPrint("[lwIP, LibTCPConnect] pcb = 0x%x\n", Connection->SocketContext);
DbgPrint("[lwIP, LibTCPConnect] Done\n");
KEVENT Event;
/* Input */
- struct tcp_pcb *Pcb;
+ PCONNECTION_ENDPOINT Connection;
int shut_rx;
int shut_tx;
it means lwIP will take care of it anyway and if it does so before us it will
cause memory corruption.
*/
- if ((msg->Pcb->state == ESTABLISHED) || (msg->Pcb->state == SYN_RCVD))
+ if ((((PTCP_PCB)msg->Connection->SocketContext)->state == ESTABLISHED) ||
+ (((PTCP_PCB)msg->Connection->SocketContext)->state == SYN_RCVD))
{
- msg->Error = tcp_shutdown(msg->Pcb, msg->shut_rx, msg->shut_tx);
+ msg->Error =
+ tcp_shutdown((PTCP_PCB)msg->Connection->SocketContext,
+ msg->shut_rx, msg->shut_tx);
}
else
msg->Error = ERR_OK;
}
err_t
-LibTCPShutdown(struct tcp_pcb *pcb, const int shut_rx, const int shut_tx)
+LibTCPShutdown(PCONNECTION_ENDPOINT Connection, const int shut_rx, const int shut_tx)
{
struct shutdown_callback_msg *msg;
err_t ret;
- DbgPrint("[lwIP, LibTCPShutdown] Called on pcb = 0x%x, rx = %d, tx = %d\n", pcb, shut_rx, shut_tx);
+ DbgPrint("[lwIP, LibTCPShutdown] Called on pcb = 0x%x, rx = %d, tx = %d\n",
+ Connection->SocketContext, shut_rx, shut_tx);
- if (!pcb)
+ if (!Connection->SocketContext)
{
DbgPrint("[lwIP, LibTCPShutdown] Done... NO pcb\n");
return ERR_CLSD;
}
- DbgPrint("[lwIP, LibTCPShutdown] pcb->state = %s\n", tcp_state_str[pcb->state]);
+ DbgPrint("[lwIP, LibTCPShutdown] pcb->state = %s\n",
+ tcp_state_str[((PTCP_PCB)Connection->SocketContext)->state]);
msg = ExAllocatePool(NonPagedPool, sizeof(struct shutdown_callback_msg));
if (msg)
{
KeInitializeEvent(&msg->Event, NotificationEvent, FALSE);
- msg->Pcb = pcb;
+ msg->Connection = Connection;
msg->shut_rx = shut_rx;
msg->shut_tx = shut_tx;
KEVENT Event;
/* Input */
- struct tcp_pcb *Pcb;
+ PCONNECTION_ENDPOINT Connection;
/* Output */
err_t Error;
};
+static
+void
+CloseCallbacks(struct tcp_pcb *pcb)
+{
+ tcp_arg(pcb, NULL);
+ /*
+ if this pcb is not in LISTEN state than it has
+ valid recv, send and err callbacks to cancel
+ */
+ if (pcb->state != LISTEN)
+ {
+ tcp_recv(pcb, NULL);
+ //tcp_sent(pcb, NULL);
+ //tcp_err(pcb, NULL);
+ }
+
+ tcp_accept(pcb, NULL);
+}
+
static
void
LibTCPCloseCallback(void *arg)
{
struct close_callback_msg *msg = arg;
-
- if (msg->Pcb->state == CLOSED)
+
+ DbgPrint("[lwIP, LibTCPCloseCallback] pcb = 0x%x\n", (PTCP_PCB)msg->Connection->SocketContext);
+
+ if (!msg->Connection->SocketContext)
{
- DbgPrint("[lwIP, LibTCPCloseCallback] Connection was closed on us\n");
+ DbgPrint("[lwIP, LibTCPCloseCallback] NULL pcb...bail, bail!!!\n");
+
+ ASSERT(FALSE);
+
msg->Error = ERR_OK;
+ return;
}
- if (msg->Pcb->state == LISTEN)
+ CloseCallbacks((PTCP_PCB)msg->Connection->SocketContext);
+
+ if (((PTCP_PCB)msg->Connection->SocketContext)->state == LISTEN)
{
DbgPrint("[lwIP, LibTCPCloseCallback] Closing a listener\n");
- msg->Error = tcp_close(msg->Pcb);
+ msg->Error = tcp_close((PTCP_PCB)msg->Connection->SocketContext);
}
else
{
DbgPrint("[lwIP, LibTCPCloseCallback] Aborting a connection\n");
- tcp_abort(msg->Pcb);
+ tcp_abort((PTCP_PCB)msg->Connection->SocketContext);
msg->Error = ERR_OK;
}
}
err_t
-//LibTCPClose(struct tcp_pcb *pcb, const int safe)
-LibTCPClose(struct tcp_pcb *pcb, const int safe)
+LibTCPClose(PCONNECTION_ENDPOINT Connection, const int safe)
{
err_t ret;
- DbgPrint("[lwIP, LibTCPClose] Called on pcb = 0x%x\n", pcb);
+ DbgPrint("[lwIP, LibTCPClose] Called on pcb = 0x%x\n", Connection->SocketContext);
- if (!pcb)
+ if (!Connection->SocketContext)
{
DbgPrint("[lwIP, LibTCPClose] Done... NO pcb\n");
return ERR_CLSD;
}
- DbgPrint("[lwIP, LibTCPClose] pcb->state = %s\n", tcp_state_str[pcb->state]);
-
- tcp_arg(pcb, NULL);
-
- /*
- if this pcb is not in LISTEN state than it has
- valid recv, send and err callbacks to cancel
- */
- if (pcb->state != LISTEN)
- {
- tcp_recv(pcb, NULL);
- //tcp_sent(pcb, NULL);
- //tcp_err(pcb, NULL);
- }
-
- tcp_accept(pcb, NULL);
+ DbgPrint("[lwIP, LibTCPClose] pcb->state = %s\n",
+ tcp_state_str[((PTCP_PCB)Connection->SocketContext)->state]);
/*
If we're being called from a handler it means we're in the conetxt of teh tcpip
*/
if (safe)
{
- if (pcb->state == LISTEN)
+ CloseCallbacks((PTCP_PCB)Connection->SocketContext);
+ if ( ((PTCP_PCB)Connection->SocketContext)->state == LISTEN )
{
DbgPrint("[lwIP, LibTCPClose] Closing a listener\n");
- ret = tcp_close(pcb);
+ ret = tcp_close((PTCP_PCB)Connection->SocketContext);
}
else
{
DbgPrint("[lwIP, LibTCPClose] Aborting a connection\n");
- tcp_abort(pcb);
+ tcp_abort((PTCP_PCB)Connection->SocketContext);
ret = ERR_OK;
}
{
KeInitializeEvent(&msg->Event, NotificationEvent, FALSE);
- msg->Pcb = pcb;
+ msg->Connection = Connection;
tcpip_callback_with_block(LibTCPCloseCallback, msg, 1);
}
void
-LibTCPAccept(struct tcp_pcb *pcb, struct tcp_pcb *listen_pcb, void *arg)
+LibTCPAccept(PTCP_PCB pcb, struct tcp_pcb *listen_pcb, void *arg)
{
DbgPrint("[lwIP, LibTCPAccept] Called. (pcb, arg) = (0x%x, 0x%x)\n", pcb, arg);
}
err_t
-LibTCPGetHostName(struct tcp_pcb *pcb, struct ip_addr *const ipaddr, u16_t *const port)
+LibTCPGetHostName(PTCP_PCB pcb, struct ip_addr *const ipaddr, u16_t *const port)
{
DbgPrint("[lwIP, LibTCPGetHostName] Called. pcb = (0x%x)\n", pcb);
}
err_t
-LibTCPGetPeerName(struct tcp_pcb *pcb, struct ip_addr * const ipaddr, u16_t * const port)
+LibTCPGetPeerName(PTCP_PCB pcb, struct ip_addr * const ipaddr, u16_t * const port)
{
DbgPrint("[lwIP, LibTCPGetPeerName] pcb = (0x%x)\n", pcb);