net_buffer: preparing for better metadata management
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21210 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -88,8 +88,8 @@ Checksum::PseudoHeader(net_address_module_info *addressModule,
|
|||||||
net_buffer_module_info *bufferModule, net_buffer *buffer, uint16 protocol)
|
net_buffer_module_info *bufferModule, net_buffer *buffer, uint16 protocol)
|
||||||
{
|
{
|
||||||
Checksum checksum;
|
Checksum checksum;
|
||||||
addressModule->checksum_address(&checksum, (sockaddr *)&buffer->source);
|
addressModule->checksum_address(&checksum, buffer->source);
|
||||||
addressModule->checksum_address(&checksum, (sockaddr *)&buffer->destination);
|
addressModule->checksum_address(&checksum, buffer->destination);
|
||||||
checksum << (uint16)htons(protocol) << (uint16)htons(buffer->size)
|
checksum << (uint16)htons(protocol) << (uint16)htons(buffer->size)
|
||||||
<< Checksum::BufferHelper(buffer, bufferModule);
|
<< Checksum::BufferHelper(buffer, bufferModule);
|
||||||
return checksum;
|
return checksum;
|
||||||
|
|||||||
@@ -19,8 +19,9 @@ typedef struct net_buffer {
|
|||||||
|
|
||||||
// TODO: we should think about moving the address fields into the buffer data itself
|
// TODO: we should think about moving the address fields into the buffer data itself
|
||||||
// via associated data or something like this. Or this structure as a whole, too...
|
// via associated data or something like this. Or this structure as a whole, too...
|
||||||
struct sockaddr_storage source;
|
|
||||||
struct sockaddr_storage destination;
|
struct sockaddr *source;
|
||||||
|
struct sockaddr *destination;
|
||||||
struct net_interface *interface;
|
struct net_interface *interface;
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
|
|||||||
@@ -241,7 +241,7 @@ arp_entry::MarkValid()
|
|||||||
|
|
||||||
TRACE((" ARP Dequeing packet %p...\n", buffer));
|
TRACE((" ARP Dequeing packet %p...\n", buffer));
|
||||||
|
|
||||||
memcpy(&buffer->destination, &hardware_address,
|
memcpy(buffer->destination, &hardware_address,
|
||||||
hardware_address.sdl_len);
|
hardware_address.sdl_len);
|
||||||
protocol->next->module->send_data(protocol->next, buffer);
|
protocol->next->module->send_data(protocol->next, buffer);
|
||||||
}
|
}
|
||||||
@@ -375,7 +375,7 @@ handle_arp_request(net_buffer *buffer, arp_header &header)
|
|||||||
BenaphoreLocker locker(sCacheLock);
|
BenaphoreLocker locker(sCacheLock);
|
||||||
|
|
||||||
if (!sIgnoreReplies) {
|
if (!sIgnoreReplies) {
|
||||||
arp_update_entry(header.protocol_sender, (sockaddr_dl *)&buffer->source, 0);
|
arp_update_entry(header.protocol_sender, (sockaddr_dl *)buffer->source, 0);
|
||||||
// remember the address of the sender as we might need it later
|
// remember the address of the sender as we might need it later
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -401,9 +401,9 @@ handle_arp_request(net_buffer *buffer, arp_header &header)
|
|||||||
header.protocol_sender = entry->protocol_address;
|
header.protocol_sender = entry->protocol_address;
|
||||||
|
|
||||||
// exchange source and destination address
|
// exchange source and destination address
|
||||||
memcpy(LLADDR((sockaddr_dl *)&buffer->source), header.hardware_sender,
|
memcpy(LLADDR((sockaddr_dl *)buffer->source), header.hardware_sender,
|
||||||
ETHER_ADDRESS_LENGTH);
|
ETHER_ADDRESS_LENGTH);
|
||||||
memcpy(LLADDR((sockaddr_dl *)&buffer->destination), header.hardware_target,
|
memcpy(LLADDR((sockaddr_dl *)buffer->destination), header.hardware_target,
|
||||||
ETHER_ADDRESS_LENGTH);
|
ETHER_ADDRESS_LENGTH);
|
||||||
|
|
||||||
buffer->flags = 0;
|
buffer->flags = 0;
|
||||||
@@ -420,7 +420,7 @@ handle_arp_reply(net_buffer *buffer, arp_header &header)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
BenaphoreLocker locker(sCacheLock);
|
BenaphoreLocker locker(sCacheLock);
|
||||||
arp_update_entry(header.protocol_sender, (sockaddr_dl *)&buffer->source, 0);
|
arp_update_entry(header.protocol_sender, (sockaddr_dl *)buffer->source, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -602,7 +602,7 @@ arp_start_resolve(net_datalink_protocol *protocol, in_addr_t address, arp_entry
|
|||||||
|
|
||||||
// prepare source and target addresses
|
// prepare source and target addresses
|
||||||
|
|
||||||
struct sockaddr_dl &source = *(struct sockaddr_dl *)&entry->request_buffer->source;
|
struct sockaddr_dl &source = *(struct sockaddr_dl *)entry->request_buffer->source;
|
||||||
source.sdl_len = sizeof(sockaddr_dl);
|
source.sdl_len = sizeof(sockaddr_dl);
|
||||||
source.sdl_family = AF_DLI;
|
source.sdl_family = AF_DLI;
|
||||||
source.sdl_index = device->index;
|
source.sdl_index = device->index;
|
||||||
@@ -807,26 +807,26 @@ arp_send_data(net_datalink_protocol *protocol,
|
|||||||
// TODO: this could be cached - the lookup isn't really needed at all
|
// TODO: this could be cached - the lookup isn't really needed at all
|
||||||
|
|
||||||
arp_entry *entry = arp_entry::Lookup(
|
arp_entry *entry = arp_entry::Lookup(
|
||||||
((struct sockaddr_in *)&buffer->source)->sin_addr.s_addr);
|
((struct sockaddr_in *)buffer->source)->sin_addr.s_addr);
|
||||||
if (entry == NULL)
|
if (entry == NULL)
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
|
|
||||||
memcpy(&buffer->source, &entry->hardware_address,
|
memcpy(buffer->source, &entry->hardware_address,
|
||||||
entry->hardware_address.sdl_len);
|
entry->hardware_address.sdl_len);
|
||||||
|
|
||||||
if (buffer->flags & MSG_MCAST) {
|
if (buffer->flags & MSG_MCAST) {
|
||||||
sockaddr_dl multicastDestination;
|
sockaddr_dl multicastDestination;
|
||||||
ipv4_to_ether_multicast(&multicastDestination,
|
ipv4_to_ether_multicast(&multicastDestination,
|
||||||
(sockaddr_in *)&buffer->destination);
|
(sockaddr_in *)buffer->destination);
|
||||||
memcpy(&buffer->destination, &multicastDestination,
|
memcpy(buffer->destination, &multicastDestination,
|
||||||
sizeof(multicastDestination));
|
sizeof(multicastDestination));
|
||||||
} else if ((buffer->flags & MSG_BCAST) == 0) {
|
} else if ((buffer->flags & MSG_BCAST) == 0) {
|
||||||
// Lookup destination (we may need to wait for this)
|
// Lookup destination (we may need to wait for this)
|
||||||
entry = arp_entry::Lookup(
|
entry = arp_entry::Lookup(
|
||||||
((struct sockaddr_in *)&buffer->destination)->sin_addr.s_addr);
|
((struct sockaddr_in *)buffer->destination)->sin_addr.s_addr);
|
||||||
if (entry == NULL) {
|
if (entry == NULL) {
|
||||||
status_t status = arp_start_resolve(protocol,
|
status_t status = arp_start_resolve(protocol,
|
||||||
((struct sockaddr_in *)&buffer->destination)->sin_addr.s_addr, &entry);
|
((struct sockaddr_in *)buffer->destination)->sin_addr.s_addr, &entry);
|
||||||
if (status < B_OK)
|
if (status < B_OK)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@@ -841,7 +841,7 @@ arp_send_data(net_datalink_protocol *protocol,
|
|||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(&buffer->destination, &entry->hardware_address,
|
memcpy(buffer->destination, &entry->hardware_address,
|
||||||
entry->hardware_address.sdl_len);
|
entry->hardware_address.sdl_len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,8 +45,8 @@ ethernet_deframe(net_device *device, net_buffer *buffer)
|
|||||||
ether_header &header = bufferHeader.Data();
|
ether_header &header = bufferHeader.Data();
|
||||||
uint16 type = ntohs(header.type);
|
uint16 type = ntohs(header.type);
|
||||||
|
|
||||||
struct sockaddr_dl &source = *(struct sockaddr_dl *)&buffer->source;
|
struct sockaddr_dl &source = *(struct sockaddr_dl *)buffer->source;
|
||||||
struct sockaddr_dl &destination = *(struct sockaddr_dl *)&buffer->destination;
|
struct sockaddr_dl &destination = *(struct sockaddr_dl *)buffer->destination;
|
||||||
|
|
||||||
source.sdl_len = sizeof(sockaddr_dl);
|
source.sdl_len = sizeof(sockaddr_dl);
|
||||||
source.sdl_family = AF_DLI;
|
source.sdl_family = AF_DLI;
|
||||||
@@ -119,8 +119,8 @@ status_t
|
|||||||
ethernet_frame_send_data(net_datalink_protocol *protocol,
|
ethernet_frame_send_data(net_datalink_protocol *protocol,
|
||||||
net_buffer *buffer)
|
net_buffer *buffer)
|
||||||
{
|
{
|
||||||
struct sockaddr_dl &source = *(struct sockaddr_dl *)&buffer->source;
|
struct sockaddr_dl &source = *(struct sockaddr_dl *)buffer->source;
|
||||||
struct sockaddr_dl &destination = *(struct sockaddr_dl *)&buffer->destination;
|
struct sockaddr_dl &destination = *(struct sockaddr_dl *)buffer->destination;
|
||||||
|
|
||||||
if (source.sdl_family != AF_DLI || source.sdl_type != IFT_ETHER)
|
if (source.sdl_family != AF_DLI || source.sdl_type != IFT_ETHER)
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
#include <KernelExport.h>
|
#include <KernelExport.h>
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
#include <net/if_types.h>
|
#include <net/if_types.h>
|
||||||
#include <net/if_media.h>
|
#include <net/if_media.h>
|
||||||
@@ -157,9 +158,8 @@ loopback_receive_data(net_device *_device, net_buffer **_buffer)
|
|||||||
if (status < B_OK)
|
if (status < B_OK)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
// switch network addresses before delivering
|
// swap network addresses before delivering
|
||||||
swap_memory(&buffer->source, &buffer->destination,
|
std::swap(buffer->source, buffer->destination);
|
||||||
max_c(buffer->source.ss_len, buffer->destination.ss_len));
|
|
||||||
|
|
||||||
*_buffer = buffer;
|
*_buffer = buffer;
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
#include <KernelExport.h>
|
#include <KernelExport.h>
|
||||||
#include <util/list.h>
|
#include <util/list.h>
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <new>
|
#include <new>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -254,7 +255,7 @@ icmp_receive_data(net_buffer *buffer)
|
|||||||
if (buffer->interface != NULL)
|
if (buffer->interface != NULL)
|
||||||
domain = buffer->interface->domain;
|
domain = buffer->interface->domain;
|
||||||
else
|
else
|
||||||
domain = sStackModule->get_domain(buffer->source.ss_family);
|
domain = sStackModule->get_domain(buffer->source->sa_family);
|
||||||
if (domain == NULL || domain->module == NULL)
|
if (domain == NULL || domain->module == NULL)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -262,9 +263,7 @@ icmp_receive_data(net_buffer *buffer)
|
|||||||
if (reply == NULL)
|
if (reply == NULL)
|
||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
|
|
||||||
// switch source/destination address
|
std::swap(reply->source, reply->destination);
|
||||||
memcpy(&reply->source, &buffer->destination, buffer->destination.ss_len);
|
|
||||||
memcpy(&reply->destination, &buffer->source, buffer->source.ss_len);
|
|
||||||
|
|
||||||
// There already is an ICMP header, and we'll reuse it
|
// There already is an ICMP header, and we'll reuse it
|
||||||
NetBufferHeaderReader<icmp_header> header(reply);
|
NetBufferHeaderReader<icmp_header> header(reply);
|
||||||
|
|||||||
@@ -646,7 +646,7 @@ deliver_multicast(net_protocol_module_info *module, net_buffer *buffer,
|
|||||||
|
|
||||||
BenaphoreLocker _(sMulticastGroupsLock);
|
BenaphoreLocker _(sMulticastGroupsLock);
|
||||||
|
|
||||||
sockaddr_in *multicastAddr = (sockaddr_in *)&buffer->destination;
|
sockaddr_in *multicastAddr = (sockaddr_in *)buffer->destination;
|
||||||
|
|
||||||
MulticastState::ValueIterator it = sMulticastState->Lookup(std::make_pair(
|
MulticastState::ValueIterator it = sMulticastState->Lookup(std::make_pair(
|
||||||
&multicastAddr->sin_addr, buffer->interface->index));
|
&multicastAddr->sin_addr, buffer->interface->index));
|
||||||
@@ -769,13 +769,14 @@ receiving_protocol(uint8 protocol)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static inline void
|
static inline sockaddr *
|
||||||
fill_sockaddr_in(sockaddr_in *target, in_addr_t address)
|
fill_sockaddr_in(sockaddr_in *target, in_addr_t address)
|
||||||
{
|
{
|
||||||
memset(target, 0, sizeof(sockaddr_in));
|
memset(target, 0, sizeof(sockaddr_in));
|
||||||
target->sin_family = AF_INET;
|
target->sin_family = AF_INET;
|
||||||
target->sin_len = sizeof(sockaddr_in);
|
target->sin_len = sizeof(sockaddr_in);
|
||||||
target->sin_addr.s_addr = address;
|
target->sin_addr.s_addr = address;
|
||||||
|
return (sockaddr *)target;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -867,13 +868,8 @@ static net_interface *
|
|||||||
get_multicast_interface(ipv4_protocol *protocol, const in_addr *address)
|
get_multicast_interface(ipv4_protocol *protocol, const in_addr *address)
|
||||||
{
|
{
|
||||||
sockaddr_in groupAddr;
|
sockaddr_in groupAddr;
|
||||||
memset(&groupAddr, 0, sizeof(groupAddr));
|
|
||||||
groupAddr.sin_family = AF_INET;
|
|
||||||
if (address)
|
|
||||||
groupAddr.sin_addr = *address;
|
|
||||||
|
|
||||||
net_route *route = sDatalinkModule->get_route(sDomain,
|
net_route *route = sDatalinkModule->get_route(sDomain,
|
||||||
(sockaddr *)&groupAddr);
|
fill_sockaddr_in(&groupAddr, address ? address->s_addr : INADDR_ANY));
|
||||||
if (route == NULL)
|
if (route == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@@ -891,10 +887,8 @@ ipv4_delta_membership(ipv4_protocol *protocol, int option,
|
|||||||
interface = get_multicast_interface(protocol, groupAddr);
|
interface = get_multicast_interface(protocol, groupAddr);
|
||||||
} else {
|
} else {
|
||||||
sockaddr_in address;
|
sockaddr_in address;
|
||||||
fill_sockaddr_in(&address, interfaceAddr->s_addr);
|
|
||||||
|
|
||||||
interface = sDatalinkModule->get_interface_with_address(sDomain,
|
interface = sDatalinkModule->get_interface_with_address(sDomain,
|
||||||
(sockaddr *)&address);
|
fill_sockaddr_in(&address, interfaceAddr->s_addr));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (interface == NULL)
|
if (interface == NULL)
|
||||||
@@ -1255,8 +1249,8 @@ ipv4_send_routed_data(net_protocol *_protocol, struct net_route *route,
|
|||||||
TRACE_SK(protocol, "SendRoutedData(%p, %p [%ld bytes])", route, buffer,
|
TRACE_SK(protocol, "SendRoutedData(%p, %p [%ld bytes])", route, buffer,
|
||||||
buffer->size);
|
buffer->size);
|
||||||
|
|
||||||
sockaddr_in &source = *(sockaddr_in *)&buffer->source;
|
sockaddr_in &source = *(sockaddr_in *)buffer->source;
|
||||||
sockaddr_in &destination = *(sockaddr_in *)&buffer->destination;
|
sockaddr_in &destination = *(sockaddr_in *)buffer->destination;
|
||||||
|
|
||||||
bool headerIncluded = false, checksumNeeded = true;
|
bool headerIncluded = false, checksumNeeded = true;
|
||||||
if (protocol != NULL)
|
if (protocol != NULL)
|
||||||
@@ -1348,8 +1342,8 @@ ipv4_send_data(net_protocol *_protocol, net_buffer *buffer)
|
|||||||
if (buffer->size < sizeof(ipv4_header))
|
if (buffer->size < sizeof(ipv4_header))
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
|
|
||||||
sockaddr_in *source = (sockaddr_in *)&buffer->source;
|
sockaddr_in *source = (sockaddr_in *)buffer->source;
|
||||||
sockaddr_in *destination = (sockaddr_in *)&buffer->destination;
|
sockaddr_in *destination = (sockaddr_in *)buffer->destination;
|
||||||
|
|
||||||
fill_sockaddr_in(source, *NetBufferField<in_addr_t,
|
fill_sockaddr_in(source, *NetBufferField<in_addr_t,
|
||||||
offsetof(ipv4_header, source)>(buffer));
|
offsetof(ipv4_header, source)>(buffer));
|
||||||
@@ -1445,8 +1439,8 @@ ipv4_receive_data(net_buffer *buffer)
|
|||||||
if (gBufferModule->checksum(buffer, 0, headerLength, true) != 0)
|
if (gBufferModule->checksum(buffer, 0, headerLength, true) != 0)
|
||||||
return B_BAD_DATA;
|
return B_BAD_DATA;
|
||||||
|
|
||||||
struct sockaddr_in &source = *(struct sockaddr_in *)&buffer->source;
|
struct sockaddr_in &source = *(struct sockaddr_in *)buffer->source;
|
||||||
struct sockaddr_in &destination = *(struct sockaddr_in *)&buffer->destination;
|
struct sockaddr_in &destination = *(struct sockaddr_in *)buffer->destination;
|
||||||
|
|
||||||
fill_sockaddr_in(&source, header.source);
|
fill_sockaddr_in(&source, header.source);
|
||||||
fill_sockaddr_in(&destination, header.destination);
|
fill_sockaddr_in(&destination, header.destination);
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ template<typename Addressing> bool
|
|||||||
MulticastGroupInterface<Addressing>::FilterAccepts(net_buffer *buffer) const
|
MulticastGroupInterface<Addressing>::FilterAccepts(net_buffer *buffer) const
|
||||||
{
|
{
|
||||||
bool has = fAddresses.Has(Addressing::AddressFromSockAddr(
|
bool has = fAddresses.Has(Addressing::AddressFromSockAddr(
|
||||||
(sockaddr *)&buffer->source));
|
buffer->source));
|
||||||
|
|
||||||
return (has && fFilterMode == kInclude)
|
return (has && fFilterMode == kInclude)
|
||||||
|| (!has && fFilterMode == kExclude);
|
|| (!has && fFilterMode == kExclude);
|
||||||
|
|||||||
@@ -386,10 +386,8 @@ EndpointManager::ReplyWithReset(tcp_segment_header &segment,
|
|||||||
if (reply == NULL)
|
if (reply == NULL)
|
||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
|
|
||||||
AddressModule()->set_to((sockaddr *)&reply->source,
|
AddressModule()->set_to(reply->source, buffer->destination);
|
||||||
(sockaddr *)&buffer->destination);
|
AddressModule()->set_to(reply->destination, buffer->source);
|
||||||
AddressModule()->set_to((sockaddr *)&reply->destination,
|
|
||||||
(sockaddr *)&buffer->source);
|
|
||||||
|
|
||||||
tcp_segment_header outSegment(TCP_FLAG_RESET);
|
tcp_segment_header outSegment(TCP_FLAG_RESET);
|
||||||
outSegment.sequence = 0;
|
outSegment.sequence = 0;
|
||||||
|
|||||||
@@ -48,7 +48,7 @@
|
|||||||
// Forward RTO-Recovery, RFC 4138
|
// Forward RTO-Recovery, RFC 4138
|
||||||
|
|
||||||
#define PrintAddress(address) \
|
#define PrintAddress(address) \
|
||||||
AddressString(Domain(), (const sockaddr *)(address), true).Data()
|
AddressString(Domain(), address, true).Data()
|
||||||
|
|
||||||
//#define TRACE_TCP
|
//#define TRACE_TCP
|
||||||
//#define PROBE_TCP
|
//#define PROBE_TCP
|
||||||
@@ -64,8 +64,8 @@
|
|||||||
#ifdef PROBE_TCP
|
#ifdef PROBE_TCP
|
||||||
# define PROBE(buffer, window) \
|
# define PROBE(buffer, window) \
|
||||||
dprintf("TCP PROBE %llu %s %s %ld %lu %lu %lu %lu %lu %lu %lu %lu %lu %llu\n", \
|
dprintf("TCP PROBE %llu %s %s %ld %lu %lu %lu %lu %lu %lu %lu %lu %lu %llu\n", \
|
||||||
system_time(), PrintAddress(&buffer->source), \
|
system_time(), PrintAddress(buffer->source), \
|
||||||
PrintAddress(&buffer->destination), buffer->size, (uint32)fSendNext, \
|
PrintAddress(buffer->destination), buffer->size, (uint32)fSendNext, \
|
||||||
(uint32)fSendUnacknowledged, fCongestionWindow, fSlowStartThreshold, \
|
(uint32)fSendUnacknowledged, fCongestionWindow, fSlowStartThreshold, \
|
||||||
window, fSendWindow, (uint32)(fSendMax - fSendUnacknowledged), \
|
window, fSendWindow, (uint32)(fSendMax - fSendUnacknowledged), \
|
||||||
fSendQueue.Available(fSendNext), fSendQueue.Used(), fRetransmitTimeout)
|
fSendQueue.Available(fSendNext), fSendQueue.Used(), fRetransmitTimeout)
|
||||||
@@ -852,8 +852,8 @@ TCPEndpoint::Spawn(TCPEndpoint *parent, tcp_segment_header &segment,
|
|||||||
fState = SYNCHRONIZE_RECEIVED;
|
fState = SYNCHRONIZE_RECEIVED;
|
||||||
fManager = parent->fManager;
|
fManager = parent->fManager;
|
||||||
|
|
||||||
LocalAddress().SetTo(&buffer->destination);
|
LocalAddress().SetTo(buffer->destination);
|
||||||
PeerAddress().SetTo(&buffer->source);
|
PeerAddress().SetTo(buffer->source);
|
||||||
|
|
||||||
TRACE("Spawn()");
|
TRACE("Spawn()");
|
||||||
|
|
||||||
@@ -958,8 +958,8 @@ TCPEndpoint::SegmentReceived(tcp_segment_header &segment, net_buffer *buffer)
|
|||||||
RecursiveLocker locker(fLock);
|
RecursiveLocker locker(fLock);
|
||||||
|
|
||||||
TRACE("SegmentReceived(): buffer %p (%lu bytes) address %s to %s",
|
TRACE("SegmentReceived(): buffer %p (%lu bytes) address %s to %s",
|
||||||
buffer, buffer->size, PrintAddress(&buffer->source),
|
buffer, buffer->size, PrintAddress(buffer->source),
|
||||||
PrintAddress(&buffer->destination));
|
PrintAddress(buffer->destination));
|
||||||
TRACE(" flags 0x%x, seq %lu, ack %lu, wnd %lu",
|
TRACE(" flags 0x%x, seq %lu, ack %lu, wnd %lu",
|
||||||
segment.flags, segment.sequence, segment.acknowledge,
|
segment.flags, segment.sequence, segment.acknowledge,
|
||||||
(uint32)segment.advertised_window << fSendWindowShift);
|
(uint32)segment.advertised_window << fSendWindowShift);
|
||||||
@@ -1241,15 +1241,15 @@ TCPEndpoint::_SendQueued(bool force, uint32 sendWindow)
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
LocalAddress().CopyTo(&buffer->source);
|
LocalAddress().CopyTo(buffer->source);
|
||||||
PeerAddress().CopyTo(&buffer->destination);
|
PeerAddress().CopyTo(buffer->destination);
|
||||||
|
|
||||||
uint32 size = buffer->size;
|
uint32 size = buffer->size;
|
||||||
segment.sequence = fSendNext;
|
segment.sequence = fSendNext;
|
||||||
|
|
||||||
TRACE("SendQueued(): buffer %p (%lu bytes) address %s to %s",
|
TRACE("SendQueued(): buffer %p (%lu bytes) address %s to %s",
|
||||||
buffer, buffer->size, PrintAddress(&buffer->source),
|
buffer, buffer->size, PrintAddress(buffer->source),
|
||||||
PrintAddress(&buffer->destination));
|
PrintAddress(buffer->destination));
|
||||||
TRACE(" flags 0x%x, seq %lu, ack %lu, rwnd %hu, cwnd %lu"
|
TRACE(" flags 0x%x, seq %lu, ack %lu, rwnd %hu, cwnd %lu"
|
||||||
", ssthresh %lu", segment.flags, segment.sequence,
|
", ssthresh %lu", segment.flags, segment.sequence,
|
||||||
segment.acknowledge, segment.advertised_window,
|
segment.acknowledge, segment.advertised_window,
|
||||||
|
|||||||
@@ -206,8 +206,8 @@ add_tcp_header(net_address_module_info *addressModule,
|
|||||||
|
|
||||||
tcp_header &header = bufferHeader.Data();
|
tcp_header &header = bufferHeader.Data();
|
||||||
|
|
||||||
header.source_port = addressModule->get_port((sockaddr *)&buffer->source);
|
header.source_port = addressModule->get_port(buffer->source);
|
||||||
header.destination_port = addressModule->get_port((sockaddr *)&buffer->destination);
|
header.destination_port = addressModule->get_port(buffer->destination);
|
||||||
header.sequence = htonl(segment.sequence);
|
header.sequence = htonl(segment.sequence);
|
||||||
header.acknowledge = (segment.flags & TCP_FLAG_ACKNOWLEDGE)
|
header.acknowledge = (segment.flags & TCP_FLAG_ACKNOWLEDGE)
|
||||||
? htonl(segment.acknowledge) : 0;
|
? htonl(segment.acknowledge) : 0;
|
||||||
@@ -614,13 +614,12 @@ tcp_receive_data(net_buffer *buffer)
|
|||||||
IPPROTO_TCP) != 0)
|
IPPROTO_TCP) != 0)
|
||||||
return B_BAD_DATA;
|
return B_BAD_DATA;
|
||||||
|
|
||||||
addressModule->set_port((sockaddr *)&buffer->source, header.source_port);
|
addressModule->set_port(buffer->source, header.source_port);
|
||||||
addressModule->set_port((sockaddr *)&buffer->destination,
|
addressModule->set_port(buffer->destination, header.destination_port);
|
||||||
header.destination_port);
|
|
||||||
|
|
||||||
TRACE((" Looking for: peer %s, local %s\n",
|
TRACE((" Looking for: peer %s, local %s\n",
|
||||||
AddressString(domain, (sockaddr *)&buffer->source, true).Data(),
|
AddressString(domain, buffer->source, true).Data(),
|
||||||
AddressString(domain, (sockaddr *)&buffer->destination, true).Data()));
|
AddressString(domain, buffer->destination, true).Data()));
|
||||||
//dump_tcp_header(header);
|
//dump_tcp_header(header);
|
||||||
//gBufferModule->dump(buffer);
|
//gBufferModule->dump(buffer);
|
||||||
|
|
||||||
@@ -643,7 +642,7 @@ tcp_receive_data(net_buffer *buffer)
|
|||||||
int32 segmentAction = DROP;
|
int32 segmentAction = DROP;
|
||||||
|
|
||||||
TCPEndpoint *endpoint = endpointManager->FindConnection(
|
TCPEndpoint *endpoint = endpointManager->FindConnection(
|
||||||
(sockaddr *)&buffer->destination, (sockaddr *)&buffer->source);
|
buffer->destination, buffer->source);
|
||||||
if (endpoint != NULL)
|
if (endpoint != NULL)
|
||||||
segmentAction = endpoint->SegmentReceived(segment, buffer);
|
segmentAction = endpoint->SegmentReceived(segment, buffer);
|
||||||
else if ((segment.flags & TCP_FLAG_RESET) == 0)
|
else if ((segment.flags & TCP_FLAG_RESET) == 0)
|
||||||
|
|||||||
@@ -454,8 +454,8 @@ UdpDomainSupport::_FindActiveEndpoint(const sockaddr *ourAddress,
|
|||||||
status_t
|
status_t
|
||||||
UdpDomainSupport::_DemuxBroadcast(net_buffer *buffer)
|
UdpDomainSupport::_DemuxBroadcast(net_buffer *buffer)
|
||||||
{
|
{
|
||||||
sockaddr *peerAddr = (sockaddr *)&buffer->source;
|
sockaddr *peerAddr = buffer->source;
|
||||||
sockaddr *broadcastAddr = (sockaddr *)&buffer->destination;
|
sockaddr *broadcastAddr = buffer->destination;
|
||||||
sockaddr *mask = NULL;
|
sockaddr *mask = NULL;
|
||||||
if (buffer->interface)
|
if (buffer->interface)
|
||||||
mask = (sockaddr *)buffer->interface->mask;
|
mask = (sockaddr *)buffer->interface->mask;
|
||||||
@@ -501,8 +501,8 @@ UdpDomainSupport::_DemuxBroadcast(net_buffer *buffer)
|
|||||||
status_t
|
status_t
|
||||||
UdpDomainSupport::_DemuxUnicast(net_buffer *buffer)
|
UdpDomainSupport::_DemuxUnicast(net_buffer *buffer)
|
||||||
{
|
{
|
||||||
struct sockaddr *peerAddr = (struct sockaddr *)&buffer->source;
|
struct sockaddr *peerAddr = buffer->source;
|
||||||
struct sockaddr *localAddr = (struct sockaddr *)&buffer->destination;
|
struct sockaddr *localAddr = buffer->destination;
|
||||||
|
|
||||||
TRACE_DOMAIN("_DemuxUnicast(%p)", buffer);
|
TRACE_DOMAIN("_DemuxUnicast(%p)", buffer);
|
||||||
|
|
||||||
@@ -678,8 +678,8 @@ UdpEndpointManager::Deframe(net_buffer *buffer)
|
|||||||
net_domain *domain = buffer->interface->domain;
|
net_domain *domain = buffer->interface->domain;
|
||||||
net_address_module_info *addressModule = domain->address_module;
|
net_address_module_info *addressModule = domain->address_module;
|
||||||
|
|
||||||
SocketAddress source(addressModule, &buffer->source);
|
SocketAddress source(addressModule, buffer->source);
|
||||||
SocketAddress destination(addressModule, &buffer->destination);
|
SocketAddress destination(addressModule, buffer->destination);
|
||||||
|
|
||||||
source.SetPort(header.source_port);
|
source.SetPort(header.source_port);
|
||||||
destination.SetPort(header.destination_port);
|
destination.SetPort(header.destination_port);
|
||||||
@@ -863,9 +863,8 @@ UdpEndpoint::SendRoutedData(net_buffer *buffer, net_route *route)
|
|||||||
if (header.Status() < B_OK)
|
if (header.Status() < B_OK)
|
||||||
return header.Status();
|
return header.Status();
|
||||||
|
|
||||||
header->source_port = AddressModule()->get_port((sockaddr *)&buffer->source);
|
header->source_port = AddressModule()->get_port(buffer->source);
|
||||||
header->destination_port = AddressModule()->get_port(
|
header->destination_port = AddressModule()->get_port(buffer->destination);
|
||||||
(sockaddr *)&buffer->destination);
|
|
||||||
header->udp_length = htons(buffer->size);
|
header->udp_length = htons(buffer->size);
|
||||||
// the udp-header is already included in the buffer-size
|
// the udp-header is already included in the buffer-size
|
||||||
header->udp_checksum = 0;
|
header->udp_checksum = 0;
|
||||||
|
|||||||
@@ -355,7 +355,7 @@ datalink_send_data(struct net_route *route, net_buffer *buffer)
|
|||||||
// instead of the destination address:
|
// instead of the destination address:
|
||||||
if (route->gateway == NULL)
|
if (route->gateway == NULL)
|
||||||
return B_MISMATCHED_VALUES;
|
return B_MISMATCHED_VALUES;
|
||||||
memcpy(&buffer->destination, route->gateway, sizeof(sockaddr));
|
memcpy(buffer->destination, route->gateway, route->gateway->sa_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
// this goes out to the datalink protocols
|
// this goes out to the datalink protocols
|
||||||
|
|||||||
@@ -62,6 +62,11 @@ struct data_header {
|
|||||||
struct net_buffer_private : net_buffer {
|
struct net_buffer_private : net_buffer {
|
||||||
struct list buffers;
|
struct list buffers;
|
||||||
data_node first_node;
|
data_node first_node;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
struct sockaddr_storage source;
|
||||||
|
struct sockaddr_storage destination;
|
||||||
|
} storage;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -328,8 +333,12 @@ create_buffer(size_t headerSpace)
|
|||||||
list_init(&buffer->buffers);
|
list_init(&buffer->buffers);
|
||||||
list_add_item(&buffer->buffers, &buffer->first_node);
|
list_add_item(&buffer->buffers, &buffer->first_node);
|
||||||
|
|
||||||
buffer->source.ss_len = 0;
|
buffer->source = (sockaddr *)&buffer->storage.source;
|
||||||
buffer->destination.ss_len = 0;
|
buffer->destination = (sockaddr *)&buffer->storage.destination;
|
||||||
|
|
||||||
|
buffer->storage.source.ss_len = 0;
|
||||||
|
buffer->storage.destination.ss_len = 0;
|
||||||
|
|
||||||
buffer->interface = NULL;
|
buffer->interface = NULL;
|
||||||
buffer->offset = 0;
|
buffer->offset = 0;
|
||||||
buffer->flags = 0;
|
buffer->flags = 0;
|
||||||
@@ -355,6 +364,22 @@ free_buffer(net_buffer *_buffer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
copy_metadata(net_buffer *destination, const net_buffer *source)
|
||||||
|
{
|
||||||
|
memcpy(destination->source, source->source,
|
||||||
|
min_c(source->source->sa_len, sizeof(sockaddr_storage)));
|
||||||
|
memcpy(destination->destination, source->destination,
|
||||||
|
min_c(source->destination->sa_len, sizeof(sockaddr_storage)));
|
||||||
|
|
||||||
|
destination->flags = source->flags;
|
||||||
|
destination->interface = source->interface;
|
||||||
|
destination->offset = source->offset;
|
||||||
|
destination->size = source->size;
|
||||||
|
destination->protocol = source->protocol;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*! Creates a duplicate of the \a buffer. The new buffer does not share internal
|
/*! Creates a duplicate of the \a buffer. The new buffer does not share internal
|
||||||
storage; they are completely independent from each other.
|
storage; they are completely independent from each other.
|
||||||
*/
|
*/
|
||||||
@@ -381,18 +406,7 @@ duplicate_buffer(net_buffer *_buffer)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// copy meta data from source buffer
|
copy_metadata(duplicate, buffer);
|
||||||
|
|
||||||
memcpy(&duplicate->source, &buffer->source,
|
|
||||||
min_c(buffer->source.ss_len, sizeof(sockaddr_storage)));
|
|
||||||
memcpy(&duplicate->destination, &buffer->destination,
|
|
||||||
min_c(buffer->destination.ss_len, sizeof(sockaddr_storage)));
|
|
||||||
|
|
||||||
duplicate->flags = buffer->flags;
|
|
||||||
duplicate->interface = buffer->interface;
|
|
||||||
duplicate->offset = buffer->offset;
|
|
||||||
duplicate->size = buffer->size;
|
|
||||||
duplicate->protocol = buffer->protocol;
|
|
||||||
|
|
||||||
return duplicate;
|
return duplicate;
|
||||||
}
|
}
|
||||||
@@ -423,6 +437,9 @@ clone_buffer(net_buffer *_buffer, bool shareFreeSpace)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clone->source = (sockaddr *)&clone->storage.source;
|
||||||
|
clone->destination = (sockaddr *)&clone->storage.destination;
|
||||||
|
|
||||||
list_init(&clone->buffers);
|
list_init(&clone->buffers);
|
||||||
|
|
||||||
// grab reference to this buffer - all additional nodes will get
|
// grab reference to this buffer - all additional nodes will get
|
||||||
@@ -465,18 +482,7 @@ clone_buffer(net_buffer *_buffer, bool shareFreeSpace)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// copy meta data from source buffer
|
copy_metadata(clone, buffer);
|
||||||
|
|
||||||
memcpy(&clone->source, &buffer->source,
|
|
||||||
min_c(buffer->source.ss_len, sizeof(sockaddr_storage)));
|
|
||||||
memcpy(&clone->destination, &buffer->destination,
|
|
||||||
min_c(buffer->destination.ss_len, sizeof(sockaddr_storage)));
|
|
||||||
|
|
||||||
clone->flags = buffer->flags;
|
|
||||||
clone->interface = buffer->interface;
|
|
||||||
clone->offset = buffer->offset;
|
|
||||||
clone->size = buffer->size;
|
|
||||||
clone->protocol = buffer->protocol;
|
|
||||||
|
|
||||||
return clone;
|
return clone;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -176,8 +176,8 @@ socket_writev(net_socket *socket, const iovec *vecs, size_t vecCount, size_t *_l
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(&buffer->source, &socket->address, socket->address.ss_len);
|
memcpy(buffer->source, &socket->address, socket->address.ss_len);
|
||||||
memcpy(&buffer->destination, &socket->peer, socket->peer.ss_len);
|
memcpy(buffer->destination, &socket->peer, socket->peer.ss_len);
|
||||||
size_t size = buffer->size;
|
size_t size = buffer->size;
|
||||||
|
|
||||||
ssize_t bytesWritten = socket->first_info->send_data(socket->first_protocol,
|
ssize_t bytesWritten = socket->first_info->send_data(socket->first_protocol,
|
||||||
@@ -840,8 +840,8 @@ socket_receive(net_socket *socket, msghdr *header, void *data, size_t length,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (header->msg_name != NULL) {
|
if (header->msg_name != NULL) {
|
||||||
header->msg_namelen = min_c(nameLen, buffer->source.ss_len);
|
header->msg_namelen = min_c(nameLen, buffer->source->sa_len);
|
||||||
memcpy(header->msg_name, &buffer->source, header->msg_namelen);
|
memcpy(header->msg_name, buffer->source, header->msg_namelen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -929,8 +929,8 @@ socket_send(net_socket *socket, msghdr *header, const void *data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
buffer->flags = flags;
|
buffer->flags = flags;
|
||||||
memcpy(&buffer->source, &socket->address, socket->address.ss_len);
|
memcpy(buffer->source, &socket->address, socket->address.ss_len);
|
||||||
memcpy(&buffer->destination, address, addressLength);
|
memcpy(buffer->destination, address, addressLength);
|
||||||
|
|
||||||
status_t status = socket->first_info->send_data(socket->first_protocol,
|
status_t status = socket->first_info->send_data(socket->first_protocol,
|
||||||
buffer);
|
buffer);
|
||||||
|
|||||||
@@ -542,13 +542,12 @@ get_buffer_route(net_domain *_domain, net_buffer *buffer, net_route **_route)
|
|||||||
|
|
||||||
BenaphoreLocker _(domain->lock);
|
BenaphoreLocker _(domain->lock);
|
||||||
|
|
||||||
net_route *route = get_route_internal(domain,
|
net_route *route = get_route_internal(domain, buffer->destination);
|
||||||
(sockaddr *)&buffer->destination);
|
|
||||||
if (route == NULL)
|
if (route == NULL)
|
||||||
return ENETUNREACH;
|
return ENETUNREACH;
|
||||||
|
|
||||||
status_t status = B_OK;
|
status_t status = B_OK;
|
||||||
sockaddr *source = (sockaddr *)&buffer->source;
|
sockaddr *source = buffer->source;
|
||||||
|
|
||||||
// TODO we are quite relaxed in the address checking here
|
// TODO we are quite relaxed in the address checking here
|
||||||
// as we might proceed with srcaddr=INADDR_ANY.
|
// as we might proceed with srcaddr=INADDR_ANY.
|
||||||
|
|||||||
Reference in New Issue
Block a user