linux raw socket - получать пользовательские пакеты

Я пытаюсь получить пакет IEEE1722 через необработанный сокет Ethernet в ubuntu linux. Сам сокет работает нормально, я получаю любой отдельный пакет (ARP, TCP, SSDP, ....), проходящий по сети, за исключением пакетов IEEE1722. Их почему-то игнорируют на моих звонках для чтения, и я не понимаю, почему - может быть, у кого-то из вас есть идея. Пакеты представляют собой кадры 802.1 с тегом VLAN и EtherType 0x22f0. Ни переключение с ETH_P_ALL на ETH_P_8021Q, ни на htons (0x22f0) не помогает. Если я его поменяю, то больше ничего не получу.

Это мой код - кто-то знает, что не так?

Создание сокета:

m_socket = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
if (m_socket < 0) 
{ 
    LOGERROR("EthRawSock", "Start(): SOCK_RAW creation failed! error: %d",errno);
    m_socket = NULL;
    return ErrorFileOpen;
}

struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, m_sznic.ptrz());
if (ioctl(m_socket, SIOCGIFINDEX, &ifr) < 0) {
    LOGERROR("EthRawSock", "Start(): ioctl() SIOCGIFINDEX failed! error: %d (NIC: %s)",errno,ifr.ifr_name);
    return ErrorFileOpen;
}

struct sockaddr_ll sll;
memset(&sll, 0, sizeof(sll));
sll.sll_family = AF_PACKET;
sll.sll_ifindex = ifr.ifr_ifindex;
sll.sll_protocol = htons(0x22f0);

if (bind((int)m_socket, (struct sockaddr *) &sll, sizeof(sll)) < 0) {
    LOGERROR("EthRawSock", "Start(): bind() failed! error: %d",errno);
    return ErrorFileOpen;
}

if (ioctl(m_socket, SIOCGIFHWADDR, &ifr) < 0)
{
    LOGERROR("EthRawSock", "Start(): SIOCGIFHWADDR failed! error: %d",errno);
    return ErrorFileOpen;
}

struct packet_mreq mr;
memset(&mr, 0, sizeof(mr));
mr.mr_ifindex = sll.sll_ifindex;
mr.mr_type = PACKET_MR_PROMISC;

if (setsockopt(m_socket, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mr, sizeof(mr)) < 0) {
    LOGERROR("EthRawSock", "Start(): setsockopt() PACKET_ADD_MEMBERSHIP failed! error: %d",errno);
    return ErrorFileOpen;
}

Чтение через:

nsize = читать (m_socket, m_recv_buffer, ETH_FRAME_LEN);


person user2429124    schedule 28.05.2013    source источник


Ответы (2)


Мой вклад в два цента: потоки AVTP запускаются в помеченном кадре, это означает, что вы не найдете ethertype 0x22f0 в ожидаемом смещении (12 октетов от начала пакета, сразу после MAC-адреса назначения и источника) - это будет 4 октета после этого. Типом ethertype для кадров с тегами VLAN обычно является 0x8100.

person P.Fraviga    schedule 03.07.2013

Вы пробовали wireshark или tshark на этом интерфейсе? Wireshark должен иметь возможность нормально обрабатывать эти пакеты - хотя не уверен, нужно ли вам его включать. Если не ошибаюсь, все сетевые порты должны поддерживать 802.1AS. IEEE 1722 требует аппаратной поддержки, и я думаю, что было бы невозможно помочь вам, не зная, как это было настроено.

person Chris    schedule 28.05.2013
comment
Да, wirehark может видеть пакеты, я просто не получаю их через необработанный сокет. Не уверен, что мне нужно настраивать что-то особенное для получения кадров vlan - это кажется единственной разницей между ARP, SSDP и пакетами IEEE1722. В худшем случае я переключаю libpcap, просто очень любопытно, что я делаю не так. - person user2429124; 29.05.2013
comment
Ох .. насчет аппаратной поддержки: это набор перехваченных пакетов, которые я отправляю в сеть. Они проходят маршрутизатор и достигают интерфейса (SRP, gPTP и co не поддерживаются маршрутизатором, если вы имеете в виду, что с поддержкой оборудования ... но это не проблема прямо сейчас, я хочу получать эти пакеты только на моей конечной точке =) ) - person user2429124; 29.05.2013