使用数据包mmap的自定义skb数据对齐

时间:2018-10-16 17:09:12

标签: sockets kernel alignment mmap packet

我对内核中的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->数据对齐没有任何影响。

0 个答案:

没有答案