从原始套接字发送 LLDP 多播数据包

Sending LLDP multicast packet from raw socket

我正在向模拟交换机发送 LLDP 数据包,因为我正在测试一些 DCB 设置并且我可以在 tcpdump 中看到数据包发出,但我看不到它到达 link 合作伙伴。 我的代码:

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <linux/if_packet.h>
#include <net/ethernet.h>
#include <string.h>
#include <net/if.h>
#include <errno.h>
#include <sys/ioctl.h>

int main() {
        char buf[414] = {0x01, 0x80, 0xc2, 0x00, 0x00, 0x0e, 0xb4, 0x96, 0x91, 0x94, 0xaa, 0x25, 0x88, 0xcc, 0x02, 0x07,
                         0x04, 0x4c, 0x76, 0x25, 0xee, 0xd3, 0x40, 0x04, 0x11, 0x05, 0x68, 0x75, 0x6e, 0x64, 0x72, 0x65,
                         0x64, 0x47, 0x69, 0x67, 0x45, 0x20, 0x31, 0x2f, 0x32, 0x34, 0x06, 0x02, 0x00, 0x78, 0x0a, 0x0a,
                         0x5a, 0x39, 0x31, 0x30, 0x30, 0x2d, 0x4f, 0x4e, 0x36, 0x31, 0x0c, 0xd6, 0x44, 0x65, 0x6c, 0x6c,
                         0x20, 0x52, 0x65, 0x61, 0x6c, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x4f, 0x70, 0x65, 0x72, 0x61,
                         0x74, 0x69, 0x6e, 0x67, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x53, 0x6f, 0x66, 0x74,
                         0x77, 0x61, 0x72, 0x65, 0x2e, 0x20, 0x44, 0x65, 0x6c, 0x6c, 0x20, 0x4f, 0x70, 0x65, 0x72, 0x61,
                         0x74, 0x69, 0x6e, 0x67, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x56, 0x65, 0x72, 0x73,
                         0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x32, 0x2e, 0x30, 0x2e, 0x20, 0x44, 0x65, 0x6c, 0x6c, 0x20, 0x41,
                         0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77,
                         0x61, 0x72, 0x65, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x39, 0x2e, 0x31,
                         0x31, 0x28, 0x30, 0x2e, 0x30, 0x50, 0x36, 0x29, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67,
                         0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x31, 0x39, 0x39, 0x39, 0x2d, 0x32, 0x30, 0x31, 0x37,
                         0x44, 0x65, 0x6c, 0x6c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x52, 0x69,
                         0x67, 0x68, 0x74, 0x73, 0x20, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2e, 0x42, 0x75,
                         0x69, 0x6c, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x3a, 0x20, 0x4d, 0x6f, 0x6e, 0x20, 0x46, 0x65,
                         0x62, 0x20, 0x32, 0x37, 0x20, 0x31, 0x36, 0x3a, 0x35, 0x37, 0x3a, 0x32, 0x30, 0x20, 0x32, 0x30,
                         0x31, 0x37, 0x0e, 0x04, 0x00, 0x16, 0x00, 0x16, 0x10, 0x0c, 0x05, 0x01, 0x0a, 0xed, 0x5f, 0x37,
                         0x02, 0x00, 0x90, 0x00, 0x01, 0x00, 0xfe, 0x06, 0x00, 0x80, 0xc2, 0x0b, 0x08, 0x18, 0xfe, 0x19,
                         0x00, 0x80, 0xc2, 0x09, 0x07, 0x12, 0x34, 0x56, 0x70, 0x0d, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c,
                         0x0c, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0xfe, 0x19, 0x00, 0x80, 0xc2, 0x0a, 0x00,
                         0x01, 0x23, 0x45, 0x67, 0x0d, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0c, 0x02, 0x02, 0x02, 0x02,
                         0x02, 0x02, 0x02, 0x02, 0xfe, 0x0e, 0x00, 0x80, 0xc2, 0x0c, 0x00, 0x61, 0x89, 0x06, 0x61, 0x89,
                         0x14, 0x82, 0x0c, 0xbc, 0x00, 0x00};

        struct ifreq ifr;
        strncpy((char *)ifr.ifr_name, "eth1", IFNAMSIZ);

        int sock_r = socket(AF_PACKET,SOCK_RAW,htons(ETH_P_ALL));

        if (sock_r < 0)
                printf("socket errno: %s\n", strerror(errno));

        if (ioctl(sock_r, SIOCGIFINDEX, &ifr))
                printf("ioctl errno: %s\n", strerror(errno));

        struct sockaddr_ll sll = {.sll_family = AF_PACKET, .sll_ifindex = ifr.ifr_ifindex};

        if(sendto(sock_r, buf, sizeof(buf), 0, (struct sockaddr *) &sll, sizeof(sll)))
                printf("sendto errno: %s\n", strerror(errno));

        close(sock_r);

        return 0;
}

在 tcpdump 中我看到:

