【问题标题】:linux raw socket - receive custom packetslinux raw socket - 接收自定义数据包
【发布时间】:2013-05-28 15:26:27
【问题描述】:

我正在尝试通过 ubuntu linux 上的原始以太网套接字接收 IEEE1722 数据包。 套接字本身工作正常,我收到网络上流动的任何单个数据包(ARP、TCP、SSDP、....),但 IEEE1722 数据包除外。在我的阅读电话中,它们以某种方式被忽略了,并且不明白为什么-也许你们中的某个人有想法。 数据包是带有 VLAN 标记和 EtherType 0x22f0 的 802.1 帧 从 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 = read(m_socket,m_recv_buffer,ETH_FRAME_LEN);

【问题讨论】:

    标签: linux sockets ethernet


    【解决方案1】:

    我的两分钱贡献: AVTP 流在标记帧中运行,这意味着您不会在预期的偏移量处找到 ethertype 0x22f0(从数据包开始的 12 个八位字节,就在目标和源 MAC 地址之后)——之后它将是 4 个八位字节。 VLAN 标记帧的以太网类型通常为 0x8100。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,wireshark 可以看到数据包,我只是没有通过原始套接字获取它们。不确定我是否必须配置任何特殊的东西来接收 vlan 帧——这似乎是 ARP、SSDP 和 IEEE1722 数据包之间的唯一区别。最坏的情况是我切换 libpcap,只是很好奇我做错了什么。
      • 哦.. 关于硬件支持:这是一组我发送到网络的捕获数据包。它们通过路由器并到达接口(如果您的意思是具有硬件支持,则路由器不支持 SRP、gPTP 和 co.. 但这现在不是问题,我只想在我的端点上接收这些数据包 =) )
      猜你喜欢
      • 2012-12-14
      • 1970-01-01
      • 2018-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-31
      • 2023-03-11
      相关资源
      最近更新 更多