From 65cd4bea41e5a6b1b0a948850e3a1b0e77197faa Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Thu, 20 Nov 2014 20:39:17 +0100 Subject: [PATCH] net: Initial frame to be able to send LLDP frames from barebox Fixes: SYS#488 --- net/Makefile | 1 + net/lldp.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 net/lldp.c diff --git a/net/Makefile b/net/Makefile index 907dc28b9..85b0a2398 100644 --- a/net/Makefile +++ b/net/Makefile @@ -6,3 +6,4 @@ obj-$(CONFIG_CMD_PING) += ping.o obj-$(CONFIG_NET_RESOLV)+= dns.o obj-$(CONFIG_NET_NETCONSOLE) += netconsole.o obj-$(CONFIG_NET_IFUP) += ifup.o +obj-$(CONFIG_NET) += lldp.o diff --git a/net/lldp.c b/net/lldp.c new file mode 100644 index 000000000..7b9797f73 --- /dev/null +++ b/net/lldp.c @@ -0,0 +1,88 @@ +/* + * lldp.c - send LLDP frames + * + * Copyright (C) 2014 Holger Hans Peter Freyther + */ +#include +#include +#include +#include + + +static int do_lldp(int argc, char **argv) +{ + static uint8_t lldp_mult[] = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x0e }; + static char *lldp_packet, *data, *start; + struct eth_device *edev = eth_get_current(); + struct ethernet *et; + int ret; + + if (!edev) + return -ENETDOWN; + + if (!is_valid_ether_addr(edev->ethaddr)) { + char str[sizeof("xx:xx:xx:xx:xx:xx")]; + random_ether_addr(edev->ethaddr); + ethaddr_to_string(edev->ethaddr, str); + printf("warning: No MAC address set. Using random address %s\n", str); + dev_set_param(&edev->dev, "ethaddr", str); + } + + if (!lldp_packet) { + lldp_packet = net_alloc_packet(); + if (!lldp_packet) + return -ENOMEM; + } + + et = (struct ethernet *)lldp_packet; + memcpy(et->et_src, edev->ethaddr, 6); + memcpy(et->et_dest, lldp_mult, 6); + et->et_protlen = htons(0x88cc); + + data = start = lldp_packet + ETHER_HDR_SIZE; + + /* chassis id */ + *data++ = 0x02; + *data++ = 0x06; + *data++ = 0x05; + *data++ = 0x00; + *data++ = 0x00; + *data++ = 0x00; + *data++ = 0x00; + *data++ = 0x00; + + /* port id */ + *data++ = 0x04; + *data++ = 0x02; + *data++ = 0x07; + *data++ = 0x5A; + + /* TTL */ + *data++ = 0x06; + *data++ = 0x02; + *data++ = 0x00; + *data++ = 0xb4; + + /* end */ + *data++ = 0x00; + *data++ = 0x00; + + ret = eth_send(edev, lldp_packet, ETHER_HDR_SIZE + (data-start)); + if (ret) + return ret; + + return 0; +} + +BAREBOX_CMD_HELP_START(lldp) +BAREBOX_CMD_HELP_TEXT("Options:") +BAREBOX_CMD_HELP_END + +BAREBOX_CMD_START(lldp) + .cmd = do_lldp, + BAREBOX_CMD_DESC("Send LLDP multicast packet") + BAREBOX_CMD_OPTS("[]") + BAREBOX_CMD_GROUP(CMD_GRP_NET) + BAREBOX_CMD_HELP(cmd_lldp_help) + BAREBOX_CMD_COMPLETE(empty_complete) +BAREBOX_CMD_END