ISC_LIST(isc__socket_t) socklist;
int reserved; /* unlocked */
isc_condition_t shutdown_ok;
- int maxudp;
+ size_t maxudp;
};
struct isc__socketthread {
* Simulate a firewall blocking UDP responses bigger than
* 'maxudp' bytes.
*/
- if (sock->manager->maxudp != 0 && cc > sock->manager->maxudp)
+ if (sock->manager->maxudp != 0 &&
+ cc > (int)sock->manager->maxudp)
+ {
return (DOIO_SOFT);
+ }
}
socket_log(sock, &dev->address, IOEVENT,
resend:
if (sock->type == isc_sockettype_udp &&
sock->manager->maxudp != 0 &&
- write_count > (size_t)sock->manager->maxudp)
+ write_count > sock->manager->maxudp)
cc = write_count;
else
cc = sendmsg(sock->fd, &msghdr, 0);
}
void
-isc_socketmgr_maxudp(isc_socketmgr_t *manager0, int maxudp) {
+isc_socketmgr_maxudp(isc_socketmgr_t *manager0, unsigned int maxudp) {
isc__socketmgr_t *manager = (isc__socketmgr_t *)manager0;
REQUIRE(VALID_MANAGER(manager));
struct isc_socketmgr {
/* Not locked. */
- unsigned int magic;
- isc_mem_t *mctx;
- isc_mutex_t lock;
- isc_stats_t *stats;
+ unsigned int magic;
+ isc_mem_t *mctx;
+ isc_mutex_t lock;
+ isc_stats_t *stats;
/* Locked by manager lock. */
- ISC_LIST(isc_socket_t) socklist;
+ ISC_LIST(isc_socket_t) socklist;
bool bShutdown;
- isc_condition_t shutdown_ok;
- HANDLE hIoCompletionPort;
- int maxIOCPThreads;
- HANDLE hIOCPThreads[MAX_IOCPTHREADS];
- DWORD dwIOCPThreadIds[MAX_IOCPTHREADS];
+ isc_condition_t shutdown_ok;
+ HANDLE hIoCompletionPort;
+ int maxIOCPThreads;
+ HANDLE hIOCPThreads[MAX_IOCPTHREADS];
+ DWORD dwIOCPThreadIds[MAX_IOCPTHREADS];
+ size_t maxudp;
/*
* Debugging.
sock->recvbuf.from_addr_len);
if (isc_sockaddr_getport(&dev->address) == 0) {
if (isc_log_wouldlog(isc_lctx, IOEVENT_LEVEL)) {
- socket_log(__LINE__, sock, &dev->address, IOEVENT,
+ socket_log(__LINE__, sock, &dev->address,
+ IOEVENT,
"dropping source port zero packet");
}
sock->recvbuf.remaining = 0;
return;
}
+ /*
+ * Simulate a firewall blocking UDP responses bigger than
+ * 'maxudp' bytes.
+ */
+ if (sock->manager->maxudp != 0 &&
+ sock->recvbuf.remaining > sock->manager->maxudp)
+ {
+ sock->recvbuf.remaining = 0;
+ return;
+ }
} else if (sock->type == isc_sockettype_tcp) {
dev->address = sock->address;
}
int status;
struct msghdr *mh;
+ /*
+ * Simulate a firewall blocking UDP responses bigger than
+ * 'maxudp' bytes.
+ */
+ if (sock->type == isc_sockettype_udp &&
+ sock->manager->maxudp != 0 &&
+ dev->region.length - dev->n > sock->manager->maxudp)
+ {
+ *nbytes = dev->region.length - dev->n;
+ return (DOIO_SUCCESS);
+ }
+
lpo = (IoCompletionInfo *)HeapAlloc(hHeapHandle,
HEAP_ZERO_MEMORY,
sizeof(IoCompletionInfo));
"internal_recv: %d bytes received", nbytes);
/*
- * If we got here, the I/O operation succeeded. However, we might still have removed this
- * event from our notification list (or never placed it on it due to immediate completion.)
- * Handle the reference counting here, and handle the cancellation event just after.
+ * If we got here, the I/O operation succeeded. However, we might
+ * still have removed this event from our notification list (or never
+ * placed it on it due to immediate completion.)
+ * Handle the reference counting here, and handle the cancellation
+ * event just after.
*/
INSIST(sock->pending_iocp > 0);
sock->pending_iocp--;
sock->pending_recv--;
/*
- * The only way we could have gotten here is that our I/O has successfully completed.
- * Update our pointers, and move on. The only odd case here is that we might not
- * have received enough data on a TCP stream to satisfy the minimum requirements. If
- * this is the case, we will re-issue the recv() call for what we need.
+ * The only way we could have gotten here is that our I/O has
+ * successfully completed. Update our pointers, and move on.
+ * The only odd case here is that we might not have received
+ * enough data on a TCP stream to satisfy the minimum requirements.
+ * If this is the case, we will re-issue the recv() call for what
+ * we need.
*
- * We do check for a recv() of 0 bytes on a TCP stream. This means the remote end
- * has closed.
+ * We do check for a recv() of 0 bytes on a TCP stream. This
+ * means the remote end has closed.
*/
if (nbytes == 0 && sock->type == isc_sockettype_tcp) {
send_recvdone_abort(sock, ISC_R_EOF);
manager->bShutdown = false;
manager->totalSockets = 0;
manager->iocp_total = 0;
+ manager->maxudp = 0;
*managerp = manager;
return (result);
}
-/* Not implemented for win32 */
void
-isc_socketmgr_maxudp(isc_socketmgr_t *manager, int maxudp) {
- UNUSED(manager);
- UNUSED(maxudp);
+isc_socketmgr_maxudp(isc_socketmgr_t *manager, unsigned int maxudp) {
+
+ REQUIRE(VALID_MANAGER(manager));
+
+ manager->maxudp = maxudp;
}