我对内核中的skb->数据必须为4字节对齐,这是通过RAW套接字使用数据包mmap注入的网络数据包进行的。我不希望对内核进行任何更改。
是否可以从用户空间mmap代码发送数据包数据,从而使skb->数据对齐发生在4个字节处?
下面是我的代码。
int
pmsocket_send(uint8_t *buf, int len) {
int ret;
struct tpacket2_hdr *hdr;
uint8_t *data_off;
hdr = (struct tpacket2_hdr *) (txBuffer + (PKT_MMAP_FRAME_SIZE * txIndex));
data_off = ((uint8_t *) hdr) + TPACKET2_HDRLEN - sizeof(struct sockaddr_ll);
if (hdr->tp_status & (TP_STATUS_SEND_REQUEST | TP_STATUS_SENDING)) {
/* header not ready */
return -1;
}
/* setup buffer to xmit */
data_off = (uint8_t *)TPACKET_ALIGN_32((uintptr_t)data_off);
memcpy(data_off, buf, len);
txIndex = (txIndex + 1) % PKT_MMAP_NFRAMES;
hdr->tp_len = len;
hdr->tp_mac = (uintptr_t)data_off - (uintptr_t)hdr;
hdr->tp_status = TP_STATUS_SEND_REQUEST;
/* flush the packet */
ret = sendto(knet_fd, NULL, 0, 0, NULL, 0);
if (ret < 0) {
std::cout << "sendto failed\n";
return EFAIL;
}
return EOK;
}
我尝试了不同的偏移量(data_off),以检查skb->数据对齐是否发生,但没有帮助。 内核文档(https://www.kernel.org/doc/Documentation/networking/packet_mmap.txt)提到了使用PACKET_TX_HAS_OFF sockopt的自定义偏移量,但对skb->数据对齐没有任何影响。