1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
/*
* TODO: let to the user to configure the application.
* Parse the CLI arguments.
*/
#if (HAVE_CONFIG_H)
#include "../include/config.h"
#endif
#include "./libnet_test.h"
#define DEVICE_NAME "lo"
int
main(int argc, char *argv[])
{
(void)argc; /* unused */
int c;
libnet_t *l;
libnet_ptag_t t;
char errbuf[LIBNET_ERRBUF_SIZE];
uint8_t lldp_dst_mac[6] = {0x01, 0x80, 0xC2, 0x00, 0x00, 0x0E};
l = libnet_init(LIBNET_LINK, DEVICE_NAME, errbuf);
if (l == NULL)
{
fprintf(stderr, "libnet_init() failed: %s", errbuf);
return (EXIT_FAILURE);
}
/*
* Building of the LLDPDU should be from the tail to the head.
* - End of LLDPDU TLV
* - Optionals TLVs
* - TTL TLV
* - Port ID TLV
* - Chassis ID TLV
*/
/*
* Build End of LLDPDU TLV
*/
t = libnet_build_lldp_end(l, 0);
if (t == -1)
{
fprintf(stderr, "Can't build lldp end of lldpdu tlv: %s\n",
libnet_geterror(l));
goto bad;
}
/*
* Build Organization Specific TLV
* Build TLV information string manually
*/
uint8_t org_spec[9] = {0x00, 0x12, 0x0f, /* IEEE802.3 OUI */
0x01, /* IEEE 802.3 Subtype: MAC/PHY */
0x03, 0xc0, 0x36, 0x00, 0x10}; /* String information */
t = libnet_build_lldp_org_spec(org_spec, sizeof(org_spec), l, 0);
if (t == -1)
{
fprintf(stderr, "Can't build Organization Specific tlv: %s\n", libnet_geterror(l));
goto bad;
}
/*
* Build TTL TLV
*/
const uint16_t ttl = htons(120); /* seconds */
t = libnet_build_lldp_ttl(ttl, l, 0);
if (t == -1)
{
fprintf(stderr, "Can't build ttl tlv: %s\n", libnet_geterror(l));
goto bad;
}
/*
* Build Port ID TLV
*/
uint8_t interface_alias[15] = {0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b,
0x20, 0x74, 0x6f, 0x20, 0x53, 0x31};
t = libnet_build_lldp_port(LIBNET_LLDP_PORT_ID_SUBTYPE_IF_ALIAS,
interface_alias, sizeof(interface_alias), l, 0);
if (t == -1)
{
fprintf(stderr, "Can't build lldp port id tlv: %s\n", libnet_geterror(l));
goto bad;
}
/*
* Build Chassis ID TLV
*/
uint8_t chassis_mac[6] = {0x00, 0x19, 0x2f, 0xa7, 0xb2, 0x8d};
t = libnet_build_lldp_chassis(LIBNET_LLDP_CHASSIS_ID_SUBTYPE_MAC, chassis_mac,
sizeof(chassis_mac), l, 0);
if (t == -1)
{
fprintf(stderr, "Can't build lldp chassis id tlv: %s\n",
libnet_geterror(l));
goto bad;
}
t = libnet_build_ethernet(lldp_dst_mac, (uint8_t *)libnet_get_hwaddr(l),
LIBNET_LLDP_ETH_TYPE, NULL, 0, l, 0);
if (t == -1)
{
fprintf(stderr, "Can't build ethernet header: %s\n", libnet_geterror(l));
goto bad;
}
/* write the packet out */
c = libnet_write(l);
if (c == -1)
{
fprintf(stderr, "Write error: %s\n", libnet_geterror(l));
goto bad;
}
else
{
fprintf(stderr, "Wrote %d byte LLDP frame \"%s\"\n", c, argv[2]);
}
libnet_destroy(l);
return (EXIT_SUCCESS);
bad:
libnet_destroy(l);
return (EXIT_FAILURE);
}
|