Пользовательское выравнивание данных skb с пакетом mmap - PullRequest
0 голосов
/ 16 октября 2018

У меня есть требование, чтобы 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-> выравнивания данных.

...