* tcp_header::urgent_offset must be set in network byte order as well.
* Cleanup. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25243 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -349,9 +349,11 @@ add_tcp_header(net_address_module_info *addressModule,
|
|||||||
buffer->protocol = IPPROTO_TCP;
|
buffer->protocol = IPPROTO_TCP;
|
||||||
|
|
||||||
uint8 optionsBuffer[kMaxOptionSize];
|
uint8 optionsBuffer[kMaxOptionSize];
|
||||||
uint32 optionsLength = add_options(segment, optionsBuffer, sizeof(optionsBuffer));
|
uint32 optionsLength = add_options(segment, optionsBuffer,
|
||||||
|
sizeof(optionsBuffer));
|
||||||
|
|
||||||
NetBufferPrepend<tcp_header> bufferHeader(buffer, sizeof(tcp_header) + optionsLength);
|
NetBufferPrepend<tcp_header> bufferHeader(buffer,
|
||||||
|
sizeof(tcp_header) + optionsLength);
|
||||||
if (bufferHeader.Status() != B_OK)
|
if (bufferHeader.Status() != B_OK)
|
||||||
return bufferHeader.Status();
|
return bufferHeader.Status();
|
||||||
|
|
||||||
@@ -367,17 +369,20 @@ add_tcp_header(net_address_module_info *addressModule,
|
|||||||
header.flags = segment.flags;
|
header.flags = segment.flags;
|
||||||
header.advertised_window = htons(segment.advertised_window);
|
header.advertised_window = htons(segment.advertised_window);
|
||||||
header.checksum = 0;
|
header.checksum = 0;
|
||||||
header.urgent_offset = segment.urgent_offset;
|
header.urgent_offset = htons(segment.urgent_offset);
|
||||||
|
|
||||||
// we must detach before calculating the checksum as we may
|
// we must detach before calculating the checksum as we may
|
||||||
// not have a contiguous buffer.
|
// not have a contiguous buffer.
|
||||||
bufferHeader.Sync();
|
bufferHeader.Sync();
|
||||||
|
|
||||||
if (optionsLength > 0)
|
if (optionsLength > 0) {
|
||||||
gBufferModule->write(buffer, sizeof(tcp_header), optionsBuffer, optionsLength);
|
gBufferModule->write(buffer, sizeof(tcp_header), optionsBuffer,
|
||||||
|
optionsLength);
|
||||||
|
}
|
||||||
|
|
||||||
TRACE(("add_tcp_header(): buffer %p, flags 0x%x, seq %lu, ack %lu, win %u\n", buffer,
|
TRACE(("add_tcp_header(): buffer %p, flags 0x%x, seq %lu, ack %lu, up %lu, "
|
||||||
segment.flags, segment.sequence, segment.acknowledge, segment.advertised_window));
|
"win %u\n", buffer, segment.flags, segment.sequence,
|
||||||
|
segment.acknowledge, segment.urgent_offset, segment.advertised_window));
|
||||||
|
|
||||||
*TCPChecksumField(buffer) = Checksum::PseudoHeader(addressModule,
|
*TCPChecksumField(buffer) = Checksum::PseudoHeader(addressModule,
|
||||||
gBufferModule, buffer, IPPROTO_TCP);
|
gBufferModule, buffer, IPPROTO_TCP);
|
||||||
@@ -729,15 +734,16 @@ tcp_init()
|
|||||||
if (status < B_OK)
|
if (status < B_OK)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
status = gStackModule->register_domain_protocols(AF_INET, SOCK_STREAM, IPPROTO_TCP,
|
status = gStackModule->register_domain_protocols(AF_INET, SOCK_STREAM,
|
||||||
|
IPPROTO_TCP,
|
||||||
"network/protocols/tcp/v1",
|
"network/protocols/tcp/v1",
|
||||||
"network/protocols/ipv4/v1",
|
"network/protocols/ipv4/v1",
|
||||||
NULL);
|
NULL);
|
||||||
if (status < B_OK)
|
if (status < B_OK)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
status = gStackModule->register_domain_receiving_protocol(AF_INET, IPPROTO_TCP,
|
status = gStackModule->register_domain_receiving_protocol(AF_INET,
|
||||||
"network/protocols/tcp/v1");
|
IPPROTO_TCP, "network/protocols/tcp/v1");
|
||||||
if (status < B_OK)
|
if (status < B_OK)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user