summaryrefslogtreecommitdiff
path: root/protocol.c
diff options
context:
space:
mode:
Diffstat (limited to 'protocol.c')
-rw-r--r--protocol.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/protocol.c b/protocol.c
index a207494..2de5833 100644
--- a/protocol.c
+++ b/protocol.c
@@ -472,3 +472,56 @@ done:
close(sock);
return 0;
}
+
+/*
+ * This function accepts either a full MAC address using : or - as seperators.
+ * Or a router hostname. The hostname will be searched for via MNDP broadcast packets.
+ */
+int query_mndp_verbose(char *address, unsigned char *dstmac) {
+ char *p = address;
+ int colons = 0;
+ int dashs = 0;
+
+ while (*p++) {
+ if (*p == ':') {
+ colons++;
+ }
+ else if (*p == '-') {
+ dashs++;
+ }
+ }
+
+ /*
+ * Windows users often enter macs with dash instead
+ * of colon.
+ */
+ if (colons == 0 && dashs == 5) {
+ p = address;
+ while (*p++) {
+ if (*p == '-') {
+ *p = ':';
+ }
+ }
+ colons = dashs;
+ }
+
+ if (colons != 5) {
+ /*
+ * Not a valid mac-address.
+ * Search for Router by identity name, using MNDP
+ */
+ fprintf(stderr, "Searching for '%s'...", address);
+ if (!query_mndp(address, dstmac)) {
+ fprintf(stderr, "not found\n");
+ return 0;
+ }
+
+ /* Router found, display mac and continue */
+ fprintf(stderr, "found\n");
+ } else {
+ /* Convert mac address string to ether_addr struct */
+ ether_aton_r(address, (struct ether_addr *)dstmac);
+ }
+
+ return 1;
+}