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