In this patch we add the ability to print local and remote UDP bearer
information. More specifically localip, localport, remoteip and
remoteport.

Signed-off-by: Richard Alpe <richard.a...@ericsson.com>
---
 man/man8/tipc-bearer.8 |  31 ++++++------
 tipc/bearer.c          | 134 ++++++++++++++++++++++++++++++++++++++++++++-----
 2 files changed, 137 insertions(+), 28 deletions(-)

diff --git a/man/man8/tipc-bearer.8 b/man/man8/tipc-bearer.8
index 846f1db..0f22ca3 100644
--- a/man/man8/tipc-bearer.8
+++ b/man/man8/tipc-bearer.8
@@ -68,7 +68,8 @@ tipc-bearer \- show or modify TIPC bearers
 
 .ti -8
 .B tipc bearer get
-.RB "{ " "priority" " | " tolerance " | " window " } " media
+.RB "{ " "priority " "| " "tolerance " "| " "window " "| " "localip " "| "
+.BR "localport " "| " "remoteip " "| " "remoteport " "} " media
 .br
 .RB "{ { " eth " | " ib " } " device
 .IR "DEVICE" " }"
@@ -170,37 +171,37 @@ bearer. For more info about the link window size see
 .SS UDP bearer options
 
 .TP
-.BI "localip " LOCALIP
+.B localip
 .br
-Specify a local IP v4/v6 address for a
-.B udp
+Local IP v4/v6 address for a
+.B UDP
 bearer.
 
 .TP
-.BI "localport " LOCALPORT
+.B localport
 .br
-Specify the local port for a
-.B udp
+Local port for a
+.B UDP
 bearer. The default port 6118 is used if no port is specified.
 
 .TP
-.BI "remoteip " REMOTEIP
+.B remoteip
 .br
-Specify a remote IP for a
-.B udp
+Remote IP for a
+.B UDP
 bearer. If no remote IP is specified a
-.B udp
+.B UDP
 bearer runs in multicast mode and tries to auto-discover its neighbours.
 The multicast IP address is generated based on the TIPC network ID. If a remote
 IP is specified the
-.B udp
+.B UDP
 bearer runs in point-to-point mode.
 
 .TP
-.BI "remoteport " REMOTEPORT
+.B remoteport
 .br
-Specify the remote port for a
-.B udp
+Remote port for a
+.B UDP
 bearer. The default port 6118 is used if no port is specified.
 
 .SH EXIT STATUS
diff --git a/tipc/bearer.c b/tipc/bearer.c
index 32abad6..ff7ee57 100644
--- a/tipc/bearer.c
+++ b/tipc/bearer.c
@@ -21,11 +21,21 @@
 
 #include <libmnl/libmnl.h>
 #include <sys/socket.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
 
 #include "cmdl.h"
 #include "msg.h"
 #include "bearer.h"
 
+#define UDP_PROP_IP 1
+#define UDP_PROP_PORT 2
+
+struct cb_data {
+       int prop;
+       int attr;
+};
+
 static void _print_bearer_opts(void)
 {
        fprintf(stderr,
@@ -514,6 +524,14 @@ static void cmd_bearer_get_help(struct cmdl *cmdl)
        fprintf(stderr, "Usage: %s bearer get OPTION media MEDIA ARGS...\n",
                cmdl->argv[0]);
        _print_bearer_opts();
+
+       fprintf(stderr,
+               "\nOPTIONS - UDP media\n"
+               " localip               - Get local UDP IP\n"
+               " localport             - Get local UDP port\n"
+               " remoteip              - Get remote UDP IP\n"
+               " remoteport            - Get remote UDP port\n");
+
        _print_bearer_media();
 }
 
@@ -532,9 +550,73 @@ static void cmd_bearer_get_l2_help(struct cmdl *cmdl, char 
*media)
        _print_bearer_opts();
 }
 
