Reputation: 13116
Can we use zero-copy for TCP send/recv with the default linux TCP/IP-stack?
Example:
int packet_socket = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); // raw-sockets
struct tpacket_req3 req;
setsockopt(packet_socket, SOL_PACKET , PACKET_RX_RING , (void*)&req , sizeof(req));
mapped_buffer = (uint8_t*)mmap(NULL, req.tp_block_size * req.tp_block_nr,
PROT_READ | PROT_WRITE, MAP_SHARED | MAP_LOCKED, packet_socket, 0);
So can we map part of socket-buffer with received payload from kernel-space to user-space to avoid zero-copy?
Upvotes: 5
Views: 7573
Reputation: 76
4.18 merged zero-copy receive support for the in-kernel TCP stack, see:
Upvotes: 5
Reputation: 5275
Technically it is impossible to implement zero-copy TCP.
Assume there are multiple application using TCP stack, each app owns a memory region where tcp data is supposed to be written.
When a packet is coming, the NIC hardware doesn't know which connection the packet is belonged to, so the NIC can't determine which memory region to write the packet.
So the only way is first writes to a kernel region and then copy to the app region later.
Upvotes: 0