The function, str2addr(), will be needed by the upcoming unicast
client code.

Signed-off-by: Richard Cochran <richardcoch...@gmail.com>
---
 nsm.c  | 31 +------------------------------
 util.c | 38 ++++++++++++++++++++++++++++++++++++++
 util.h | 11 +++++++++++
 3 files changed, 50 insertions(+), 30 deletions(-)

diff --git a/nsm.c b/nsm.c
index 1a6475f..43daf59 100644
--- a/nsm.c
+++ b/nsm.c
@@ -359,43 +359,14 @@ static int nsm_request(struct nsm *nsm, char *target)
 {
        enum transport_type type = transport_type(nsm->trp);
        UInteger8 transportSpecific;
-       unsigned char mac[MAC_LEN];
-       struct in_addr ipv4_addr;
        struct ptp_message *msg;
        struct tlv_extra *extra;
        Integer64 asymmetry;
        struct address dst;
        int cnt, err;
 
-       memset(&dst, 0, sizeof(dst));
-
-       switch (type) {
-       case TRANS_UDS:
-       case TRANS_UDP_IPV6:
-       case TRANS_DEVICENET:
-       case TRANS_CONTROLNET:
-       case TRANS_PROFINET:
-               pr_err("sorry, NSM not support with this transport");
+       if (str2addr(type, target, &dst)) {
                return -1;
-       case TRANS_UDP_IPV4:
-               if (!inet_aton(target, &ipv4_addr)) {
-                       pr_err("bad IPv4 address");
-                       return -1;
-               }
-               dst.sin.sin_family = AF_INET;
-               dst.sin.sin_addr = ipv4_addr;
-               dst.len = sizeof(dst.sin);
-               break;
-       case TRANS_IEEE_802_3:
-               if (str2mac(target, mac)) {
-                       pr_err("bad Layer-2 address");
-                       return -1;
-               }
-               dst.sll.sll_family = AF_PACKET;
-               dst.sll.sll_halen = MAC_LEN;
-               memcpy(&dst.sll.sll_addr, mac, MAC_LEN);
-               dst.len = sizeof(dst.sll);
-               break;
        }
 
        msg = msg_allocate();
diff --git a/util.c b/util.c
index 2eacafc..799147a 100644
--- a/util.c
+++ b/util.c
@@ -139,6 +139,44 @@ char *portaddr2str(struct PortAddress *addr)
        return buf;
 }
 
+int str2addr(enum transport_type type, const char *s, struct address *addr)
+{
+       unsigned char mac[MAC_LEN];
+       struct in_addr ipv4_addr;
+
+       memset(addr, 0, sizeof(*addr));
+
+       switch (type) {
+       case TRANS_UDS:
+       case TRANS_UDP_IPV6:
+       case TRANS_DEVICENET:
+       case TRANS_CONTROLNET:
+       case TRANS_PROFINET:
+               pr_err("sorry, cannot convert addresses for this transport");
+               return -1;
+       case TRANS_UDP_IPV4:
+               if (!inet_aton(s, &ipv4_addr)) {
+                       pr_err("bad IPv4 address");
+                       return -1;
+               }
+               addr->sin.sin_family = AF_INET;
+               addr->sin.sin_addr = ipv4_addr;
+               addr->len = sizeof(addr->sin);
+               break;
+       case TRANS_IEEE_802_3:
+               if (str2mac(s, mac)) {
+                       pr_err("bad Layer-2 address");
+                       return -1;
+               }
+               addr->sll.sll_family = AF_PACKET;
+               addr->sll.sll_halen = MAC_LEN;
+               memcpy(&addr->sll.sll_addr, mac, MAC_LEN);
+               addr->len = sizeof(addr->sll);
+               break;
+       }
+       return 0;
+}
+
 int str2mac(const char *s, unsigned char mac[MAC_LEN])
 {
        unsigned char buf[MAC_LEN];
diff --git a/util.h b/util.h
index 41fbdb2..4463b37 100644
--- a/util.h
+++ b/util.h
@@ -23,8 +23,10 @@
 #include <string.h>
 #include <time.h>
 
+#include "address.h"
 #include "ddt.h"
 #include "ether.h"
+#include "transport.h"
 
 #define MAX_PRINT_BYTES 16
 #define BIN_BUF_SIZE (MAX_PRINT_BYTES * 3 + 1)
@@ -81,6 +83,15 @@ char *pid2str(struct PortIdentity *id);
 char *portaddr2str(struct PortAddress *addr);
 
 /**
+ * Convert a string containing a network address into binary form.
+ * @param type  The network transport type of the address.
+ * @param s     String in human readable form.
+ * @param addr  Pointer to a buffer to hold the result.
+ * @return Zero on success, or -1 if the string is incorrectly formatted.
+ */
+int str2addr(enum transport_type type, const char *s, struct address *addr);
+
+/**
  * Scan a string containing a MAC address and convert it into binary form.
  *
  * @param s       String in human readable form.
-- 
2.11.0


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

Reply via email to