xref: /openbmc/u-boot/net/cdp.c (revision f739fcd831240dda10a92f4212f1854f8481aeee)
1*f739fcd8STom Rini // SPDX-License-Identifier: GPL-2.0
2f575ae1fSJoe Hershberger /*
3f575ae1fSJoe Hershberger  *	Copied from Linux Monitor (LiMon) - Networking.
4f575ae1fSJoe Hershberger  *
5f575ae1fSJoe Hershberger  *	Copyright 1994 - 2000 Neil Russell.
6f575ae1fSJoe Hershberger  *	(See License)
7f575ae1fSJoe Hershberger  *	Copyright 2000 Roland Borde
8f575ae1fSJoe Hershberger  *	Copyright 2000 Paolo Scaffardi
9f575ae1fSJoe Hershberger  *	Copyright 2000-2002 Wolfgang Denk, wd@denx.de
10f575ae1fSJoe Hershberger  */
11f575ae1fSJoe Hershberger 
12f575ae1fSJoe Hershberger #include <common.h>
13f575ae1fSJoe Hershberger #include <net.h>
14f575ae1fSJoe Hershberger #if defined(CONFIG_CDP_VERSION)
15f575ae1fSJoe Hershberger #include <timestamp.h>
16f575ae1fSJoe Hershberger #endif
17f575ae1fSJoe Hershberger 
18f575ae1fSJoe Hershberger #include "cdp.h"
19f575ae1fSJoe Hershberger 
20f575ae1fSJoe Hershberger /* Ethernet bcast address */
210adb5b76SJoe Hershberger const u8 net_cdp_ethaddr[6] = { 0x01, 0x00, 0x0c, 0xcc, 0xcc, 0xcc };
22f575ae1fSJoe Hershberger 
23f575ae1fSJoe Hershberger #define CDP_DEVICE_ID_TLV		0x0001
24f575ae1fSJoe Hershberger #define CDP_ADDRESS_TLV			0x0002
25f575ae1fSJoe Hershberger #define CDP_PORT_ID_TLV			0x0003
26f575ae1fSJoe Hershberger #define CDP_CAPABILITIES_TLV		0x0004
27f575ae1fSJoe Hershberger #define CDP_VERSION_TLV			0x0005
28f575ae1fSJoe Hershberger #define CDP_PLATFORM_TLV		0x0006
29f575ae1fSJoe Hershberger #define CDP_NATIVE_VLAN_TLV		0x000a
30f575ae1fSJoe Hershberger #define CDP_APPLIANCE_VLAN_TLV		0x000e
31f575ae1fSJoe Hershberger #define CDP_TRIGGER_TLV			0x000f
32f575ae1fSJoe Hershberger #define CDP_POWER_CONSUMPTION_TLV	0x0010
33f575ae1fSJoe Hershberger #define CDP_SYSNAME_TLV			0x0014
34f575ae1fSJoe Hershberger #define CDP_SYSOBJECT_TLV		0x0015
35f575ae1fSJoe Hershberger #define CDP_MANAGEMENT_ADDRESS_TLV	0x0016
36f575ae1fSJoe Hershberger 
37f575ae1fSJoe Hershberger #define CDP_TIMEOUT			250UL	/* one packet every 250ms */
38f575ae1fSJoe Hershberger 
396aede5b7SJoe Hershberger static int cdp_seq;
406aede5b7SJoe Hershberger static int cdp_ok;
41f575ae1fSJoe Hershberger 
426aede5b7SJoe Hershberger ushort cdp_native_vlan;
436aede5b7SJoe Hershberger ushort cdp_appliance_vlan;
44f575ae1fSJoe Hershberger 
456aede5b7SJoe Hershberger static const uchar cdp_snap_hdr[8] = {
46f575ae1fSJoe Hershberger 	0xAA, 0xAA, 0x03, 0x00, 0x00, 0x0C, 0x20, 0x00 };
47f575ae1fSJoe Hershberger 
cdp_compute_csum(const uchar * buff,ushort len)486aede5b7SJoe Hershberger static ushort cdp_compute_csum(const uchar *buff, ushort len)
49f575ae1fSJoe Hershberger {
50f575ae1fSJoe Hershberger 	ushort csum;
51f575ae1fSJoe Hershberger 	int     odd;
52f575ae1fSJoe Hershberger 	ulong   result = 0;
53f575ae1fSJoe Hershberger 	ushort  leftover;
54f575ae1fSJoe Hershberger 	ushort *p;
55f575ae1fSJoe Hershberger 
56f575ae1fSJoe Hershberger 	if (len > 0) {
57f575ae1fSJoe Hershberger 		odd = 1 & (ulong)buff;
58f575ae1fSJoe Hershberger 		if (odd) {
59f575ae1fSJoe Hershberger 			result = *buff << 8;
60f575ae1fSJoe Hershberger 			len--;
61f575ae1fSJoe Hershberger 			buff++;
62f575ae1fSJoe Hershberger 		}
63f575ae1fSJoe Hershberger 		while (len > 1) {
64f575ae1fSJoe Hershberger 			p = (ushort *)buff;
65f575ae1fSJoe Hershberger 			result += *p++;
66f575ae1fSJoe Hershberger 			buff = (uchar *)p;
67f575ae1fSJoe Hershberger 			if (result & 0x80000000)
68f575ae1fSJoe Hershberger 				result = (result & 0xFFFF) + (result >> 16);
69f575ae1fSJoe Hershberger 			len -= 2;
70f575ae1fSJoe Hershberger 		}
71f575ae1fSJoe Hershberger 		if (len) {
72f575ae1fSJoe Hershberger 			leftover = (signed short)(*(const signed char *)buff);
73f575ae1fSJoe Hershberger 			/*
74f575ae1fSJoe Hershberger 			 * CISCO SUCKS big time! (and blows too):
75f575ae1fSJoe Hershberger 			 * CDP uses the IP checksum algorithm with a twist;
76f575ae1fSJoe Hershberger 			 * for the last byte it *sign* extends and sums.
77f575ae1fSJoe Hershberger 			 */
78f575ae1fSJoe Hershberger 			result = (result & 0xffff0000) |
79f575ae1fSJoe Hershberger 				 ((result + leftover) & 0x0000ffff);
80f575ae1fSJoe Hershberger 		}
81f575ae1fSJoe Hershberger 		while (result >> 16)
82f575ae1fSJoe Hershberger 			result = (result & 0xFFFF) + (result >> 16);
83f575ae1fSJoe Hershberger 
84f575ae1fSJoe Hershberger 		if (odd)
85f575ae1fSJoe Hershberger 			result = ((result >> 8) & 0xff) |
86f575ae1fSJoe Hershberger 				 ((result & 0xff) << 8);
87f575ae1fSJoe Hershberger 	}
88f575ae1fSJoe Hershberger 
89f575ae1fSJoe Hershberger 	/* add up 16-bit and 17-bit words for 17+c bits */
90f575ae1fSJoe Hershberger 	result = (result & 0xffff) + (result >> 16);
91f575ae1fSJoe Hershberger 	/* add up 16-bit and 2-bit for 16+c bit */
92f575ae1fSJoe Hershberger 	result = (result & 0xffff) + (result >> 16);
93f575ae1fSJoe Hershberger 	/* add up carry.. */
94f575ae1fSJoe Hershberger 	result = (result & 0xffff) + (result >> 16);
95f575ae1fSJoe Hershberger 
96f575ae1fSJoe Hershberger 	/* negate */
97f575ae1fSJoe Hershberger 	csum = ~(ushort)result;
98f575ae1fSJoe Hershberger 
99f575ae1fSJoe Hershberger 	/* run time endian detection */
100f575ae1fSJoe Hershberger 	if (csum != htons(csum))	/* little endian */
101f575ae1fSJoe Hershberger 		csum = htons(csum);
102f575ae1fSJoe Hershberger 
103f575ae1fSJoe Hershberger 	return csum;
104f575ae1fSJoe Hershberger }
105f575ae1fSJoe Hershberger 
cdp_send_trigger(void)1066aede5b7SJoe Hershberger static int cdp_send_trigger(void)
107f575ae1fSJoe Hershberger {
108f575ae1fSJoe Hershberger 	uchar *pkt;
109f575ae1fSJoe Hershberger 	ushort *s;
110f575ae1fSJoe Hershberger 	ushort *cp;
111cb487f56SJoe Hershberger 	struct ethernet_hdr *et;
112f575ae1fSJoe Hershberger 	int len;
113f575ae1fSJoe Hershberger 	ushort chksum;
114f575ae1fSJoe Hershberger #if	defined(CONFIG_CDP_DEVICE_ID) || defined(CONFIG_CDP_PORT_ID)   || \
115f575ae1fSJoe Hershberger 	defined(CONFIG_CDP_VERSION)   || defined(CONFIG_CDP_PLATFORM)
116f575ae1fSJoe Hershberger 	char buf[32];
117f575ae1fSJoe Hershberger #endif
118f575ae1fSJoe Hershberger 
1191203fcceSJoe Hershberger 	pkt = net_tx_packet;
120cb487f56SJoe Hershberger 	et = (struct ethernet_hdr *)pkt;
121f575ae1fSJoe Hershberger 
122f575ae1fSJoe Hershberger 	/* NOTE: trigger sent not on any VLAN */
123f575ae1fSJoe Hershberger 
124f575ae1fSJoe Hershberger 	/* form ethernet header */
1250adb5b76SJoe Hershberger 	memcpy(et->et_dest, net_cdp_ethaddr, 6);
1260adb5b76SJoe Hershberger 	memcpy(et->et_src, net_ethaddr, 6);
127f575ae1fSJoe Hershberger 
128f575ae1fSJoe Hershberger 	pkt += ETHER_HDR_SIZE;
129f575ae1fSJoe Hershberger 
130f575ae1fSJoe Hershberger 	/* SNAP header */
1316aede5b7SJoe Hershberger 	memcpy((uchar *)pkt, cdp_snap_hdr, sizeof(cdp_snap_hdr));
1326aede5b7SJoe Hershberger 	pkt += sizeof(cdp_snap_hdr);
133f575ae1fSJoe Hershberger 
134f575ae1fSJoe Hershberger 	/* CDP header */
135f575ae1fSJoe Hershberger 	*pkt++ = 0x02;				/* CDP version 2 */
136f575ae1fSJoe Hershberger 	*pkt++ = 180;				/* TTL */
137f575ae1fSJoe Hershberger 	s = (ushort *)pkt;
138f575ae1fSJoe Hershberger 	cp = s;
139f575ae1fSJoe Hershberger 	/* checksum (0 for later calculation) */
140f575ae1fSJoe Hershberger 	*s++ = htons(0);
141f575ae1fSJoe Hershberger 
142f575ae1fSJoe Hershberger 	/* CDP fields */
143f575ae1fSJoe Hershberger #ifdef CONFIG_CDP_DEVICE_ID
144f575ae1fSJoe Hershberger 	*s++ = htons(CDP_DEVICE_ID_TLV);
145f575ae1fSJoe Hershberger 	*s++ = htons(CONFIG_CDP_DEVICE_ID);
1460adb5b76SJoe Hershberger 	sprintf(buf, CONFIG_CDP_DEVICE_ID_PREFIX "%pm", net_ethaddr);
147f575ae1fSJoe Hershberger 	memcpy((uchar *)s, buf, 16);
148f575ae1fSJoe Hershberger 	s += 16 / 2;
149f575ae1fSJoe Hershberger #endif
150f575ae1fSJoe Hershberger 
151f575ae1fSJoe Hershberger #ifdef CONFIG_CDP_PORT_ID
152f575ae1fSJoe Hershberger 	*s++ = htons(CDP_PORT_ID_TLV);
153f575ae1fSJoe Hershberger 	memset(buf, 0, sizeof(buf));
154f575ae1fSJoe Hershberger 	sprintf(buf, CONFIG_CDP_PORT_ID, eth_get_dev_index());
155f575ae1fSJoe Hershberger 	len = strlen(buf);
156f575ae1fSJoe Hershberger 	if (len & 1)	/* make it even */
157f575ae1fSJoe Hershberger 		len++;
158f575ae1fSJoe Hershberger 	*s++ = htons(len + 4);
159f575ae1fSJoe Hershberger 	memcpy((uchar *)s, buf, len);
160f575ae1fSJoe Hershberger 	s += len / 2;
161f575ae1fSJoe Hershberger #endif
162f575ae1fSJoe Hershberger 
163f575ae1fSJoe Hershberger #ifdef CONFIG_CDP_CAPABILITIES
164f575ae1fSJoe Hershberger 	*s++ = htons(CDP_CAPABILITIES_TLV);
165f575ae1fSJoe Hershberger 	*s++ = htons(8);
166f575ae1fSJoe Hershberger 	*(ulong *)s = htonl(CONFIG_CDP_CAPABILITIES);
167f575ae1fSJoe Hershberger 	s += 2;
168f575ae1fSJoe Hershberger #endif
169f575ae1fSJoe Hershberger 
170f575ae1fSJoe Hershberger #ifdef CONFIG_CDP_VERSION
171f575ae1fSJoe Hershberger 	*s++ = htons(CDP_VERSION_TLV);
172f575ae1fSJoe Hershberger 	memset(buf, 0, sizeof(buf));
173f575ae1fSJoe Hershberger 	strcpy(buf, CONFIG_CDP_VERSION);
174f575ae1fSJoe Hershberger 	len = strlen(buf);
175f575ae1fSJoe Hershberger 	if (len & 1)	/* make it even */
176f575ae1fSJoe Hershberger 		len++;
177f575ae1fSJoe Hershberger 	*s++ = htons(len + 4);
178f575ae1fSJoe Hershberger 	memcpy((uchar *)s, buf, len);
179f575ae1fSJoe Hershberger 	s += len / 2;
180f575ae1fSJoe Hershberger #endif
181f575ae1fSJoe Hershberger 
182f575ae1fSJoe Hershberger #ifdef CONFIG_CDP_PLATFORM
183f575ae1fSJoe Hershberger 	*s++ = htons(CDP_PLATFORM_TLV);
184f575ae1fSJoe Hershberger 	memset(buf, 0, sizeof(buf));
185f575ae1fSJoe Hershberger 	strcpy(buf, CONFIG_CDP_PLATFORM);
186f575ae1fSJoe Hershberger 	len = strlen(buf);
187f575ae1fSJoe Hershberger 	if (len & 1)	/* make it even */
188f575ae1fSJoe Hershberger 		len++;
189f575ae1fSJoe Hershberger 	*s++ = htons(len + 4);
190f575ae1fSJoe Hershberger 	memcpy((uchar *)s, buf, len);
191f575ae1fSJoe Hershberger 	s += len / 2;
192f575ae1fSJoe Hershberger #endif
193f575ae1fSJoe Hershberger 
194f575ae1fSJoe Hershberger #ifdef CONFIG_CDP_TRIGGER
195f575ae1fSJoe Hershberger 	*s++ = htons(CDP_TRIGGER_TLV);
196f575ae1fSJoe Hershberger 	*s++ = htons(8);
197f575ae1fSJoe Hershberger 	*(ulong *)s = htonl(CONFIG_CDP_TRIGGER);
198f575ae1fSJoe Hershberger 	s += 2;
199f575ae1fSJoe Hershberger #endif
200f575ae1fSJoe Hershberger 
201f575ae1fSJoe Hershberger #ifdef CONFIG_CDP_POWER_CONSUMPTION
202f575ae1fSJoe Hershberger 	*s++ = htons(CDP_POWER_CONSUMPTION_TLV);
203f575ae1fSJoe Hershberger 	*s++ = htons(6);
204f575ae1fSJoe Hershberger 	*s++ = htons(CONFIG_CDP_POWER_CONSUMPTION);
205f575ae1fSJoe Hershberger #endif
206f575ae1fSJoe Hershberger 
207f575ae1fSJoe Hershberger 	/* length of ethernet packet */
2081203fcceSJoe Hershberger 	len = (uchar *)s - ((uchar *)net_tx_packet + ETHER_HDR_SIZE);
209f575ae1fSJoe Hershberger 	et->et_protlen = htons(len);
210f575ae1fSJoe Hershberger 
2116aede5b7SJoe Hershberger 	len = ETHER_HDR_SIZE + sizeof(cdp_snap_hdr);
2126aede5b7SJoe Hershberger 	chksum = cdp_compute_csum((uchar *)net_tx_packet + len,
2131203fcceSJoe Hershberger 				  (uchar *)s - (net_tx_packet + len));
214f575ae1fSJoe Hershberger 	if (chksum == 0)
215f575ae1fSJoe Hershberger 		chksum = 0xFFFF;
216f575ae1fSJoe Hershberger 	*cp = htons(chksum);
217f575ae1fSJoe Hershberger 
2181203fcceSJoe Hershberger 	net_send_packet(net_tx_packet, (uchar *)s - net_tx_packet);
219f575ae1fSJoe Hershberger 	return 0;
220f575ae1fSJoe Hershberger }
221f575ae1fSJoe Hershberger 
cdp_timeout_handler(void)2226aede5b7SJoe Hershberger static void cdp_timeout_handler(void)
223f575ae1fSJoe Hershberger {
2246aede5b7SJoe Hershberger 	cdp_seq++;
225f575ae1fSJoe Hershberger 
2266aede5b7SJoe Hershberger 	if (cdp_seq < 3) {
227bc0571fcSJoe Hershberger 		net_set_timeout_handler(CDP_TIMEOUT, cdp_timeout_handler);
2286aede5b7SJoe Hershberger 		cdp_send_trigger();
229f575ae1fSJoe Hershberger 		return;
230f575ae1fSJoe Hershberger 	}
231f575ae1fSJoe Hershberger 
232f575ae1fSJoe Hershberger 	/* if not OK try again */
2336aede5b7SJoe Hershberger 	if (!cdp_ok)
234bc0571fcSJoe Hershberger 		net_start_again();
235f575ae1fSJoe Hershberger 	else
23622f6e99dSJoe Hershberger 		net_set_state(NETLOOP_SUCCESS);
237f575ae1fSJoe Hershberger }
238f575ae1fSJoe Hershberger 
cdp_receive(const uchar * pkt,unsigned len)2390b4c5ff4SJoe Hershberger void cdp_receive(const uchar *pkt, unsigned len)
240f575ae1fSJoe Hershberger {
241f575ae1fSJoe Hershberger 	const uchar *t;
242f575ae1fSJoe Hershberger 	const ushort *ss;
243f575ae1fSJoe Hershberger 	ushort type, tlen;
244f575ae1fSJoe Hershberger 	ushort vlan, nvlan;
245f575ae1fSJoe Hershberger 
246f575ae1fSJoe Hershberger 	/* minimum size? */
2476aede5b7SJoe Hershberger 	if (len < sizeof(cdp_snap_hdr) + 4)
248f575ae1fSJoe Hershberger 		goto pkt_short;
249f575ae1fSJoe Hershberger 
250f575ae1fSJoe Hershberger 	/* check for valid CDP SNAP header */
2516aede5b7SJoe Hershberger 	if (memcmp(pkt, cdp_snap_hdr, sizeof(cdp_snap_hdr)) != 0)
252f575ae1fSJoe Hershberger 		return;
253f575ae1fSJoe Hershberger 
2546aede5b7SJoe Hershberger 	pkt += sizeof(cdp_snap_hdr);
2556aede5b7SJoe Hershberger 	len -= sizeof(cdp_snap_hdr);
256f575ae1fSJoe Hershberger 
257f575ae1fSJoe Hershberger 	/* Version of CDP protocol must be >= 2 and TTL != 0 */
258f575ae1fSJoe Hershberger 	if (pkt[0] < 0x02 || pkt[1] == 0)
259f575ae1fSJoe Hershberger 		return;
260f575ae1fSJoe Hershberger 
261f575ae1fSJoe Hershberger 	/*
262f575ae1fSJoe Hershberger 	 * if version is greater than 0x02 maybe we'll have a problem;
263f575ae1fSJoe Hershberger 	 * output a warning
264f575ae1fSJoe Hershberger 	 */
265f575ae1fSJoe Hershberger 	if (pkt[0] != 0x02)
266f575ae1fSJoe Hershberger 		printf("**WARNING: CDP packet received with a protocol version "
267f575ae1fSJoe Hershberger 				"%d > 2\n", pkt[0] & 0xff);
268f575ae1fSJoe Hershberger 
2696aede5b7SJoe Hershberger 	if (cdp_compute_csum(pkt, len) != 0)
270f575ae1fSJoe Hershberger 		return;
271f575ae1fSJoe Hershberger 
272f575ae1fSJoe Hershberger 	pkt += 4;
273f575ae1fSJoe Hershberger 	len -= 4;
274f575ae1fSJoe Hershberger 
275f575ae1fSJoe Hershberger 	vlan = htons(-1);
276f575ae1fSJoe Hershberger 	nvlan = htons(-1);
277f575ae1fSJoe Hershberger 	while (len > 0) {
278f575ae1fSJoe Hershberger 		if (len < 4)
279f575ae1fSJoe Hershberger 			goto pkt_short;
280f575ae1fSJoe Hershberger 
281f575ae1fSJoe Hershberger 		ss = (const ushort *)pkt;
282f575ae1fSJoe Hershberger 		type = ntohs(ss[0]);
283f575ae1fSJoe Hershberger 		tlen = ntohs(ss[1]);
284f575ae1fSJoe Hershberger 		if (tlen > len)
285f575ae1fSJoe Hershberger 			goto pkt_short;
286f575ae1fSJoe Hershberger 
287f575ae1fSJoe Hershberger 		pkt += tlen;
288f575ae1fSJoe Hershberger 		len -= tlen;
289f575ae1fSJoe Hershberger 
290f575ae1fSJoe Hershberger 		ss += 2;	/* point ss to the data of the TLV */
291f575ae1fSJoe Hershberger 		tlen -= 4;
292f575ae1fSJoe Hershberger 
293f575ae1fSJoe Hershberger 		switch (type) {
294f575ae1fSJoe Hershberger 		case CDP_DEVICE_ID_TLV:
295f575ae1fSJoe Hershberger 			break;
296f575ae1fSJoe Hershberger 		case CDP_ADDRESS_TLV:
297f575ae1fSJoe Hershberger 			break;
298f575ae1fSJoe Hershberger 		case CDP_PORT_ID_TLV:
299f575ae1fSJoe Hershberger 			break;
300f575ae1fSJoe Hershberger 		case CDP_CAPABILITIES_TLV:
301f575ae1fSJoe Hershberger 			break;
302f575ae1fSJoe Hershberger 		case CDP_VERSION_TLV:
303f575ae1fSJoe Hershberger 			break;
304f575ae1fSJoe Hershberger 		case CDP_PLATFORM_TLV:
305f575ae1fSJoe Hershberger 			break;
306f575ae1fSJoe Hershberger 		case CDP_NATIVE_VLAN_TLV:
307f575ae1fSJoe Hershberger 			nvlan = *ss;
308f575ae1fSJoe Hershberger 			break;
309f575ae1fSJoe Hershberger 		case CDP_APPLIANCE_VLAN_TLV:
310f575ae1fSJoe Hershberger 			t = (const uchar *)ss;
311f575ae1fSJoe Hershberger 			while (tlen > 0) {
312f575ae1fSJoe Hershberger 				if (tlen < 3)
313f575ae1fSJoe Hershberger 					goto pkt_short;
314f575ae1fSJoe Hershberger 
315f575ae1fSJoe Hershberger 				ss = (const ushort *)(t + 1);
316f575ae1fSJoe Hershberger 
317f575ae1fSJoe Hershberger #ifdef CONFIG_CDP_APPLIANCE_VLAN_TYPE
318f575ae1fSJoe Hershberger 				if (t[0] == CONFIG_CDP_APPLIANCE_VLAN_TYPE)
319f575ae1fSJoe Hershberger 					vlan = *ss;
320f575ae1fSJoe Hershberger #else
321f575ae1fSJoe Hershberger 				/* XXX will this work; dunno */
322f575ae1fSJoe Hershberger 				vlan = ntohs(*ss);
323f575ae1fSJoe Hershberger #endif
324f575ae1fSJoe Hershberger 				t += 3; tlen -= 3;
325f575ae1fSJoe Hershberger 			}
326f575ae1fSJoe Hershberger 			break;
327f575ae1fSJoe Hershberger 		case CDP_TRIGGER_TLV:
328f575ae1fSJoe Hershberger 			break;
329f575ae1fSJoe Hershberger 		case CDP_POWER_CONSUMPTION_TLV:
330f575ae1fSJoe Hershberger 			break;
331f575ae1fSJoe Hershberger 		case CDP_SYSNAME_TLV:
332f575ae1fSJoe Hershberger 			break;
333f575ae1fSJoe Hershberger 		case CDP_SYSOBJECT_TLV:
334f575ae1fSJoe Hershberger 			break;
335f575ae1fSJoe Hershberger 		case CDP_MANAGEMENT_ADDRESS_TLV:
336f575ae1fSJoe Hershberger 			break;
337f575ae1fSJoe Hershberger 		}
338f575ae1fSJoe Hershberger 	}
339f575ae1fSJoe Hershberger 
3406aede5b7SJoe Hershberger 	cdp_appliance_vlan = vlan;
3416aede5b7SJoe Hershberger 	cdp_native_vlan = nvlan;
342f575ae1fSJoe Hershberger 
3436aede5b7SJoe Hershberger 	cdp_ok = 1;
344f575ae1fSJoe Hershberger 	return;
345f575ae1fSJoe Hershberger 
346f575ae1fSJoe Hershberger pkt_short:
347f575ae1fSJoe Hershberger 	printf("** CDP packet is too short\n");
348f575ae1fSJoe Hershberger 	return;
349f575ae1fSJoe Hershberger }
350f575ae1fSJoe Hershberger 
cdp_start(void)3516aede5b7SJoe Hershberger void cdp_start(void)
352f575ae1fSJoe Hershberger {
353f575ae1fSJoe Hershberger 	printf("Using %s device\n", eth_get_name());
3546aede5b7SJoe Hershberger 	cdp_seq = 0;
3556aede5b7SJoe Hershberger 	cdp_ok = 0;
356f575ae1fSJoe Hershberger 
3576aede5b7SJoe Hershberger 	cdp_native_vlan = htons(-1);
3586aede5b7SJoe Hershberger 	cdp_appliance_vlan = htons(-1);
359f575ae1fSJoe Hershberger 
360bc0571fcSJoe Hershberger 	net_set_timeout_handler(CDP_TIMEOUT, cdp_timeout_handler);
361f575ae1fSJoe Hershberger 
3626aede5b7SJoe Hershberger 	cdp_send_trigger();
363f575ae1fSJoe Hershberger }
364