An apparatus and method for an improved bulk read socket call are
provided. With the apparatus and method, a new field, so_rcvlen, is added
to the socket structure that identifies the bulk read size requested by
the user. The kernel of the prior art recv( ) function is also modified
so that it sets the so_rcvlen to the size requested by the user prior to
the recv( ) function going to sleep and waiting for the full data size
requested by the user. A new flag, SP_MSGWAITALL, is also provided in the
socket structure. In the TCP input processing, when data is received for
a particular socket, the current setting of the SP_MSGWAITALL is checked.
If the SP_MSGWAITALL flag is set, it is determined whether the amount of
data stored in the socket receive buffer is less than the value of
so_rcvlen. If not, the TCP input processing does not wake up the recv( )
thread. However, for every alternate segment, the TCP input processing
sends back an acknowledgment (ACK). In the TCP output processing, when
the SP_MSGWAITALL flag is set and the amount of data in the socket
receive buffer is less than so_rcvlen, the full window is advertised.
Once the TCP input processing determines that there is at least an amount
of data in the socket receive buffer equal to the value of so_rcvlen, the
TCP input processing will wake up the recv( ) thread and the
SP_MSGWAITALL flag is reset.