У меня есть требование, чтобы skb-> data в ядре был выровнен по 4 байта для сетевого пакета, который вводится сокетом RAW с использованием пакета mmap.Я не хочу вносить какие-либо изменения в ядро.
Можно ли отправлять пакетные данные из кода mmap пользователя, чтобы skb-> выравнивание данных происходило при 4 байтах?
Ниже приведен мойcode.
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) упоминается о пользовательском смещении с использованием sockopt PACKET_TX_HAS_OFF, но в действительности это не имеет никакого значения для skb-> выравнивания данных.