* If the IP_HDRINCL option is used, ipv4_send_routed_data() now checks if the source
address is set, and changes this if not; this makes traceroute work on Haiku. Patch by Hugo Santos. * Minor cleanup. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20422 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -71,7 +71,8 @@ struct ipv4_header {
|
|||||||
#define FRAGMENT_TIMEOUT 60000000LL
|
#define FRAGMENT_TIMEOUT 60000000LL
|
||||||
// discard fragment after 60 seconds
|
// discard fragment after 60 seconds
|
||||||
|
|
||||||
typedef DoublyLinkedList<struct net_buffer, DoublyLinkedListCLink<struct net_buffer> > FragmentList;
|
typedef DoublyLinkedList<struct net_buffer,
|
||||||
|
DoublyLinkedListCLink<struct net_buffer> > FragmentList;
|
||||||
|
|
||||||
struct ipv4_packet_key {
|
struct ipv4_packet_key {
|
||||||
in_addr_t source;
|
in_addr_t source;
|
||||||
@@ -654,6 +655,9 @@ static void
|
|||||||
raw_receive_data(net_buffer *buffer)
|
raw_receive_data(net_buffer *buffer)
|
||||||
{
|
{
|
||||||
BenaphoreLocker locker(sRawSocketsLock);
|
BenaphoreLocker locker(sRawSocketsLock);
|
||||||
|
|
||||||
|
TRACE(("ipv4:raw_receive_data(): protocol %i\n", buffer->protocol));
|
||||||
|
|
||||||
RawSocketList::Iterator iterator = sRawSockets.GetIterator();
|
RawSocketList::Iterator iterator = sRawSockets.GetIterator();
|
||||||
|
|
||||||
while (iterator.HasNext()) {
|
while (iterator.HasNext()) {
|
||||||
@@ -936,9 +940,13 @@ ipv4_send_routed_data(net_protocol *_protocol, struct net_route *route,
|
|||||||
source.sin_addr.s_addr = ((sockaddr_in *)route->interface->address)->sin_addr.s_addr;
|
source.sin_addr.s_addr = ((sockaddr_in *)route->interface->address)->sin_addr.s_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool headerIncluded = false;
|
||||||
|
if (protocol != NULL)
|
||||||
|
headerIncluded = (protocol->flags & IP_FLAG_HEADER_INCLUDED) != 0;
|
||||||
|
|
||||||
// Add IP header (if needed)
|
// Add IP header (if needed)
|
||||||
|
|
||||||
if (protocol == NULL || (protocol->flags & IP_FLAG_HEADER_INCLUDED) == 0) {
|
if (!headerIncluded) {
|
||||||
NetBufferPrepend<ipv4_header> bufferHeader(buffer);
|
NetBufferPrepend<ipv4_header> bufferHeader(buffer);
|
||||||
if (bufferHeader.Status() < B_OK)
|
if (bufferHeader.Status() < B_OK)
|
||||||
return bufferHeader.Status();
|
return bufferHeader.Status();
|
||||||
@@ -962,11 +970,24 @@ ipv4_send_routed_data(net_protocol *_protocol, struct net_route *route,
|
|||||||
|
|
||||||
header.destination = ((sockaddr_in *)&buffer->destination)->sin_addr.s_addr;
|
header.destination = ((sockaddr_in *)&buffer->destination)->sin_addr.s_addr;
|
||||||
|
|
||||||
header.checksum = gBufferModule->checksum(buffer, 0, sizeof(ipv4_header), true);
|
header.checksum = gBufferModule->checksum(buffer, 0,
|
||||||
|
sizeof(ipv4_header), true);
|
||||||
//dump_ipv4_header(header);
|
//dump_ipv4_header(header);
|
||||||
|
|
||||||
bufferHeader.Detach();
|
bufferHeader.Detach();
|
||||||
// make sure the IP-header is already written to the buffer at this point
|
// make sure the IP-header is already written to the
|
||||||
|
// buffer at this point
|
||||||
|
} else {
|
||||||
|
// if IP_HDRINCL, check if the source address is set
|
||||||
|
NetBufferHeader<ipv4_header> bufferHeader(buffer);
|
||||||
|
if (bufferHeader.Status() < B_OK)
|
||||||
|
return bufferHeader.Status();
|
||||||
|
|
||||||
|
ipv4_header &header = bufferHeader.Data();
|
||||||
|
if (header.source == 0)
|
||||||
|
header.source = source.sin_addr.s_addr;
|
||||||
|
|
||||||
|
bufferHeader.Detach();
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE(("header chksum: %ld, buffer checksum: %ld\n",
|
TRACE(("header chksum: %ld, buffer checksum: %ld\n",
|
||||||
@@ -1103,7 +1124,8 @@ ipv4_receive_data(net_buffer *buffer)
|
|||||||
uint32 matchedAddressType;
|
uint32 matchedAddressType;
|
||||||
if (!sDatalinkModule->is_local_address(sDomain, (sockaddr*)&destination,
|
if (!sDatalinkModule->is_local_address(sDomain, (sockaddr*)&destination,
|
||||||
&buffer->interface, &matchedAddressType)) {
|
&buffer->interface, &matchedAddressType)) {
|
||||||
TRACE(("this packet was not for us\n"));
|
TRACE(("this packet was not for us %lx -> %lx\n",
|
||||||
|
ntohl(header.source), ntohl(header.destination)));
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
if (matchedAddressType != 0) {
|
if (matchedAddressType != 0) {
|
||||||
|
|||||||
Reference in New Issue
Block a user