Linux原始套接字-接收自定义数据包



我试图通过ubuntu linux上的原始以太网套接字接收IEEE1722数据包。套接字本身工作得很好,除了IEEE1722数据包外,我可以接收网络上流动的任何单个数据包(ARP,TCP,SSDP,....)。在我的阅读电话中,他们不知怎么被忽略了,也不明白为什么——也许你们中有人知道了。报文为802.1帧,带有VLAN标签,以太类型为0x22f0从ETH_P_ALL切换到ETH_P_8021Q或切换到hons (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 = read(m_socket,m_recv_buffer,ETH_FRAME_LEN);

我的贡献:AVTP流在一个带标签的帧中运行,这意味着你不会在预期的偏移量(从数据包开始的12个字节,就在目标和源MAC地址之后)上找到以太类型0x22f0 -在那之后它将是4个字节。VLAN标签帧的以太类型一般为0x8100。

您是否在此界面上尝试过wireshark -或tshark - ?Wireshark应该能够很好地获取这些数据包,但不确定是否需要启用它。如果我没记错的话,所有的网络端口都必须支持802.1AS。IEEE 1722需要硬件支持,我认为如果不知道它是如何设置的,就不可能帮助您。

最新更新