aboutsummaryrefslogtreecommitdiff
path: root/net-mgmt/openlldp/files/patch-lldp_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'net-mgmt/openlldp/files/patch-lldp_main.c')
-rw-r--r--net-mgmt/openlldp/files/patch-lldp_main.c650
1 files changed, 650 insertions, 0 deletions
diff --git a/net-mgmt/openlldp/files/patch-lldp_main.c b/net-mgmt/openlldp/files/patch-lldp_main.c
new file mode 100644
index 000000000000..743b4bc87aa4
--- /dev/null
+++ b/net-mgmt/openlldp/files/patch-lldp_main.c
@@ -0,0 +1,650 @@
+--- src/lldp_main.c 2007/04/01 04:03:26 1.78
++++ src/lldp_main.c 2007/04/18 04:13:33 1.84
+@@ -28,8 +28,6 @@
+ #ifdef __FREEBSD__
+ #include <netinet/in.h>
+ #include <net/if_dl.h>
+-#include <sys/socket.h>
+-#include <net/if.h>
+ #include <net/if_arp.h>
+ #include <net/if_media.h>
+ #include <net/ethernet.h>
+@@ -59,169 +57,184 @@
+ void cleanupLLDP();
+ void handle_segfault();
+
+-#define MIN_INTERFACE 1
++#define IF_NAMESIZE 16
++char *iface_list[IF_NAMESIZE];
++int iface_filter = 0; /* boolean */
+
+ struct lldp_port *lldp_ports = NULL;
+
+ void walk_port_list() {
+- struct lldp_port *lldp_port = lldp_ports;
++ struct lldp_port *lldp_port = lldp_ports;
+
+- while(lldp_port != NULL) {
+- debug_printf(DEBUG_INT, "Interface structure @ %X\n", lldp_port);
+- debug_printf(DEBUG_INT, "\tName: %s\n", lldp_port->if_name);
+- debug_printf(DEBUG_INT, "\tIndex: %d\n", lldp_port->if_index);
+- debug_printf(DEBUG_INT, "\tMTU: %d\n", lldp_port->mtu);
+- debug_printf(DEBUG_INT, "\tMAC: %X:%X:%X:%X:%X:%X\n", lldp_port->source_mac[0], lldp_port->source_mac[1], lldp_port->source_mac[2] , lldp_port->source_mac[3] , lldp_port->source_mac[4] , lldp_port->source_mac[5]);
+- debug_printf(DEBUG_INT, "\tIP: %d.%d.%d.%d\n", lldp_port->source_ipaddr[0], lldp_port->source_ipaddr[1], lldp_port->source_ipaddr[2], lldp_port->source_ipaddr[3]);
+- lldp_port = lldp_port->next;
+- }
++ while(lldp_port != NULL) {
++ debug_printf(DEBUG_INT, "Interface structure @ %X\n", lldp_port);
++ debug_printf(DEBUG_INT, "\tName: %s\n", lldp_port->if_name);
++ debug_printf(DEBUG_INT, "\tIndex: %d\n", lldp_port->if_index);
++ debug_printf(DEBUG_INT, "\tMTU: %d\n", lldp_port->mtu);
++ debug_printf(DEBUG_INT, "\tMAC: %X:%X:%X:%X:%X:%X\n", lldp_port->source_mac[0]
++ , lldp_port->source_mac[1]
++ , lldp_port->source_mac[2]
++ , lldp_port->source_mac[3]
++ , lldp_port->source_mac[4]
++ , lldp_port->source_mac[5]);
++ debug_printf(DEBUG_INT, "\tIP: %d.%d.%d.%d\n", lldp_port->source_ipaddr[0]
++ , lldp_port->source_ipaddr[1]
++ , lldp_port->source_ipaddr[2]
++ , lldp_port->source_ipaddr[3]);
++ lldp_port = lldp_port->next;
++ }
+ }
+
+ int main(int argc, char *argv[])
+ {
+- uid_t uid;
+- int op = 0;
+- char *theOpts = "c:i:d:f:s";
+- int socket_width = 0;
+- time_t current_time = 0;
+- time_t last_check = 0;
+- struct timeval timeout;
+- int result;
+- struct lldp_port *lldp_port = NULL;
+-
+- /* Needed for select() */
+- fd_set readfds;
+-
+- program = argv[0];
+-
+- // get uid of user executing program.
+- uid = getuid();
+-
+- if (uid != 0) {
+- debug_printf(DEBUG_NORMAL, "You must be running as root to run %s!\n", program);
+- exit(0);
+- }
+-
+- // Process any arguments we were passed in.
+- while ((op = getopt(argc, argv, theOpts)) != EOF) {
+- switch (op) {
+- case 'd':
+- // Set the debug level.
+- if ((atoi(optarg) == 0) && (optarg[0] != '0')) {
+- debug_alpha_set_flags(optarg);
+- } else {
+- debug_set_flags(atoi(optarg));
+- }
+- break;
+-
+- default:
+- usage();
+- exit(0);
+- break;
+- };
+- }
+-
+- /* Initialize the LLDP subsystem */
+- /* This should happen on a per-interface basis */
+- if(initializeLLDP() != 0) {
+- debug_printf(DEBUG_NORMAL, "[Error] LLDP Subsystem Initialization Falure\n");
+- debug_printf(DEBUG_NORMAL, "[Error] (%d) : %s (%s:%d)\n", errno, strerror(errno), __FUNCTION__, __LINE__);
+- }
+-
+- get_sys_desc();
+- get_sys_fqdn();
+-
+- while(1) {
+- /* Set up select() */
+- FD_ZERO(&readfds);
++ uid_t uid;
++ int op = 0;
++ char *theOpts = "c:i:d:f:s:h";
++ int socket_width = 0;
++ time_t current_time = 0;
++ time_t last_check = 0;
++ struct timeval timeout;
++ int result;
++ struct lldp_port *lldp_port = NULL;
++
++ /* Needed for select() */
++ fd_set readfds;
++
++ program = argv[0];
++
++ // get uid of user executing program.
++ uid = getuid();
++
++ if (uid != 0) {
++ debug_printf(DEBUG_NORMAL, "You must be running as root to run %s!\n", program);
++ exit(0);
++ }
+
+- lldp_port = lldp_ports;
++ // Process any arguments we were passed in.
++ while ((op = getopt(argc, argv, theOpts)) != EOF) {
++ switch (op) {
++ case 'd':
++ // Set the debug level.
++ if ((atoi(optarg) == 0) && (optarg[0] != '0')) {
++ debug_alpha_set_flags(optarg);
++ } else {
++ debug_set_flags(atoi(optarg));
++ }
++ break;
++ case 'i':
++ iface_filter = 1;
++ memcpy(iface_list, optarg, strlen(optarg));
++ iface_list[IF_NAMESIZE] = '\0';
++ debug_printf(DEBUG_NORMAL, "Using interface %s\n", iface_list);
++ break;
++ case 'h':
++ default:
++ usage();
++ exit(0);
++ break;
++ };
++ }
+
+- while(lldp_port != NULL) {
+- // This is not the interface you are looking for...
+- if(lldp_port->if_name == NULL)
+- {
+- debug_printf(DEBUG_NORMAL, "[ERROR] Interface index %d with name is NULL at: %s():%d\n", lldp_port->if_index, __FUNCTION__, __LINE__);
+- continue;
+- }
+-
+- FD_SET(lldp_port->socket, &readfds);
+-
+- if(lldp_port->socket > socket_width)
+- {
+- socket_width = lldp_port->socket;
+- }
+-
+- lldp_port = lldp_port->next;
+-
++ /* Initialize the LLDP subsystem */
++ /* This should happen on a per-interface basis */
++ if(initializeLLDP() == 0) {
++ debug_printf(DEBUG_NORMAL, "No interface found to listen on\n");
+ }
+
+- time(&current_time);
+-
+- // Will be used to tell select how long to wait for...
+- timeout.tv_sec = 1;
+- timeout.tv_usec = 0;
+-
+- // Timeout after 1 second if nothing is ready
+- result = select(socket_width+1, &readfds, NULL, NULL, &timeout);
+-
+- // Everything is cool... process the sockets
+- lldp_port = lldp_ports;
+-
+- while(lldp_port != NULL) {
+- // This is not the interface you are looking for...
+- if(lldp_port->if_name == NULL) {
+- debug_printf(DEBUG_NORMAL, "[ERROR] Interface index %d with name is NULL at: %s():%d\n", lldp_port->if_index, __FUNCTION__, __LINE__);
+- continue;
+- }
+-
+- if(result > 0) {
+- if(FD_ISSET(lldp_port->socket, &readfds)) {
+- debug_printf(DEBUG_INT, "%s is readable!\n", lldp_port->if_name);
+-
+- // Get the frame back from the OS-specific frame handler.
+- lldp_read(lldp_port);
+-
+- if(lldp_port->rx.recvsize <= 0) {
+- if(errno != EAGAIN && errno != ENETDOWN) {
+- printf("Error: (%d) : %s (%s:%d)\n", errno, strerror(errno), __FUNCTION__, __LINE__);
+- }
+- } else {
+- debug_printf(DEBUG_INT, "Got an LLDP frame %d bytes long on %s!\n", lldp_port->rx.recvsize, lldp_port->if_name);
+-
+- // debug_hex_dump(DEBUG_INT, lldp_port->rx.frame, lldp_port->rx.recvsize);
+-
+- // Mark that we received a frame so the state machine can process it.
+- lldp_port->rx.rcvFrame = 1;
+-
+- rxStatemachineRun(lldp_port);
+- }
+- }
+- }
+-
+- if((result == 0) || (current_time > last_check)) {
+- lldp_port->tick = 1;
+-
+- txStatemachineRun(lldp_port);
+- rxStatemachineRun(lldp_port);
+-
+- lldp_port->tick = 0;
+- }
+-
+- if(result < 0) {
+- if(errno != EINTR) {
+- debug_printf(DEBUG_NORMAL, "[ERROR] %s\n", strerror(errno));
+- }
+- }
+-
+- lldp_port = lldp_port->next;
++ get_sys_desc();
++ get_sys_fqdn();
++
++ while(1) {
++ /* Set up select() */
++ FD_ZERO(&readfds);
++
++ lldp_port = lldp_ports;
++
++ while(lldp_port != NULL) {
++ // This is not the interface you are looking for...
++ if(lldp_port->if_name == NULL)
++ {
++ debug_printf(DEBUG_NORMAL, "[ERROR] Interface index %d with name is NULL at: %s():%d\n", lldp_port->if_index, __FUNCTION__, __LINE__);
++ continue;
++ }
++
++ FD_SET(lldp_port->socket, &readfds);
++
++ if(lldp_port->socket > socket_width)
++ {
++ socket_width = lldp_port->socket;
++ }
++
++ lldp_port = lldp_port->next;
++
++ }
++
++ time(&current_time);
++
++ // Will be used to tell select how long to wait for...
++ timeout.tv_sec = 1;
++ timeout.tv_usec = 0;
++
++ // Timeout after 1 second if nothing is ready
++ result = select(socket_width+1, &readfds, NULL, NULL, &timeout);
++
++ // Everything is cool... process the sockets
++ lldp_port = lldp_ports;
+
++ while(lldp_port != NULL) {
++ // This is not the interface you are looking for...
++ if(lldp_port->if_name == NULL) {
++ debug_printf(DEBUG_NORMAL, "[ERROR] Interface index %d with name is NULL at: %s():%d\n", lldp_port->if_index, __FUNCTION__, __LINE__);
++ continue;
++ }
++
++ if(result > 0) {
++ if(FD_ISSET(lldp_port->socket, &readfds)) {
++ debug_printf(DEBUG_INT, "%s is readable!\n", lldp_port->if_name);
++
++ // Get the frame back from the OS-specific frame handler.
++ lldp_read(lldp_port);
++
++ if(lldp_port->rx.recvsize <= 0) {
++ if(errno != EAGAIN && errno != ENETDOWN) {
++ printf("Error: (%d) : %s (%s:%d)\n", errno, strerror(errno), __FUNCTION__, __LINE__);
++ }
++ } else {
++ debug_printf(DEBUG_INT, "Got an LLDP frame %d bytes long on %s!\n", lldp_port->rx.recvsize, lldp_port->if_name);
++
++ // debug_hex_dump(DEBUG_INT, lldp_port->rx.frame, lldp_port->rx.recvsize);
++
++ // Mark that we received a frame so the state machine can process it.
++ lldp_port->rx.rcvFrame = 1;
++
++ rxStatemachineRun(lldp_port);
++ }
++ }
++ }
++
++ if((result == 0) || (current_time > last_check)) {
++ lldp_port->tick = 1;
++
++ txStatemachineRun(lldp_port);
++ rxStatemachineRun(lldp_port);
++
++ lldp_port->tick = 0;
++ }
++
++ if(result < 0) {
++ if(errno != EINTR) {
++ debug_printf(DEBUG_NORMAL, "[ERROR] %s\n", strerror(errno));
++ }
++ }
++
++ lldp_port = lldp_port->next;
++
++ }
++
++ time(&last_check);
+ }
+-
+- time(&last_check);
+-}
+-
+- return 0;
++
++ return 0;
+ }
+
+
+@@ -232,124 +245,130 @@
+ ***************************************/
+ void handle_segfault()
+ {
+- fprintf(stderr, "[FATAL] SIGSEGV (Segmentation Fault)!\n");
++ fprintf(stderr, "[FATAL] SIGSEGV (Segmentation Fault)!\n");
+
+- fflush(stderr); fflush(stdout);
+- exit(-1);
++ fflush(stderr); fflush(stdout);
++ exit(-1);
+ }
+
+ int initializeLLDP()
+ {
+- int if_index = 0;
+- char if_name[IF_NAMESIZE];
+- struct lldp_port *lldp_port = NULL;
+-
+- /* We need to initialize an LLDP port-per interface */
+- /* "lldp_port" will be changed to point at the interface currently being serviced */
+- for (if_index = MIN_INTERFACE; if_index < MAX_INTERFACES; if_index++)
++ int if_index = 0;
++ char if_name[IF_NAMESIZE];
++ struct lldp_port *lldp_port = NULL;
++ int nb_ifaces = 0;
++
++ /* We need to initialize an LLDP port-per interface */
++ /* "lldp_port" will be changed to point at the interface currently being serviced */
++ for (if_index = MIN_INTERFACES; if_index < MAX_INTERFACES; if_index++)
+ {
+- if(if_indextoname(if_index, &if_name[0]) != NULL)
+- {
+- if(strncmp(if_name, "wlt", 3) == 0) {
+- debug_printf(DEBUG_NORMAL, "Skipping WLT interface because it's voodoo\n");
+- continue;
+- }
+-
+- /* Create our new interface struct */
+- lldp_port = malloc(sizeof(struct lldp_port));
+-
+- /* Add it to the global list */
+- lldp_port->next = lldp_ports;
+-
+- lldp_port->if_index = if_index;
+- lldp_port->if_name = malloc(IF_NAMESIZE);
+- memcpy(lldp_port->if_name, if_name, IF_NAMESIZE);
+-
+- if(lldp_port->if_name != NULL) {
+- debug_printf(DEBUG_INT, "%s (index %d) found.\n", lldp_port->if_name, lldp_port->if_index);
+-
+- memcpy(&lldp_port->if_name[0], if_name, IF_NAMESIZE);
+-
+- debug_printf(DEBUG_INT, "Initializing interface: '%s'\n", lldp_port->if_name);
+-
+- // We want the first state to be LLDP_WAIT_PORT_OPERATIONAL, so we'll blank out everything here.
+- lldp_port->portEnabled = 1;
+-
+- /* Initialize the socket for this interface */
+- if(socketInitializeLLDP(lldp_port) != 0) {
+- debug_printf(DEBUG_NORMAL, "[ERROR] Problem initializing socket for %s\n", lldp_port->if_name);
+- free(lldp_port->if_name);
+- lldp_port->if_name = NULL;
+- free(lldp_port);
+- lldp_port = NULL;
+- continue;
+- } else {
+- debug_printf(DEBUG_EXCESSIVE, "Finished initializing socket for index %d with name %s\n", lldp_port->if_index, lldp_port->if_name);
+- }
+-
+- debug_printf(DEBUG_EXCESSIVE, "Initializing TX SM for index %d with name %s\n", lldp_port->if_index, lldp_port->if_name);
+- lldp_port->tx.state = TX_LLDP_INITIALIZE;
+- txInitializeLLDP(lldp_port);
+- debug_printf(DEBUG_EXCESSIVE, "Initializing RX SM for index %d with name %s\n", lldp_port->if_index, lldp_port->if_name);
+- lldp_port->rx.state = LLDP_WAIT_PORT_OPERATIONAL;
+- rxInitializeLLDP(lldp_port);
+- lldp_port->portEnabled = 0;
+- lldp_port->adminStatus = 3;
+-
+- debug_printf(DEBUG_EXCESSIVE, "Initializing TLV subsystem for index %d with name %s\n", lldp_port->if_index, lldp_port->if_name);
+- /* Initialize the TLV subsystem for this interface */
+- tlvInitializeLLDP(lldp_port);
+-
+- debug_printf(DEBUG_EXCESSIVE, "Adding index %d with name %s to global port list\n", lldp_port->if_index, lldp_port->if_name);
+- /* Reset the global list to point at the top of the list */
+- /* We only want to get here if initialization succeeded */
+- lldp_ports = lldp_port;
+- } else {
+- free(lldp_port);
+- lldp_port = NULL;
+- }
+-
+- }
++ if(if_indextoname(if_index, if_name) == NULL)
++ continue;
++
++ /* keep only the iface specified by -i */
++ if (iface_filter) {
++ if(strncmp(if_name, (const char*)iface_list, IF_NAMESIZE) != 0) {
++ debug_printf(DEBUG_NORMAL, "Skipping interface %s (not %s)\n", if_name, iface_list);
++ continue;
++ }
++ }
++
++ if(strncmp(if_name, "wlt", 3) == 0) {
++ debug_printf(DEBUG_NORMAL, "Skipping WLT interface because it's voodoo\n");
++ continue;
++ }
++
++ /* Create our new interface struct */
++ lldp_port = malloc(sizeof(struct lldp_port));
++
++ /* Add it to the global list */
++ lldp_port->next = lldp_ports;
++
++ lldp_port->if_index = if_index;
++ lldp_port->if_name = malloc(IF_NAMESIZE);
++ if(lldp_port->if_name == NULL) {
++ free(lldp_port);
++ lldp_port = NULL;
++ continue;
++ }
++
++ nb_ifaces++;
++ memcpy(lldp_port->if_name, if_name, IF_NAMESIZE);
++
++ debug_printf(DEBUG_INT, "%s (index %d) found. Initializing...\n", lldp_port->if_name, lldp_port->if_index);
++
++ // We want the first state to be LLDP_WAIT_PORT_OPERATIONAL, so we'll blank out everything here.
++ lldp_port->portEnabled = 1;
++
++ /* Initialize the socket for this interface */
++ if(socketInitializeLLDP(lldp_port) != 0) {
++ debug_printf(DEBUG_NORMAL, "[ERROR] Problem initializing socket for %s\n", lldp_port->if_name);
++ free(lldp_port->if_name);
++ lldp_port->if_name = NULL;
++ free(lldp_port);
++ lldp_port = NULL;
++ continue;
++ } else {
++ debug_printf(DEBUG_EXCESSIVE, "Finished initializing socket for index %d with name %s\n", lldp_port->if_index, lldp_port->if_name);
++ }
++
++ debug_printf(DEBUG_EXCESSIVE, "Initializing TX SM for index %d with name %s\n", lldp_port->if_index, lldp_port->if_name);
++ lldp_port->tx.state = TX_LLDP_INITIALIZE;
++ txInitializeLLDP(lldp_port);
++ debug_printf(DEBUG_EXCESSIVE, "Initializing RX SM for index %d with name %s\n", lldp_port->if_index, lldp_port->if_name);
++ lldp_port->rx.state = LLDP_WAIT_PORT_OPERATIONAL;
++ rxInitializeLLDP(lldp_port);
++ lldp_port->portEnabled = 0;
++ lldp_port->adminStatus = enabledRxTx;
++
++ debug_printf(DEBUG_EXCESSIVE, "Initializing TLV subsystem for index %d with name %s\n", lldp_port->if_index, lldp_port->if_name);
++ /* Initialize the TLV subsystem for this interface */
++ tlvInitializeLLDP(lldp_port);
++
++ debug_printf(DEBUG_EXCESSIVE, "Adding index %d with name %s to global port list\n", lldp_port->if_index, lldp_port->if_name);
++ /* Reset the global list to point at the top of the list */
++ /* We only want to get here if initialization succeeded */
++ lldp_ports = lldp_port;
+ }
+-
+- /* Don't forget to initialize the TLV validators... */
+- initializeTLVFunctionValidators();
+-
+- // When we quit, cleanup.
+- signal(SIGTERM, cleanupLLDP);
+- signal(SIGINT, cleanupLLDP);
+- signal(SIGQUIT, cleanupLLDP);
+- signal(SIGSEGV, handle_segfault);
+- // signal(SIGHUP, );
+
+- return 0;
++ /* Don't forget to initialize the TLV validators... */
++ initializeTLVFunctionValidators();
++
++ // When we quit, cleanup.
++ signal(SIGTERM, cleanupLLDP);
++ signal(SIGINT, cleanupLLDP);
++ signal(SIGQUIT, cleanupLLDP);
++ signal(SIGSEGV, handle_segfault);
++ // signal(SIGHUP, );
++
++ return nb_ifaces;
+ }
+
+ void cleanupLLDP(struct lldp_port *lldp_port) {
+- debug_printf(DEBUG_NORMAL, "[AYBABTU] We Get Signal!\n");
++ debug_printf(DEBUG_NORMAL, "[AYBABTU] We Get Signal!\n");
+
+- lldp_port = lldp_ports;
++ lldp_port = lldp_ports;
+
+- while(lldp_port != NULL) {
++ while(lldp_port != NULL) {
+
+- if(lldp_port->if_name != NULL) {
+- debug_printf(DEBUG_NORMAL, "[CLEAN] %s (%d)\n", lldp_port->if_name, lldp_port->if_index);
++ if(lldp_port->if_name != NULL) {
++ debug_printf(DEBUG_NORMAL, "[CLEAN] %s (%d)\n", lldp_port->if_name, lldp_port->if_index);
+
+- tlvCleanupLLDP(lldp_port);
+-
+- socketCleanupLLDP(lldp_port);
+- } else {
+- debug_printf(DEBUG_NORMAL, "[ERROR] Interface index %d with name is NULL at: %s():%d\n", lldp_port->if_index, __FUNCTION__, __LINE__);
+- }
++ tlvCleanupLLDP(lldp_port);
+
+- lldp_port = lldp_port->next;
++ socketCleanupLLDP(lldp_port);
++ } else {
++ debug_printf(DEBUG_NORMAL, "[ERROR] Interface index %d with name is NULL at: %s():%d\n", lldp_port->if_index, __FUNCTION__, __LINE__);
++ }
+
+- // Clean the previous node and move up.
+- free(lldp_ports);
+- lldp_ports = lldp_port;
+- }
++ lldp_port = lldp_port->next;
+
+- exit(0);
++ // Clean the previous node and move up.
++ free(lldp_ports);
++ lldp_ports = lldp_port;
++ }
++
++ exit(0);
+ }
+
+ /****************************************
+@@ -359,40 +378,39 @@
+ ****************************************/
+ void usage()
+ {
+- debug_printf(DEBUG_EXCESSIVE, "Entering %s():%d\n", __FUNCTION__, __LINE__);
++ debug_printf(DEBUG_EXCESSIVE, "Entering %s():%d\n", __FUNCTION__, __LINE__);
+
+- debug_printf(DEBUG_NORMAL, "\n\nlldpd %s\n", VERSION);
+- debug_printf(DEBUG_NORMAL, "(c) Copyright 2002 - 2006 The OpenLLDP Group\n");
+- debug_printf(DEBUG_NORMAL, "Dual licensed under the GPL and Other/Proprietary licenses."
+- "\n\n");
+- debug_printf(DEBUG_NORMAL, "This product borrows some code from the Open1X project"
+- ". (http://www.open1x.org)\n\n");
+- debug_printf(DEBUG_NORMAL, "Usage: %s "
+- "[-c config file] "
+- "[-i device] "
+- "[-d debug_level] "
+- "[-f] "
+- "[-s] "
+- "\n", program);
+-
+- debug_printf(DEBUG_NORMAL, "\n\n");
+- debug_printf(DEBUG_NORMAL, "-c <path> : Use the config file <path> instead "
+- "of the default.\n");
+- debug_printf(DEBUG_NORMAL, "-i <interface> : Use <interface> for LLDP transactions"
+- "\n");
+- debug_printf(DEBUG_NORMAL, "-d <debug_level/flags> : Set debug verbosity."
+- "\n");
+- debug_printf(DEBUG_NORMAL, "-f : Run in forground mode.\n");
+- debug_printf(DEBUG_NORMAL, "-s : Remove the existing control socket if found. (Should only be used in system init scripts!)\\
+-n");
+- debug_printf(DEBUG_NORMAL, "\n\n");
+-
+- debug_printf(DEBUG_NORMAL, " <debug_level> can be any of : \n");
+- debug_printf(DEBUG_NORMAL, "\tA : Enable ALL debug flags.\n");
+- debug_printf(DEBUG_NORMAL, "\tc : Enable CONFIG debug flag.\n");
+- debug_printf(DEBUG_NORMAL, "\ts : Enable STATE debug flag.\n");
+- debug_printf(DEBUG_NORMAL, "\tt : Enable TLV debug flag.\n");
+- debug_printf(DEBUG_NORMAL, "\ti : Enable INT debug flag.\n");
+- debug_printf(DEBUG_NORMAL, "\tn : Enable SNMP debug flag.\n");
+- debug_printf(DEBUG_NORMAL, "\tx : Enable EXCESSIVE debug flag.\n");
++ debug_printf(DEBUG_NORMAL, "\nlldpd %s\n", VERSION);
++ debug_printf(DEBUG_NORMAL, "(c) Copyright 2002 - 2006 The OpenLLDP Group\n");
++ debug_printf(DEBUG_NORMAL, "Dual licensed under the GPL and Other/Proprietary licenses."
++ "\n\n");
++ debug_printf(DEBUG_NORMAL, "This product borrows some code from the Open1X project"
++ ". (http://www.open1x.org)\n\n");
++ debug_printf(DEBUG_NORMAL, "Usage: %s "
++ "[-c config file] "
++ "[-i device] "
++ "[-d debug_level] "
++ "[-f] "
++ "[-s] "
++ "\n", program);
++
++ debug_printf(DEBUG_NORMAL, "\n\n");
++ debug_printf(DEBUG_NORMAL, "-c <path> : Use the config file <path> instead "
++ "of the default.\n");
++ debug_printf(DEBUG_NORMAL, "-i <interface> : Use <interface> for LLDP transactions"
++ "\n");
++ debug_printf(DEBUG_NORMAL, "-d <debug_level/flags> : Set debug verbosity."
++ "\n");
++ debug_printf(DEBUG_NORMAL, "-f : Run in forground mode.\n");
++ debug_printf(DEBUG_NORMAL, "-s : Remove the existing control socket if found. (Should only be used in system init scripts!)\n");
++ debug_printf(DEBUG_NORMAL, "\n\n");
++
++ debug_printf(DEBUG_NORMAL, " <debug_level> can be any of : \n");
++ debug_printf(DEBUG_NORMAL, "\tA : Enable ALL debug flags.\n");
++ debug_printf(DEBUG_NORMAL, "\tc : Enable CONFIG debug flag.\n");
++ debug_printf(DEBUG_NORMAL, "\ts : Enable STATE debug flag.\n");
++ debug_printf(DEBUG_NORMAL, "\tt : Enable TLV debug flag.\n");
++ debug_printf(DEBUG_NORMAL, "\ti : Enable INT debug flag.\n");
++ debug_printf(DEBUG_NORMAL, "\tn : Enable SNMP debug flag.\n");
++ debug_printf(DEBUG_NORMAL, "\tx : Enable EXCESSIVE debug flag.\n");
+ }