mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 16:37:35 +00:00
More work on IPv4 sockets and /bin/ping.
It's now actually possible to ping other hosts on the network! :^) I've switched the "run" script over to starting QEMU with user networking since that works better for my testing needs right now.
This commit is contained in:
parent
ce7c302933
commit
cf250e1245
7 changed files with 125 additions and 38 deletions
|
@ -143,15 +143,16 @@ ssize_t IPv4Socket::recvfrom(void* buffer, size_t buffer_length, int flags, cons
|
|||
}
|
||||
|
||||
auto peer_address = IPv4Address((const byte*)&((const sockaddr_in*)addr)->sin_addr.s_addr);
|
||||
#ifdef IPV4_SOCKET_DEBUG
|
||||
kprintf("recvfrom: peer_address=%s\n", peer_address.to_string().characters());
|
||||
#endif
|
||||
|
||||
ByteBuffer packet_buffer;
|
||||
|
||||
{
|
||||
LOCKER(m_lock);
|
||||
if (!m_receive_queue.is_empty()) {
|
||||
packet_buffer = m_receive_queue.take_first();
|
||||
m_can_read = m_receive_queue.is_empty();
|
||||
m_can_read = !m_receive_queue.is_empty();
|
||||
}
|
||||
}
|
||||
if (packet_buffer.is_null()) {
|
||||
|
@ -163,7 +164,7 @@ ssize_t IPv4Socket::recvfrom(void* buffer, size_t buffer_length, int flags, cons
|
|||
ASSERT(m_can_read);
|
||||
ASSERT(!m_receive_queue.is_empty());
|
||||
packet_buffer = m_receive_queue.take_first();
|
||||
m_can_read = m_receive_queue.is_empty();
|
||||
m_can_read = !m_receive_queue.is_empty();
|
||||
}
|
||||
ASSERT(!packet_buffer.is_null());
|
||||
auto& ipv4_packet = *(const IPv4Packet*)(packet_buffer.pointer());
|
||||
|
@ -174,8 +175,10 @@ ssize_t IPv4Socket::recvfrom(void* buffer, size_t buffer_length, int flags, cons
|
|||
|
||||
void IPv4Socket::did_receive(ByteBuffer&& packet)
|
||||
{
|
||||
#ifdef IPV4_SOCKET_DEBUG
|
||||
kprintf("IPv4Socket(%p): did_receive %d bytes\n", this, packet.size());
|
||||
#endif
|
||||
LOCKER(m_lock);
|
||||
kprintf("IPv4Socket(%p): did_receive %d bytes\n", packet.size());
|
||||
m_receive_queue.append(move(packet));
|
||||
m_can_read = true;
|
||||
}
|
||||
|
|
|
@ -6,9 +6,11 @@ if [ "$1" = "b" ]; then
|
|||
elif [ "$1" = "qn" ]; then
|
||||
# ./run qn: qemu without network
|
||||
qemu-system-i386 -s -m 32 -device e1000 -drive format=raw,file=.floppy-image,if=floppy -drive format=raw,file=_fs_contents #$@
|
||||
else
|
||||
echo run with net
|
||||
# ./run: qemu with network
|
||||
elif [ "$1" = "qtap" ]; then
|
||||
# ./run qtap: qemu with tap
|
||||
sudo qemu-system-i386 -s -m 32 -object filter-dump,id=hue,netdev=br0,file=e1000.pcap -netdev tap,ifname=tap0,id=br0 -device e1000,netdev=br0 -drive format=raw,file=.floppy-image,if=floppy -drive format=raw,file=_fs_contents
|
||||
else
|
||||
# ./run: qemu with user networking
|
||||
qemu-system-i386 -s -m 32 -object filter-dump,id=hue,netdev=breh,file=e1000.pcap -netdev user,id=breh -device e1000,netdev=breh -drive format=raw,file=.floppy-image,if=floppy -drive format=raw,file=_fs_contents
|
||||
fi
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@ typedef dword gid_t;
|
|||
typedef signed_word pid_t;
|
||||
typedef dword time_t;
|
||||
typedef dword useconds_t;
|
||||
typedef dword suseconds_t;
|
||||
typedef signed_dword suseconds_t;
|
||||
|
||||
struct timeval {
|
||||
time_t tv_sec;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue