1 /* -*- mode: c; c-file-style: "openbsd" -*- */
3 * Copyright (c) 2015 Vincent Bernat <bernat@luffy.cx>
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 #include <sys/socket.h>
20 #include <arpa/inet.h>
21 #include <netinet/in.h>
25 char filenameprefix
[] = "sonmp_send";
29 START_TEST (test_send_sonmp
)
32 /* Packet we should build:
34 Destination: Bay-Networks-(Synoptics)-autodiscovery (01:00:81:00:01:00)
35 Source: 5e:10:8e:e7:84:ad (5e:10:8e:e7:84:ad)
42 Control field: U, func=UI (0x03)
43 000. 00.. = Command: Unnumbered Information (0x00)
44 .... ..11 = Frame type: Unnumbered frame (0x03)
45 Organization Code: Nortel Networks SONMP (0x000081)
46 PID: SONMP segment hello (0x01a2)
47 Nortel Networks / SynOptics Network Management Protocol
48 NMM IP address: 172.17.142.37 (172.17.142.37)
49 Segment Identifier: 0x000004
50 Chassis type: Unknown (1)
51 Backplane type: ethernet, fast ethernet and gigabit ethernet (12)
56 Destination: Bay-Networks-(Synoptics)-autodiscovery (01:00:81:00:01:01)
57 Source: 5e:10:8e:e7:84:ad (5e:10:8e:e7:84:ad)
64 Control field: U, func=UI (0x03)
65 000. 00.. = Command: Unnumbered Information (0x00)
66 .... ..11 = Frame type: Unnumbered frame (0x03)
67 Organization Code: Nortel Networks SONMP (0x000081)
68 PID: SONMP flatnet hello (0x01a1)
69 Nortel Networks / SynOptics Network Management Protocol
70 NMM IP address: 172.17.142.37 (172.17.142.37)
71 Segment Identifier: 0x000004
72 Chassis type: Unknown (1)
73 Backplane type: ethernet, fast ethernet and gigabit ethernet (12)
78 0x01, 0x00, 0x81, 0x00, 0x01, 0x00, 0x5e, 0x10,
79 0x8e, 0xe7, 0x84, 0xad, 0x00, 0x16, 0xaa, 0xaa,
80 0x03, 0x00, 0x00, 0x81, 0x01, 0xa2, 0xac, 0x11,
81 0x8e, 0x25, 0x00, 0x00, 0x04, 0x01, 0x0c, 0x03,
84 0x01, 0x00, 0x81, 0x00, 0x01, 0x01, 0x5e, 0x10,
85 0x8e, 0xe7, 0x84, 0xad, 0x00, 0x16, 0xaa, 0xaa,
86 0x03, 0x00, 0x00, 0x81, 0x01, 0xa1, 0xac, 0x11,
87 0x8e, 0x25, 0x00, 0x00, 0x04, 0x01, 0x0c, 0x03,
91 struct lldpd_mgmt
*mgmt
;
93 /* Populate port and chassis */
94 hardware
.h_lport
.p_id_subtype
= LLDP_PORTID_SUBTYPE_IFNAME
;
95 hardware
.h_lport
.p_id
= "Not used";
96 hardware
.h_lport
.p_id_len
= strlen(hardware
.h_lport
.p_id
);
97 chassis
.c_id_subtype
= LLDP_CHASSISID_SUBTYPE_LLADDR
;
98 chassis
.c_id
= macaddress
;
99 chassis
.c_id_len
= ETHER_ADDR_LEN
;
100 TAILQ_INIT(&chassis
.c_mgmt
);
101 addr
= inet_addr("172.17.142.37");
102 mgmt
= lldpd_alloc_mgmt(LLDPD_AF_IPV4
,
103 &addr
, sizeof(in_addr_t
), 0);
106 TAILQ_INSERT_TAIL(&chassis
.c_mgmt
, mgmt
, m_entries
);
109 n
= sonmp_send(NULL
, &hardware
);
111 fail("unable to build packet");
114 if (TAILQ_EMPTY(&pkts
)) {
115 fail("no packets sent");
118 pkt
= TAILQ_FIRST(&pkts
);
119 ck_assert_int_eq(pkt
->size
, sizeof(pkt1
));
120 fail_unless(memcmp(pkt
->data
, pkt1
, sizeof(pkt1
)) == 0);
121 pkt
= TAILQ_NEXT(pkt
, next
);
123 fail("need one more packet");
126 ck_assert_int_eq(pkt
->size
, sizeof(pkt2
));
127 fail_unless(memcmp(pkt
->data
, pkt2
, sizeof(pkt2
)) == 0);
128 fail_unless(TAILQ_NEXT(pkt
, next
) == NULL
, "more than two packets sent");
132 START_TEST (test_recv_sonmp
)
135 0x01, 0x00, 0x81, 0x00, 0x01, 0x00, 0x00, 0x1b,
136 0x25, 0x08, 0x50, 0x47, 0x00, 0x13, 0xaa, 0xaa,
137 0x03, 0x00, 0x00, 0x81, 0x01, 0xa2, 0xac, 0x10,
138 0x65, 0xa8, 0x00, 0x02, 0x08, 0x38, 0x0c, 0x02,
139 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
140 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
141 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
142 0x00, 0x00, 0x00, 0x00 };
145 Destination: Bay-Networks-(Synoptics)-autodiscovery (01:00:81:00:01:00)
146 Source: Nortel_08:50:47 (00:1b:25:08:50:47)
148 Trailer: 000000000000000000000000000000000000000000000000...
154 Control field: U, func=UI (0x03)
155 000. 00.. = Command: Unnumbered Information (0x00)
156 .... ..11 = Frame type: Unnumbered frame (0x03)
157 Organization Code: Nortel Networks SONMP (0x000081)
158 PID: SONMP segment hello (0x01a2)
159 Nortel Networks / SynOptics Network Management Protocol
160 NMM IP address: 172.16.101.168 (172.16.101.168)
161 Segment Identifier: 0x000208
162 Chassis type: Accelar 8610 L3 switch (56)
163 Backplane type: ethernet, fast ethernet and gigabit ethernet (12)
164 NMM state: Heartbeat (2)
167 struct lldpd_chassis
*nchassis
= NULL
;
168 struct lldpd_port
*nport
= NULL
;
172 fail_unless(sonmp_decode(NULL
, pkt1
, sizeof(pkt1
), &hardware
,
173 &nchassis
, &nport
) != -1);
174 if (!nchassis
|| !nport
) {
175 fail("unable to decode packet");
178 ck_assert_int_eq(nchassis
->c_id_subtype
,
179 LLDP_CHASSISID_SUBTYPE_ADDR
);
180 ck_assert_int_eq(nchassis
->c_id_len
, 5);
182 ip
= inet_addr("172.16.101.168");
183 memcpy(cid
+ 1, &ip
, sizeof(in_addr_t
));
184 fail_unless(memcmp(nchassis
->c_id
, cid
, 5) == 0);
185 ck_assert_str_eq(nchassis
->c_name
, "172.16.101.168");
186 ck_assert_str_eq(nchassis
->c_descr
, "Nortel Ethernet Routing 8610 L3 Switch");
187 ck_assert_int_eq(TAILQ_FIRST(&nchassis
->c_mgmt
)->m_addr
.inet
.s_addr
,
188 (u_int32_t
)inet_addr("172.16.101.168"));
189 ck_assert_int_eq(TAILQ_FIRST(&nchassis
->c_mgmt
)->m_iface
, 0);
190 ck_assert_str_eq(nport
->p_descr
, "port 2/8");
191 ck_assert_int_eq(nport
->p_id_subtype
,
192 LLDP_PORTID_SUBTYPE_LOCAL
);
193 ck_assert_int_eq(nport
->p_id_len
, strlen("00-02-08"));
194 fail_unless(memcmp(nport
->p_id
,
195 "00-02-08", strlen("00-02-08")) == 0);
196 ck_assert_int_eq(nchassis
->c_cap_enabled
, 0);
205 Suite
*s
= suite_create("SONMP");
208 TCase
*tc_send
= tcase_create("Send SONMP packets");
209 TCase
*tc_receive
= tcase_create("Receive SONMP packets");
211 tcase_add_checked_fixture(tc_send
, pcap_setup
, pcap_teardown
);
212 tcase_add_test(tc_send
, test_send_sonmp
);
213 suite_add_tcase(s
, tc_send
);
215 tcase_add_test(tc_receive
, test_recv_sonmp
);
216 suite_add_tcase(s
, tc_receive
);
226 Suite
*s
= sonmp_suite ();
227 SRunner
*sr
= srunner_create (s
);
228 srunner_set_fork_status (sr
, CK_NOFORK
); /* Can't fork because
231 srunner_run_all (sr
, CK_ENV
);
232 number_failed
= srunner_ntests_failed (sr
);
234 return (number_failed
== 0) ? EXIT_SUCCESS
: EXIT_FAILURE
;