net: Initial frame to be able to send LLDP frames from barebox
Fixes: SYS#488
This commit is contained in:
parent
1a06d18910
commit
65cd4bea41
|
@ -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
|
||||
|
|
|
@ -0,0 +1,88 @@
|
|||
/*
|
||||
* lldp.c - send LLDP frames
|
||||
*
|
||||
* Copyright (C) 2014 Holger Hans Peter Freyther
|
||||
*/
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <complete.h>
|
||||
#include <net.h>
|
||||
|
||||
|
||||
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
|
Loading…
Reference in New Issue