9
0
Fork 0
barebox/net/lldp.c

89 lines
1.8 KiB
C
Raw Normal View History

/*
* 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