13:40:33.472198 LLDP, length 400
        Chassis ID TLV (1), length 7
          Subtype MAC address (4): 4c:76:25:ee:d3:40
          0x0000:  044c 7625 eed3 40
        Port ID TLV (2), length 17
          Subtype Interface Name (5): hundredGigE 1/24
          0x0000:  0568 756e 6472 6564 4769 6745 2031 2f32
          0x0010:  34
        Time to Live TLV (3), length 2: TTL 120s
          0x0000:  0078
        System Name TLV (5), length 10: Z9100-ON61
          0x0000:  5a39 3130 302d 4f4e 3631
        System Description TLV (6), length 214
          Dell Real Time Operating System Software. Dell Operating System Version: 2.0. Dell Application Software Version: 9.11(0.0P6) Copyright (c) 1999-2017Dell Inc. All Rights Reserved.Build Time: Mon Feb 27 16:57:20 2017
          0x0000:  4465 6c6c 2052 6561 6c20 5469 6d65 204f
          0x0010:  7065 7261 7469 6e67 2053 7973 7465 6d20
          0x0020:  536f 6674 7761 7265 2e20 4465 6c6c 204f
          0x0030:  7065 7261 7469 6e67 2053 7973 7465 6d20
          0x0040:  5665 7273 696f 6e3a 2032 2e30 2e20 4465
          0x0050:  6c6c 2041 7070 6c69 6361 7469 6f6e 2053
          0x0060:  6f66 7477 6172 6520 5665 7273 696f 6e3a
          0x0070:  2039 2e31 3128 302e 3050 3629 2043 6f70
          0x0080:  7972 6967 6874 2028 6329 2031 3939 392d
          0x0090:  3230 3137 4465 6c6c 2049 6e63 2e20 416c
          0x00a0:  6c20 5269 6768 7473 2052 6573 6572 7665
          0x00b0:  642e 4275 696c 6420 5469 6d65 3a20 4d6f
          0x00c0:  6e20 4665 6220 3237 2031 363a 3537 3a32
          0x00d0:  3020 3230 3137
        System Capabilities TLV (7), length 4
          System  Capabilities [Repeater, Bridge, Router] (0x0016)
          Enabled Capabilities [Repeater, Bridge, Router] (0x0016)
          0x0000:  0016 0016
        Management Address TLV (8), length 12
          Management Address length 5, AFI IPv4 (1): 10.237.95.55
          Interface Index Interface Numbering (2): 9437185
          0x0000:  0501 0aed 5f37 0200 9000 0100
        Organization specific TLV (127), length 6: OUI Ethernet bridged (0x0080c2)
          Priority Flow Control Configuration Subtype (11)
            Willing: 0, MBC: 0, RES: 0, PFC cap:8
            PFC Enable
             Priority : 0  1  2  3  4  5  6  7
             Value    : 0  0  0  1  1  0  0  0
          0x0000:  0080 c20b 0818
        Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
          ETS Configuration Subtype (9)
            Willing:0, CBS:0, RES:0, Max TCs:7
            Priority Assignment Table
             Priority : 0   1   2   3   4   5   6   7
             Value    : 1   2   3   4   5   6   7   0
            TC Bandwidth Table
             TC%   : 0   1   2   3   4   5   6   7
             Value : 13  13  13  13  12  12  12  12
            TSA Assignment Table
             Traffic Class: 0   1   2   3   4   5   6   7
             Value        : 2   2   2   2   2   2   2   2
          0x0000:  0080 c209 0712 3456 700d 0d0d 0d0c 0c0c
          0x0010:  0c02 0202 0202 0202 02
        Organization specific TLV (127), length 25: OUI Ethernet bridged (0x0080c2)
          ETS Recommendation Subtype (10)
            RES: 0
            Priority Assignment Table
             Priority : 0   1   2   3   4   5   6   7
             Value    : 0   1   2   3   4   5   6   7
            TC Bandwidth Table
             TC%   : 0   1   2   3   4   5   6   7
             Value : 13  13  13  13  12  12  12  12
            TSA Assignment Table
             Traffic Class: 0   1   2   3   4   5   6   7
             Value        : 2   2   2   2   2   2   2   2
          0x0000:  0080 c20a 0001 2345 670d 0d0d 0d0c 0c0c
          0x0010:  0c02 0202 0202 0202 02
        Organization specific TLV (127), length 14: OUI Ethernet bridged (0x0080c2)
          Application Priority Subtype (12)
            RES: 0
            Application Priority Table
              Priority: 3, RES: 0, Sel: 1, Protocol ID: 24969
              Priority: 3, RES: 0, Sel: 1, Protocol ID: 24969
              Priority: 4, RES: 0, Sel: 2, Protocol ID: 33292
          0x0000:  0080 c20c 0061 8906 6189 1482 0cbc
        End TLV (0), length 0

我应该例如在原始套接字道具中设置一些东西,或者在驱动程序中启用一些东西,或者它是特定于供应商的,我在泡菜中?

原来是 hardware-specific 问题。显然,出于安全原因,某些设备不支持传输欺骗性 LLDP 帧。将适配器更改为 Niantic 成功了。