@ -36,17 +36,16 @@ const u8 net_cdp_ethaddr[6] = { 0x01, 0x00, 0x0c, 0xcc, 0xcc, 0xcc };
# define CDP_TIMEOUT 250UL /* one packet every 250ms */
static int CDPS eq;
static int CDPOK ;
static int cdp_s eq;
static int cdp_ok ;
ushort CDPNativeVLAN ;
ushort CDPApplianceVLAN ;
ushort cdp_native_vlan ;
ushort cdp_appliance_vlan ;
static const uchar CDP_SNAP _hdr[ 8 ] = {
static const uchar cdp_snap _hdr[ 8 ] = {
0xAA , 0xAA , 0x03 , 0x00 , 0x00 , 0x0C , 0x20 , 0x00 } ;
static ushort
CDP_compute_csum ( const uchar * buff , ushort len )
static ushort cdp_compute_csum ( const uchar * buff , ushort len )
{
ushort csum ;
int odd ;
@ -104,8 +103,7 @@ CDP_compute_csum(const uchar *buff, ushort len)
return csum ;
}
static int
CDPSendTrigger ( void )
static int cdp_send_trigger ( void )
{
uchar * pkt ;
ushort * s ;
@ -130,8 +128,8 @@ CDPSendTrigger(void)
pkt + = ETHER_HDR_SIZE ;
/* SNAP header */
memcpy ( ( uchar * ) pkt , CDP_SNAP _hdr, sizeof ( CDP_SNAP _hdr) ) ;
pkt + = sizeof ( CDP_SNAP _hdr) ;
memcpy ( ( uchar * ) pkt , cdp_snap _hdr, sizeof ( cdp_snap _hdr) ) ;
pkt + = sizeof ( cdp_snap _hdr) ;
/* CDP header */
* pkt + + = 0x02 ; /* CDP version 2 */
@ -210,8 +208,8 @@ CDPSendTrigger(void)
len = ( uchar * ) s - ( ( uchar * ) net_tx_packet + ETHER_HDR_SIZE ) ;
et - > et_protlen = htons ( len ) ;
len = ETHER_HDR_SIZE + sizeof ( CDP_SNAP _hdr) ;
chksum = CDP _compute_csum( ( uchar * ) net_tx_packet + len ,
len = ETHER_HDR_SIZE + sizeof ( cdp_snap _hdr) ;
chksum = cdp _compute_csum( ( uchar * ) net_tx_packet + len ,
( uchar * ) s - ( net_tx_packet + len ) ) ;
if ( chksum = = 0 )
chksum = 0xFFFF ;
@ -221,19 +219,18 @@ CDPSendTrigger(void)
return 0 ;
}
static void
CDPTimeout ( void )
static void cdp_timeout_handler ( void )
{
CDPS eq+ + ;
cdp_s eq+ + ;
if ( CDPS eq < 3 ) {
NetSetTimeout ( CDP_TIMEOUT , CDPTimeout ) ;
CDPSendT rigger( ) ;
if ( cdp_s eq < 3 ) {
NetSetTimeout ( CDP_TIMEOUT , cdp_timeout_handler ) ;
cdp_send_t rigger( ) ;
return ;
}
/* if not OK try again */
if ( ! CDPOK )
if ( ! cdp_ok )
NetStartAgain ( ) ;
else
net_set_state ( NETLOOP_SUCCESS ) ;
@ -247,15 +244,15 @@ void cdp_receive(const uchar *pkt, unsigned len)
ushort vlan , nvlan ;
/* minimum size? */
if ( len < sizeof ( CDP_SNAP _hdr) + 4 )
if ( len < sizeof ( cdp_snap _hdr) + 4 )
goto pkt_short ;
/* check for valid CDP SNAP header */
if ( memcmp ( pkt , CDP_SNAP _hdr, sizeof ( CDP_SNAP _hdr) ) ! = 0 )
if ( memcmp ( pkt , cdp_snap _hdr, sizeof ( cdp_snap _hdr) ) ! = 0 )
return ;
pkt + = sizeof ( CDP_SNAP _hdr) ;
len - = sizeof ( CDP_SNAP _hdr) ;
pkt + = sizeof ( cdp_snap _hdr) ;
len - = sizeof ( cdp_snap _hdr) ;
/* Version of CDP protocol must be >= 2 and TTL != 0 */
if ( pkt [ 0 ] < 0x02 | | pkt [ 1 ] = = 0 )
@ -269,7 +266,7 @@ void cdp_receive(const uchar *pkt, unsigned len)
printf ( " **WARNING: CDP packet received with a protocol version "
" %d > 2 \n " , pkt [ 0 ] & 0xff ) ;
if ( CDP _compute_csum( pkt , len ) ! = 0 )
if ( cdp _compute_csum( pkt , len ) ! = 0 )
return ;
pkt + = 4 ;
@ -340,28 +337,27 @@ void cdp_receive(const uchar *pkt, unsigned len)
}
}
CDPApplianceVLAN = vlan ;
CDPNativeVLAN = nvlan ;
cdp_appliance_vlan = vlan ;
cdp_native_vlan = nvlan ;
CDPOK = 1 ;
cdp_ok = 1 ;
return ;
pkt_short :
pkt_short :
printf ( " ** CDP packet is too short \n " ) ;
return ;
}
void
CDPStart ( void )
void cdp_start ( void )
{
printf ( " Using %s device \n " , eth_get_name ( ) ) ;
CDPS eq = 0 ;
CDPOK = 0 ;
cdp_s eq = 0 ;
cdp_ok = 0 ;
CDPNativeVLAN = htons ( - 1 ) ;
CDPApplianceVLAN = htons ( - 1 ) ;
cdp_native_vlan = htons ( - 1 ) ;
cdp_appliance_vlan = htons ( - 1 ) ;
NetSetTimeout ( CDP_TIMEOUT , CDPTimeout ) ;
NetSetTimeout ( CDP_TIMEOUT , cdp_timeout_handler ) ;
CDPSendT rigger( ) ;
cdp_send_t rigger( ) ;
}