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 256a799..29ba5ca 100644 --- a/util.h +++ b/util.h @@ -23,8 +23,10 @@ #include #include +#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) @@ -104,6 +106,15 @@ static inline int pid_eq(struct PortIdentity *a, struct PortIdentity *b) return memcmp(a, b, sizeof(*a)) == 0; } +/** + * 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. *