[U-Boot] [PATCH 05/28] net: Move CDP out of net.c

Simon Glass sjg at chromium.org
Tue Jan 24 06:31:21 CET 2012


Hi Joe,

On Thu, Jan 19, 2012 at 4:53 PM, Joe Hershberger <joe.hershberger at ni.com> wrote:
> Signed-off-by: Joe Hershberger <joe.hershberger at ni.com>
> Cc: Joe Hershberger <joe.hershberger at gmail.com>
> Cc: Wolfgang Denk <wd at denx.de>
> ---
>  arch/powerpc/cpu/mpc8xx/fec.c |    2 +-
>  include/net.h                 |    9 +-
>  net/Makefile                  |    1 +
>  net/cdp.c                     |  380 +++++++++++++++++++++++++++++++++++++++++
>  net/cdp.h                     |   18 ++
>  net/net.c                     |  368 +---------------------------------------
>  6 files changed, 406 insertions(+), 372 deletions(-)
>  create mode 100644 net/cdp.c
>  create mode 100644 net/cdp.h
>
> diff --git a/arch/powerpc/cpu/mpc8xx/fec.c b/arch/powerpc/cpu/mpc8xx/fec.c
> index f2a2c3a..0bc1e5d 100644
> --- a/arch/powerpc/cpu/mpc8xx/fec.c
> +++ b/arch/powerpc/cpu/mpc8xx/fec.c
> @@ -274,7 +274,7 @@ static int fec_recv (struct eth_device *dev)
>  #if defined(CONFIG_CMD_CDP)
>                        if ((rx[0] & 1) != 0
>                            && memcmp ((uchar *) rx, NetBcastAddr, 6) != 0
> -                           && memcmp ((uchar *) rx, NetCDPAddr, 6) != 0)
> +                           && !is_cdp_packet((uchar *)rx))

Do you think the is_cdp_packet() change should be in a separate commit?

Regards,
Simon

>                                rx = NULL;
>  #endif
>                        /*
> diff --git a/include/net.h b/include/net.h
> index 09d1b51..0396b69 100644
> --- a/include/net.h
> +++ b/include/net.h
> @@ -355,10 +355,6 @@ extern uchar               NetEtherNullAddr[6];
>  extern ushort          NetOurVLAN;             /* Our VLAN */
>  extern ushort          NetOurNativeVLAN;       /* Our Native VLAN */
>
> -extern uchar   NetCDPAddr[6];          /* Ethernet CDP address */
> -extern ushort  CDPNativeVLAN;          /* CDP returned native VLAN */
> -extern ushort  CDPApplianceVLAN;       /* CDP returned appliance VLAN */
> -
>  extern int             NetState;               /* Network loop state */
>  #define NETLOOP_CONTINUE       1
>  #define NETLOOP_RESTART                2
> @@ -386,8 +382,9 @@ extern IPaddr_t     NetPingIP;                      /* the ip address to ping */
>
>  #if defined(CONFIG_CMD_CDP)
>  /* when CDP completes these hold the return values */
> -extern ushort CDPNativeVLAN;
> -extern ushort CDPApplianceVLAN;
> +extern ushort CDPNativeVLAN;           /* CDP returned native VLAN */
> +extern ushort CDPApplianceVLAN;                /* CDP returned appliance VLAN */
> +int is_cdp_packet(const uchar *et_addr);
>  #endif
>
>  #if defined(CONFIG_CMD_SNTP)
> diff --git a/net/Makefile b/net/Makefile
> index 5901046..b350bfc 100644
> --- a/net/Makefile
> +++ b/net/Makefile
> @@ -28,6 +28,7 @@ include $(TOPDIR)/config.mk
>  LIB    = $(obj)libnet.o
>
>  COBJS-$(CONFIG_CMD_NET)  += bootp.o
> +COBJS-$(CONFIG_CMD_CDP)  += cdp.o
>  COBJS-$(CONFIG_CMD_DNS)  += dns.o
>  COBJS-$(CONFIG_CMD_NET)  += eth.o
>  COBJS-$(CONFIG_CMD_NET)  += net.o
> diff --git a/net/cdp.c b/net/cdp.c
> new file mode 100644
> index 0000000..c5e54b2
> --- /dev/null
> +++ b/net/cdp.c
> @@ -0,0 +1,380 @@
> +/*
> + *     Copied from Linux Monitor (LiMon) - Networking.
> + *
> + *     Copyright 1994 - 2000 Neil Russell.
> + *     (See License)
> + *     Copyright 2000 Roland Borde
> + *     Copyright 2000 Paolo Scaffardi
> + *     Copyright 2000-2002 Wolfgang Denk, wd at denx.de
> + */
> +
> +#include <common.h>
> +#include <net.h>
> +#if defined(CONFIG_CDP_VERSION)
> +#include <timestamp.h>
> +#endif
> +
> +#include "cdp.h"
> +
> +/* Ethernet bcast address */
> +static const uchar NetCDPAddr[6] = { 0x01, 0x00, 0x0c, 0xcc, 0xcc, 0xcc };
> +
> +#define CDP_DEVICE_ID_TLV              0x0001
> +#define CDP_ADDRESS_TLV                        0x0002
> +#define CDP_PORT_ID_TLV                        0x0003
> +#define CDP_CAPABILITIES_TLV           0x0004
> +#define CDP_VERSION_TLV                        0x0005
> +#define CDP_PLATFORM_TLV               0x0006
> +#define CDP_NATIVE_VLAN_TLV            0x000a
> +#define CDP_APPLIANCE_VLAN_TLV         0x000e
> +#define CDP_TRIGGER_TLV                        0x000f
> +#define CDP_POWER_CONSUMPTION_TLV      0x0010
> +#define CDP_SYSNAME_TLV                        0x0014
> +#define CDP_SYSOBJECT_TLV              0x0015
> +#define CDP_MANAGEMENT_ADDRESS_TLV     0x0016
> +
> +#define CDP_TIMEOUT                    250UL   /* one packet every 250ms */
> +
> +static int CDPSeq;
> +static int CDPOK;
> +
> +ushort CDPNativeVLAN;
> +ushort CDPApplianceVLAN;
> +
> +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)
> +{
> +       ushort csum;
> +       int     odd;
> +       ulong   result = 0;
> +       ushort  leftover;
> +       ushort *p;
> +
> +       if (len > 0) {
> +               odd = 1 & (ulong)buff;
> +               if (odd) {
> +                       result = *buff << 8;
> +                       len--;
> +                       buff++;
> +               }
> +               while (len > 1) {
> +                       p = (ushort *)buff;
> +                       result += *p++;
> +                       buff = (uchar *)p;
> +                       if (result & 0x80000000)
> +                               result = (result & 0xFFFF) + (result >> 16);
> +                       len -= 2;
> +               }
> +               if (len) {
> +                       leftover = (signed short)(*(const signed char *)buff);
> +                       /* CISCO SUCKS big time! (and blows too):
> +                        * CDP uses the IP checksum algorithm with a twist;
> +                        * for the last byte it *sign* extends and sums.
> +                        */
> +                       result = (result & 0xffff0000) |
> +                                ((result + leftover) & 0x0000ffff);
> +               }
> +               while (result >> 16)
> +                       result = (result & 0xFFFF) + (result >> 16);
> +
> +               if (odd)
> +                       result = ((result >> 8) & 0xff) |
> +                                ((result & 0xff) << 8);
> +       }
> +
> +       /* add up 16-bit and 17-bit words for 17+c bits */
> +       result = (result & 0xffff) + (result >> 16);
> +       /* add up 16-bit and 2-bit for 16+c bit */
> +       result = (result & 0xffff) + (result >> 16);
> +       /* add up carry.. */
> +       result = (result & 0xffff) + (result >> 16);
> +
> +       /* negate */
> +       csum = ~(ushort)result;
> +
> +       /* run time endian detection */
> +       if (csum != htons(csum))        /* little endian */
> +               csum = htons(csum);
> +
> +       return csum;
> +}
> +
> +static int
> +CDPSendTrigger(void)
> +{
> +       uchar *pkt;
> +       ushort *s;
> +       ushort *cp;
> +       Ethernet_t *et;
> +       int len;
> +       ushort chksum;
> +#if    defined(CONFIG_CDP_DEVICE_ID) || defined(CONFIG_CDP_PORT_ID)   || \
> +       defined(CONFIG_CDP_VERSION)   || defined(CONFIG_CDP_PLATFORM)
> +       char buf[32];
> +#endif
> +
> +       pkt = NetTxPacket;
> +       et = (Ethernet_t *)pkt;
> +
> +       /* NOTE: trigger sent not on any VLAN */
> +
> +       /* form ethernet header */
> +       memcpy(et->et_dest, NetCDPAddr, 6);
> +       memcpy(et->et_src, NetOurEther, 6);
> +
> +       pkt += ETHER_HDR_SIZE;
> +
> +       /* SNAP header */
> +       memcpy((uchar *)pkt, CDP_SNAP_hdr, sizeof(CDP_SNAP_hdr));
> +       pkt += sizeof(CDP_SNAP_hdr);
> +
> +       /* CDP header */
> +       *pkt++ = 0x02;                          /* CDP version 2 */
> +       *pkt++ = 180;                           /* TTL */
> +       s = (ushort *)pkt;
> +       cp = s;
> +       /* checksum (0 for later calculation) */
> +       *s++ = htons(0);
> +
> +       /* CDP fields */
> +#ifdef CONFIG_CDP_DEVICE_ID
> +       *s++ = htons(CDP_DEVICE_ID_TLV);
> +       *s++ = htons(CONFIG_CDP_DEVICE_ID);
> +       sprintf(buf, CONFIG_CDP_DEVICE_ID_PREFIX "%pm", NetOurEther);
> +       memcpy((uchar *)s, buf, 16);
> +       s += 16 / 2;
> +#endif
> +
> +#ifdef CONFIG_CDP_PORT_ID
> +       *s++ = htons(CDP_PORT_ID_TLV);
> +       memset(buf, 0, sizeof(buf));
> +       sprintf(buf, CONFIG_CDP_PORT_ID, eth_get_dev_index());
> +       len = strlen(buf);
> +       if (len & 1)    /* make it even */
> +               len++;
> +       *s++ = htons(len + 4);
> +       memcpy((uchar *)s, buf, len);
> +       s += len / 2;
> +#endif
> +
> +#ifdef CONFIG_CDP_CAPABILITIES
> +       *s++ = htons(CDP_CAPABILITIES_TLV);
> +       *s++ = htons(8);
> +       *(ulong *)s = htonl(CONFIG_CDP_CAPABILITIES);
> +       s += 2;
> +#endif
> +
> +#ifdef CONFIG_CDP_VERSION
> +       *s++ = htons(CDP_VERSION_TLV);
> +       memset(buf, 0, sizeof(buf));
> +       strcpy(buf, CONFIG_CDP_VERSION);
> +       len = strlen(buf);
> +       if (len & 1)    /* make it even */
> +               len++;
> +       *s++ = htons(len + 4);
> +       memcpy((uchar *)s, buf, len);
> +       s += len / 2;
> +#endif
> +
> +#ifdef CONFIG_CDP_PLATFORM
> +       *s++ = htons(CDP_PLATFORM_TLV);
> +       memset(buf, 0, sizeof(buf));
> +       strcpy(buf, CONFIG_CDP_PLATFORM);
> +       len = strlen(buf);
> +       if (len & 1)    /* make it even */
> +               len++;
> +       *s++ = htons(len + 4);
> +       memcpy((uchar *)s, buf, len);
> +       s += len / 2;
> +#endif
> +
> +#ifdef CONFIG_CDP_TRIGGER
> +       *s++ = htons(CDP_TRIGGER_TLV);
> +       *s++ = htons(8);
> +       *(ulong *)s = htonl(CONFIG_CDP_TRIGGER);
> +       s += 2;
> +#endif
> +
> +#ifdef CONFIG_CDP_POWER_CONSUMPTION
> +       *s++ = htons(CDP_POWER_CONSUMPTION_TLV);
> +       *s++ = htons(6);
> +       *s++ = htons(CONFIG_CDP_POWER_CONSUMPTION);
> +#endif
> +
> +       /* length of ethernet packet */
> +       len = (uchar *)s - ((uchar *)NetTxPacket + ETHER_HDR_SIZE);
> +       et->et_protlen = htons(len);
> +
> +       len = ETHER_HDR_SIZE + sizeof(CDP_SNAP_hdr);
> +       chksum = CDP_compute_csum((uchar *)NetTxPacket + len,
> +                                 (uchar *)s - (NetTxPacket + len));
> +       if (chksum == 0)
> +               chksum = 0xFFFF;
> +       *cp = htons(chksum);
> +
> +       (void) eth_send(NetTxPacket, (uchar *)s - NetTxPacket);
> +       return 0;
> +}
> +
> +static void
> +CDPTimeout(void)
> +{
> +       CDPSeq++;
> +
> +       if (CDPSeq < 3) {
> +               NetSetTimeout(CDP_TIMEOUT, CDPTimeout);
> +               CDPSendTrigger();
> +               return;
> +       }
> +
> +       /* if not OK try again */
> +       if (!CDPOK)
> +               NetStartAgain();
> +       else
> +               NetState = NETLOOP_SUCCESS;
> +}
> +
> +static void
> +CDPDummyHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
> +               unsigned len)
> +{
> +       /* nothing */
> +}
> +
> +void
> +CDPHandler(const uchar *pkt, unsigned len)
> +{
> +       const uchar *t;
> +       const ushort *ss;
> +       ushort type, tlen;
> +       ushort vlan, nvlan;
> +
> +       /* minimum size? */
> +       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)
> +               return;
> +
> +       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)
> +               return;
> +
> +       /*
> +        * if version is greater than 0x02 maybe we'll have a problem;
> +        * output a warning
> +        */
> +       if (pkt[0] != 0x02)
> +               printf("**WARNING: CDP packet received with a protocol version "
> +                               "%d > 2\n", pkt[0] & 0xff);
> +
> +       if (CDP_compute_csum(pkt, len) != 0)
> +               return;
> +
> +       pkt += 4;
> +       len -= 4;
> +
> +       vlan = htons(-1);
> +       nvlan = htons(-1);
> +       while (len > 0) {
> +               if (len < 4)
> +                       goto pkt_short;
> +
> +               ss = (const ushort *)pkt;
> +               type = ntohs(ss[0]);
> +               tlen = ntohs(ss[1]);
> +               if (tlen > len)
> +                       goto pkt_short;
> +
> +               pkt += tlen;
> +               len -= tlen;
> +
> +               ss += 2;        /* point ss to the data of the TLV */
> +               tlen -= 4;
> +
> +               switch (type) {
> +               case CDP_DEVICE_ID_TLV:
> +                       break;
> +               case CDP_ADDRESS_TLV:
> +                       break;
> +               case CDP_PORT_ID_TLV:
> +                       break;
> +               case CDP_CAPABILITIES_TLV:
> +                       break;
> +               case CDP_VERSION_TLV:
> +                       break;
> +               case CDP_PLATFORM_TLV:
> +                       break;
> +               case CDP_NATIVE_VLAN_TLV:
> +                       nvlan = *ss;
> +                       break;
> +               case CDP_APPLIANCE_VLAN_TLV:
> +                       t = (const uchar *)ss;
> +                       while (tlen > 0) {
> +                               if (tlen < 3)
> +                                       goto pkt_short;
> +
> +                               ss = (const ushort *)(t + 1);
> +
> +#ifdef CONFIG_CDP_APPLIANCE_VLAN_TYPE
> +                               if (t[0] == CONFIG_CDP_APPLIANCE_VLAN_TYPE)
> +                                       vlan = *ss;
> +#else
> +                               /* XXX will this work; dunno */
> +                               vlan = ntohs(*ss);
> +#endif
> +                               t += 3; tlen -= 3;
> +                       }
> +                       break;
> +               case CDP_TRIGGER_TLV:
> +                       break;
> +               case CDP_POWER_CONSUMPTION_TLV:
> +                       break;
> +               case CDP_SYSNAME_TLV:
> +                       break;
> +               case CDP_SYSOBJECT_TLV:
> +                       break;
> +               case CDP_MANAGEMENT_ADDRESS_TLV:
> +                       break;
> +               }
> +       }
> +
> +       CDPApplianceVLAN = vlan;
> +       CDPNativeVLAN = nvlan;
> +
> +       CDPOK = 1;
> +       return;
> +
> + pkt_short:
> +       printf("** CDP packet is too short\n");
> +       return;
> +}
> +
> +void
> +CDPStart(void)
> +{
> +       printf("Using %s device\n", eth_get_name());
> +       CDPSeq = 0;
> +       CDPOK = 0;
> +
> +       CDPNativeVLAN = htons(-1);
> +       CDPApplianceVLAN = htons(-1);
> +
> +       NetSetTimeout(CDP_TIMEOUT, CDPTimeout);
> +       NetSetHandler(CDPDummyHandler);
> +
> +       CDPSendTrigger();
> +}
> +
> +int
> +is_cdp_packet(const uchar *et_addr)
> +{
> +       return memcmp(et_addr, NetCDPAddr, 6) == 0;
> +}
> diff --git a/net/cdp.h b/net/cdp.h
> new file mode 100644
> index 0000000..fef744e
> --- /dev/null
> +++ b/net/cdp.h
> @@ -0,0 +1,18 @@
> +/*
> + *     Copied from Linux Monitor (LiMon) - Networking.
> + *
> + *     Copyright 1994 - 2000 Neil Russell.
> + *     (See License)
> + *     Copyright 2000 Roland Borde
> + *     Copyright 2000 Paolo Scaffardi
> + *     Copyright 2000-2002 Wolfgang Denk, wd at denx.de
> + */
> +
> +#ifndef __CDP_H__
> +#define __CDP_H__
> +
> +void CDPStart(void);
> +void CDPHandler(const uchar *pkt, unsigned len);
> +
> +#endif /* __CDP_H__ */
> +
> diff --git a/net/net.c b/net/net.c
> index 1d6252f..48d3ca8 100644
> --- a/net/net.c
> +++ b/net/net.c
> @@ -91,8 +91,8 @@
>  #if defined(CONFIG_CMD_SNTP)
>  #include "sntp.h"
>  #endif
> -#if defined(CONFIG_CDP_VERSION)
> -#include <timestamp.h>
> +#if defined(CONFIG_CMD_CDP)
> +#include "cdp.h"
>  #endif
>  #if defined(CONFIG_CMD_DNS)
>  #include "dns.h"
> @@ -163,10 +163,6 @@ uchar              NetEtherNullAddr[6];
>  #ifdef CONFIG_API
>  void           (*push_packet)(volatile void *, int len) = 0;
>  #endif
> -#if defined(CONFIG_CMD_CDP)
> -/* Ethernet bcast address */
> -uchar          NetCDPAddr[6] = { 0x01, 0x00, 0x0c, 0xcc, 0xcc, 0xcc };
> -#endif
>  /* Network loop state */
>  int            NetState;
>  /* Tried all network devices */
> @@ -192,10 +188,6 @@ IPaddr_t   NetPingIP;
>  static void PingStart(void);
>  #endif
>
> -#if defined(CONFIG_CMD_CDP)
> -static void CDPStart(void);
> -#endif
> -
>  #if defined(CONFIG_CMD_SNTP)
>  /* NTP server IP address */
>  IPaddr_t       NetNtpServerIP;
> @@ -841,360 +833,6 @@ static void PingStart(void)
>  }
>  #endif
>
> -#if defined(CONFIG_CMD_CDP)
> -
> -#define CDP_DEVICE_ID_TLV              0x0001
> -#define CDP_ADDRESS_TLV                        0x0002
> -#define CDP_PORT_ID_TLV                        0x0003
> -#define CDP_CAPABILITIES_TLV           0x0004
> -#define CDP_VERSION_TLV                        0x0005
> -#define CDP_PLATFORM_TLV               0x0006
> -#define CDP_NATIVE_VLAN_TLV            0x000a
> -#define CDP_APPLIANCE_VLAN_TLV         0x000e
> -#define CDP_TRIGGER_TLV                        0x000f
> -#define CDP_POWER_CONSUMPTION_TLV      0x0010
> -#define CDP_SYSNAME_TLV                        0x0014
> -#define CDP_SYSOBJECT_TLV              0x0015
> -#define CDP_MANAGEMENT_ADDRESS_TLV     0x0016
> -
> -#define CDP_TIMEOUT                    250UL   /* one packet every 250ms */
> -
> -static int CDPSeq;
> -static int CDPOK;
> -
> -ushort CDPNativeVLAN;
> -ushort CDPApplianceVLAN;
> -
> -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)
> -{
> -       ushort csum;
> -       int     odd;
> -       ulong   result = 0;
> -       ushort  leftover;
> -       ushort *p;
> -
> -       if (len > 0) {
> -               odd = 1 & (ulong)buff;
> -               if (odd) {
> -                       result = *buff << 8;
> -                       len--;
> -                       buff++;
> -               }
> -               while (len > 1) {
> -                       p = (ushort *)buff;
> -                       result += *p++;
> -                       buff = (uchar *)p;
> -                       if (result & 0x80000000)
> -                               result = (result & 0xFFFF) + (result >> 16);
> -                       len -= 2;
> -               }
> -               if (len) {
> -                       leftover = (signed short)(*(const signed char *)buff);
> -                       /* CISCO SUCKS big time! (and blows too):
> -                        * CDP uses the IP checksum algorithm with a twist;
> -                        * for the last byte it *sign* extends and sums.
> -                        */
> -                       result = (result & 0xffff0000) |
> -                                ((result + leftover) & 0x0000ffff);
> -               }
> -               while (result >> 16)
> -                       result = (result & 0xFFFF) + (result >> 16);
> -
> -               if (odd)
> -                       result = ((result >> 8) & 0xff) |
> -                                ((result & 0xff) << 8);
> -       }
> -
> -       /* add up 16-bit and 17-bit words for 17+c bits */
> -       result = (result & 0xffff) + (result >> 16);
> -       /* add up 16-bit and 2-bit for 16+c bit */
> -       result = (result & 0xffff) + (result >> 16);
> -       /* add up carry.. */
> -       result = (result & 0xffff) + (result >> 16);
> -
> -       /* negate */
> -       csum = ~(ushort)result;
> -
> -       /* run time endian detection */
> -       if (csum != htons(csum))        /* little endian */
> -               csum = htons(csum);
> -
> -       return csum;
> -}
> -
> -int CDPSendTrigger(void)
> -{
> -       uchar *pkt;
> -       ushort *s;
> -       ushort *cp;
> -       Ethernet_t *et;
> -       int len;
> -       ushort chksum;
> -#if    defined(CONFIG_CDP_DEVICE_ID) || defined(CONFIG_CDP_PORT_ID)   || \
> -       defined(CONFIG_CDP_VERSION)   || defined(CONFIG_CDP_PLATFORM)
> -       char buf[32];
> -#endif
> -
> -       pkt = NetTxPacket;
> -       et = (Ethernet_t *)pkt;
> -
> -       /* NOTE: trigger sent not on any VLAN */
> -
> -       /* form ethernet header */
> -       memcpy(et->et_dest, NetCDPAddr, 6);
> -       memcpy(et->et_src, NetOurEther, 6);
> -
> -       pkt += ETHER_HDR_SIZE;
> -
> -       /* SNAP header */
> -       memcpy((uchar *)pkt, CDP_SNAP_hdr, sizeof(CDP_SNAP_hdr));
> -       pkt += sizeof(CDP_SNAP_hdr);
> -
> -       /* CDP header */
> -       *pkt++ = 0x02;                          /* CDP version 2 */
> -       *pkt++ = 180;                           /* TTL */
> -       s = (ushort *)pkt;
> -       cp = s;
> -       /* checksum (0 for later calculation) */
> -       *s++ = htons(0);
> -
> -       /* CDP fields */
> -#ifdef CONFIG_CDP_DEVICE_ID
> -       *s++ = htons(CDP_DEVICE_ID_TLV);
> -       *s++ = htons(CONFIG_CDP_DEVICE_ID);
> -       sprintf(buf, CONFIG_CDP_DEVICE_ID_PREFIX "%pm", NetOurEther);
> -       memcpy((uchar *)s, buf, 16);
> -       s += 16 / 2;
> -#endif
> -
> -#ifdef CONFIG_CDP_PORT_ID
> -       *s++ = htons(CDP_PORT_ID_TLV);
> -       memset(buf, 0, sizeof(buf));
> -       sprintf(buf, CONFIG_CDP_PORT_ID, eth_get_dev_index());
> -       len = strlen(buf);
> -       if (len & 1)    /* make it even */
> -               len++;
> -       *s++ = htons(len + 4);
> -       memcpy((uchar *)s, buf, len);
> -       s += len / 2;
> -#endif
> -
> -#ifdef CONFIG_CDP_CAPABILITIES
> -       *s++ = htons(CDP_CAPABILITIES_TLV);
> -       *s++ = htons(8);
> -       *(ulong *)s = htonl(CONFIG_CDP_CAPABILITIES);
> -       s += 2;
> -#endif
> -
> -#ifdef CONFIG_CDP_VERSION
> -       *s++ = htons(CDP_VERSION_TLV);
> -       memset(buf, 0, sizeof(buf));
> -       strcpy(buf, CONFIG_CDP_VERSION);
> -       len = strlen(buf);
> -       if (len & 1)    /* make it even */
> -               len++;
> -       *s++ = htons(len + 4);
> -       memcpy((uchar *)s, buf, len);
> -       s += len / 2;
> -#endif
> -
> -#ifdef CONFIG_CDP_PLATFORM
> -       *s++ = htons(CDP_PLATFORM_TLV);
> -       memset(buf, 0, sizeof(buf));
> -       strcpy(buf, CONFIG_CDP_PLATFORM);
> -       len = strlen(buf);
> -       if (len & 1)    /* make it even */
> -               len++;
> -       *s++ = htons(len + 4);
> -       memcpy((uchar *)s, buf, len);
> -       s += len / 2;
> -#endif
> -
> -#ifdef CONFIG_CDP_TRIGGER
> -       *s++ = htons(CDP_TRIGGER_TLV);
> -       *s++ = htons(8);
> -       *(ulong *)s = htonl(CONFIG_CDP_TRIGGER);
> -       s += 2;
> -#endif
> -
> -#ifdef CONFIG_CDP_POWER_CONSUMPTION
> -       *s++ = htons(CDP_POWER_CONSUMPTION_TLV);
> -       *s++ = htons(6);
> -       *s++ = htons(CONFIG_CDP_POWER_CONSUMPTION);
> -#endif
> -
> -       /* length of ethernet packet */
> -       len = (uchar *)s - ((uchar *)NetTxPacket + ETHER_HDR_SIZE);
> -       et->et_protlen = htons(len);
> -
> -       len = ETHER_HDR_SIZE + sizeof(CDP_SNAP_hdr);
> -       chksum = CDP_compute_csum((uchar *)NetTxPacket + len,
> -                                 (uchar *)s - (NetTxPacket + len));
> -       if (chksum == 0)
> -               chksum = 0xFFFF;
> -       *cp = htons(chksum);
> -
> -       (void) eth_send(NetTxPacket, (uchar *)s - NetTxPacket);
> -       return 0;
> -}
> -
> -static void
> -CDPTimeout(void)
> -{
> -       CDPSeq++;
> -
> -       if (CDPSeq < 3) {
> -               NetSetTimeout(CDP_TIMEOUT, CDPTimeout);
> -               CDPSendTrigger();
> -               return;
> -       }
> -
> -       /* if not OK try again */
> -       if (!CDPOK)
> -               NetStartAgain();
> -       else
> -               NetState = NETLOOP_SUCCESS;
> -}
> -
> -static void
> -CDPDummyHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
> -               unsigned len)
> -{
> -       /* nothing */
> -}
> -
> -static void
> -CDPHandler(const uchar *pkt, unsigned len)
> -{
> -       const uchar *t;
> -       const ushort *ss;
> -       ushort type, tlen;
> -       ushort vlan, nvlan;
> -
> -       /* minimum size? */
> -       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)
> -               return;
> -
> -       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)
> -               return;
> -
> -       /*
> -        * if version is greater than 0x02 maybe we'll have a problem;
> -        * output a warning
> -        */
> -       if (pkt[0] != 0x02)
> -               printf("**WARNING: CDP packet received with a protocol version "
> -                               "%d > 2\n", pkt[0] & 0xff);
> -
> -       if (CDP_compute_csum(pkt, len) != 0)
> -               return;
> -
> -       pkt += 4;
> -       len -= 4;
> -
> -       vlan = htons(-1);
> -       nvlan = htons(-1);
> -       while (len > 0) {
> -               if (len < 4)
> -                       goto pkt_short;
> -
> -               ss = (const ushort *)pkt;
> -               type = ntohs(ss[0]);
> -               tlen = ntohs(ss[1]);
> -               if (tlen > len)
> -                       goto pkt_short;
> -
> -               pkt += tlen;
> -               len -= tlen;
> -
> -               ss += 2;        /* point ss to the data of the TLV */
> -               tlen -= 4;
> -
> -               switch (type) {
> -               case CDP_DEVICE_ID_TLV:
> -                       break;
> -               case CDP_ADDRESS_TLV:
> -                       break;
> -               case CDP_PORT_ID_TLV:
> -                       break;
> -               case CDP_CAPABILITIES_TLV:
> -                       break;
> -               case CDP_VERSION_TLV:
> -                       break;
> -               case CDP_PLATFORM_TLV:
> -                       break;
> -               case CDP_NATIVE_VLAN_TLV:
> -                       nvlan = *ss;
> -                       break;
> -               case CDP_APPLIANCE_VLAN_TLV:
> -                       t = (const uchar *)ss;
> -                       while (tlen > 0) {
> -                               if (tlen < 3)
> -                                       goto pkt_short;
> -
> -                               ss = (const ushort *)(t + 1);
> -
> -#ifdef CONFIG_CDP_APPLIANCE_VLAN_TYPE
> -                               if (t[0] == CONFIG_CDP_APPLIANCE_VLAN_TYPE)
> -                                       vlan = *ss;
> -#else
> -                               /* XXX will this work; dunno */
> -                               vlan = ntohs(*ss);
> -#endif
> -                               t += 3; tlen -= 3;
> -                       }
> -                       break;
> -               case CDP_TRIGGER_TLV:
> -                       break;
> -               case CDP_POWER_CONSUMPTION_TLV:
> -                       break;
> -               case CDP_SYSNAME_TLV:
> -                       break;
> -               case CDP_SYSOBJECT_TLV:
> -                       break;
> -               case CDP_MANAGEMENT_ADDRESS_TLV:
> -                       break;
> -               }
> -       }
> -
> -       CDPApplianceVLAN = vlan;
> -       CDPNativeVLAN = nvlan;
> -
> -       CDPOK = 1;
> -       return;
> -
> - pkt_short:
> -       printf("** CDP packet is too short\n");
> -       return;
> -}
> -
> -static void CDPStart(void)
> -{
> -       printf("Using %s device\n", eth_get_name());
> -       CDPSeq = 0;
> -       CDPOK = 0;
> -
> -       CDPNativeVLAN = htons(-1);
> -       CDPApplianceVLAN = htons(-1);
> -
> -       NetSetTimeout(CDP_TIMEOUT, CDPTimeout);
> -       NetSetHandler(CDPDummyHandler);
> -
> -       CDPSendTrigger();
> -}
> -#endif
> -
>  #ifdef CONFIG_IP_DEFRAG
>  /*
>  * This function collects fragments in a single packet, according
> @@ -1463,7 +1101,7 @@ NetReceive(volatile uchar *inpkt, int len)
>
>  #if defined(CONFIG_CMD_CDP)
>        /* keep track if packet is CDP */
> -       iscdp = memcmp(et->et_dest, NetCDPAddr, 6) == 0;
> +       iscdp = is_cdp_packet(et->et_dest);
>  #endif
>
>        myvlanid = ntohs(NetOurVLAN);
> --
> 1.6.0.2
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot


More information about the U-Boot mailing list