-static int bearer_get_cb(const struct nlmsghdr *nlh, void *data)
+static int bearer_get_udp_cb(const struct nlmsghdr *nlh, void *data)
+{
+       struct cb_data *cb_data = data;
+       struct sockaddr_storage *addr;
+       struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
+       struct nlattr *info[TIPC_NLA_MAX + 1] = {};
+       struct nlattr *attrs[TIPC_NLA_BEARER_MAX + 1] = {};
+       struct nlattr *opts[TIPC_NLA_UDP_MAX + 1] = {};
+
+       mnl_attr_parse(nlh, sizeof(*genl), parse_attrs, info);
+       if (!info[TIPC_NLA_BEARER])
+               return MNL_CB_ERROR;
+
+       mnl_attr_parse_nested(info[TIPC_NLA_BEARER], parse_attrs, attrs);
+       if (!attrs[TIPC_NLA_BEARER_UDP_OPTS])
+               return MNL_CB_ERROR;
+
+       mnl_attr_parse_nested(attrs[TIPC_NLA_BEARER_UDP_OPTS], parse_attrs, 
opts);
+       if (!opts[TIPC_NLA_UDP_LOCAL])
+               return MNL_CB_ERROR;
+
+       addr = mnl_attr_get_payload(opts[cb_data->attr]);
+
+       if (addr->ss_family == AF_INET) {
+               struct sockaddr_in *ipv4 = (struct sockaddr_in *) addr;
+
+               switch (cb_data->prop) {
+               case UDP_PROP_IP:
+                       printf("%s\n", inet_ntoa(ipv4->sin_addr));
+                       break;
+               case UDP_PROP_PORT:
+                       printf("%u\n", ntohs(ipv4->sin_port));
+                       break;
+               default:
+                       return MNL_CB_ERROR;
+               }
+
+       } else if (addr->ss_family == AF_INET6) {
+               char straddr[INET6_ADDRSTRLEN];
+               struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *) addr;
+
+               switch (cb_data->prop) {
+               case UDP_PROP_IP:
+                       if (!inet_ntop(AF_INET6, &ipv6->sin6_addr, straddr,
+                                      sizeof(straddr))) {
+                               fprintf(stderr, "error, parsing IPv6 addr\n");
+                               return MNL_CB_ERROR;
+                       }
+                       printf("%s\n", straddr);
+                       break;
+               case UDP_PROP_PORT:
+                       printf("%u\n", ntohs(ipv6->sin6_port));
+                       break;
+               default:
+                       return MNL_CB_ERROR;
+               }
+
+       } else {
+               return MNL_CB_ERROR;
+       }
+
+       return MNL_CB_OK;
+}
+
+static int bearer_get_prop_cb(const struct nlmsghdr *nlh, void *data)
 {
-       int *prop = data;
+       struct cb_data *cb_data = data;
        struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
        struct nlattr *info[TIPC_NLA_MAX + 1] = {};
        struct nlattr *attrs[TIPC_NLA_BEARER_MAX + 1] = {};
@@ -549,10 +631,10 @@ static int bearer_get_cb(const struct nlmsghdr *nlh, void 
*data)
                return MNL_CB_ERROR;
 
        mnl_attr_parse_nested(attrs[TIPC_NLA_BEARER_PROP], parse_attrs, props);
-       if (!props[*prop])
+       if (!props[cb_data->prop])
                return MNL_CB_ERROR;
 
-       printf("%u\n", mnl_attr_get_u32(props[*prop]));
+       printf("%u\n", mnl_attr_get_u32(props[cb_data->prop]));
 
        return MNL_CB_OK;
 }
@@ -561,11 +643,12 @@ static int cmd_bearer_get_prop(struct nlmsghdr *nlh, 
const struct cmd *cmd,
                               struct cmdl *cmdl, void *data)
 {
        int err;
-       int prop;
+       struct cb_data cb_data;
        char *media;
        char buf[MNL_SOCKET_BUFFER_SIZE];
        struct nlattr *attrs;
        struct opt *opt;
+       mnl_cb_t cb;
        struct opt opts[] = {
                { "device",             NULL },
                { "media",              NULL },
@@ -573,14 +656,35 @@ static int cmd_bearer_get_prop(struct nlmsghdr *nlh, 
const struct cmd *cmd,
                { NULL }
        };
 
-       if (strcmp(cmd->cmd, "priority") == 0)
-               prop = TIPC_NLA_PROP_PRIO;
-       else if ((strcmp(cmd->cmd, "tolerance") == 0))
-               prop = TIPC_NLA_PROP_TOL;
-       else if ((strcmp(cmd->cmd, "window") == 0))
-               prop = TIPC_NLA_PROP_WIN;
-       else
+       if (strcmp(cmd->cmd, "priority") == 0) {
+               cb_data.prop = TIPC_NLA_PROP_PRIO;
+               cb = bearer_get_prop_cb;
+       } else if ((strcmp(cmd->cmd, "tolerance") == 0)) {
+               cb_data.prop = TIPC_NLA_PROP_TOL;
+               cb = bearer_get_prop_cb;
+       } else if ((strcmp(cmd->cmd, "window") == 0)) {
+               cb_data.attr = TIPC_NLA_UDP_LOCAL;
+               cb_data.prop = TIPC_NLA_PROP_WIN;
+               cb = bearer_get_prop_cb;
+       } else if ((strcmp(cmd->cmd, "localip") == 0)) {
+               cb_data.attr = TIPC_NLA_UDP_LOCAL;
+               cb_data.prop = UDP_PROP_IP;
+               cb = bearer_get_udp_cb;
+       } else if ((strcmp(cmd->cmd, "localport") == 0)) {
+               cb_data.attr = TIPC_NLA_UDP_REMOTE;
+               cb_data.prop = UDP_PROP_PORT;
+               cb = bearer_get_udp_cb;
+       } else if ((strcmp(cmd->cmd, "remoteip") == 0)) {
+               cb_data.attr = TIPC_NLA_UDP_REMOTE;
+               cb_data.prop = UDP_PROP_IP;
+               cb = bearer_get_udp_cb;
+       } else if ((strcmp(cmd->cmd, "remoteport") == 0)) {
+               cb_data.attr = TIPC_NLA_UDP_REMOTE;
+               cb_data.prop = UDP_PROP_PORT;
+               cb = bearer_get_udp_cb;
+       } else {
                return -EINVAL;
+       }
 
        if (help_flag) {
                (cmd->help)(cmdl);
@@ -622,7 +726,7 @@ static int cmd_bearer_get_prop(struct nlmsghdr *nlh, const 
struct cmd *cmd,
        }
        mnl_attr_nest_end(nlh, attrs);
 
-       return msg_doit(nlh, bearer_get_cb, &prop);
+       return msg_doit(nlh, cb, &cb_data);
 }
 
 static int cmd_bearer_get(struct nlmsghdr *nlh, const struct cmd *cmd,
@@ -632,6 +736,10 @@ static int cmd_bearer_get(struct nlmsghdr *nlh, const 
struct cmd *cmd,
                { "priority",   cmd_bearer_get_prop,    cmd_bearer_get_help },
                { "tolerance",  cmd_bearer_get_prop,    cmd_bearer_get_help },
                { "window",     cmd_bearer_get_prop,    cmd_bearer_get_help },
+               { "localip",    cmd_bearer_get_prop,    cmd_bearer_get_help },
+               { "localport",  cmd_bearer_get_prop,    cmd_bearer_get_help },
+               { "remoteip",   cmd_bearer_get_prop,    cmd_bearer_get_help },
+               { "remoteport", cmd_bearer_get_prop,    cmd_bearer_get_help },
                { NULL }
        };
 
-- 
2.1.4


------------------------------------------------------------------------------
Mobile security can be enabling, not merely restricting. Employees who
bring their own devices (BYOD) to work are irked by the imposition of MDM
restrictions. Mobile Device Manager Plus allows you to control only the
apps on BYO-devices by containerizing them, leaving personal data untouched!
https://ad.doubleclick.net/ddm/clk/304595813;131938128;j
_______________________________________________
tipc-discussion mailing list
tipc-discussion@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tipc-discussion

Reply via email to