Hi Hoang,
Both patches are fine with me, apart from comments below. Just send it out to 
tipc-discussion so Ying can have a look, too.
BR
///jon

> -----Original Message-----
> From: Hoang Le <hoang.h...@dektech.com.au>
> Sent: September 27, 2018 5:11 AM
> To: tipc-discussion@lists.sourceforge.net; Jon Maloy
> <jon.ma...@ericsson.com>; ma...@donjonn.com; ying....@windriver.com
> Subject: [iproute2-next] tipc:support for indicating interface when activating
> UDP bearer

You need a commit log message in both patches that briefly explains what this 
is all about.

> 
> Signed-off-by: Hoang Le <hoang.h...@dektech.com.au>
> ---
>  tipc/bearer.c | 82 ++++++++++++++++++++++++++++++++++++++++++++-
> ------
>  1 file changed, 72 insertions(+), 10 deletions(-)
> 
> diff --git a/tipc/bearer.c b/tipc/bearer.c index 05dc84aa8ded..25bc85be980d
> 100644
> --- a/tipc/bearer.c
> +++ b/tipc/bearer.c
> @@ -19,6 +19,8 @@
>  #include <linux/tipc_netlink.h>
>  #include <linux/tipc.h>
>  #include <linux/genetlink.h>
> +#include <linux/if.h>
> +#include <sys/ioctl.h>
> 
>  #include <libmnl/libmnl.h>
>  #include <sys/socket.h>
> @@ -68,7 +70,7 @@ static void cmd_bearer_enable_l2_help(struct cmdl
> *cmdl, char *media)  static void cmd_bearer_enable_udp_help(struct cmdl
> *cmdl, char *media)  {
>       fprintf(stderr,
> -             "Usage: %s bearer enable [OPTIONS] media %s name NAME
> localip IP [UDP OPTIONS]\n\n",
> +             "Usage: %s bearer enable [OPTIONS] media %s [name NAME
> localip
> +IP|device DEVICE] [UDP OPTIONS]\n\n",
>               cmdl->argv[0], media);
>       fprintf(stderr,
>               "OPTIONS\n"
> @@ -121,6 +123,48 @@ static int generate_multicast(short af, char *buf, int
> bufsize)
>       return 0;
>  }
> 
> +static int cmd_bearer_validate_and_get_addr(const char *name, char
> +*straddr) {
> +     struct ifreq ifc;
> +     struct sockaddr_in *ip4addr;
> +     struct sockaddr_in6 *ip6addr;
> +     int fd = 0;
> +
> +     if (!name || !straddr)
> +             return 0;
> +
> +     fd = socket(PF_INET, SOCK_DGRAM, 0);
> +     if (fd <= 0) {
> +             fprintf(stderr, "Failed to create socket\n");
> +             return 0;
> +     }
> +
> +     ifc.ifr_name[0] = 0;
> +     memcpy(ifc.ifr_name, name, strlen(name));
> +     ifc.ifr_name[strlen(name)] = 0;
> +
> +     if (ioctl(fd, SIOCGIFADDR, &ifc) < 0) {
> +             fprintf(stderr, "ioctl failed :%s\n", strerror(errno));
> +             close(fd);
> +             return 0;
> +     }
> +
> +     ip4addr = (struct sockaddr_in *)&ifc.ifr_addr;
> +     if (inet_ntop(AF_INET, &ip4addr->sin_addr, straddr,
> +                   INET_ADDRSTRLEN) == NULL)
> +     {
> +                ip6addr = (struct sockaddr_in6 *)&ifc.ifr_addr;
> +                if (inet_ntop(AF_INET6, &ip6addr->sin6_addr, straddr,
> +                              INET6_ADDRSTRLEN) == NULL)
> +                {
> +                        fprintf(stderr, "UDP local address error\n");
> +                        return -EINVAL;
> +                }
> +        }
> +     close(fd);
> +     return 1;
> +}
> +
>  static int nl_add_udp_enable_opts(struct nlmsghdr *nlh, struct opt *opts,
>                                 struct cmdl *cmdl)
>  {
> @@ -138,13 +182,27 @@ static int nl_add_udp_enable_opts(struct nlmsghdr
> *nlh, struct opt *opts,
>               .ai_family = AF_UNSPEC,
>               .ai_socktype = SOCK_DGRAM
>       };
> +     char addr[INET6_ADDRSTRLEN] = {0};
> 
> -     if (!(opt = get_opt(opts, "localip"))) {
> -             fprintf(stderr, "error, udp bearer localip missing\n");
> -             cmd_bearer_enable_udp_help(cmdl, "udp");
> -             return -EINVAL;
> +     opt = get_opt(opts, "device");
> +     if (opt) {
> +             if (!cmd_bearer_validate_and_get_addr(opt->val, addr)) {
> +                     fprintf(stderr, "error, no device name available\n");
> +                     return -EINVAL;
> +             }
> +     }
To avoid unnecessarily nested if() clauses you could just do 
If (opt && !cmd_bearer_validate_and_get_addr(opt->val, addr))
{

}

> +
> +     if (strlen(addr) > 0)
> +             locip = addr;
> +     

We follow kernel coding style, so if you use the curly brackets in one clause 
you have to do it in all of them.
if()  {
               
} else {

} 
you have 
                                                     
else {
> +             opt = get_opt(opts, "localip");
> +             if (!opt) {
> +                     fprintf(stderr, "error, udp bearer localip missing\n");
> +                     cmd_bearer_enable_udp_help(cmdl, "udp");
> +                     return -EINVAL;
> +             }
> +             locip = opt->val;
>       }
> -     locip = opt->val;
> 
>       if ((opt = get_opt(opts, "remoteip")))
>               remip = opt->val;
> @@ -262,13 +320,13 @@ int cmd_get_unique_bearer_name(const struct
> cmd *cmd, struct cmdl *cmdl,
> 
>  static void cmd_bearer_add_udp_help(struct cmdl *cmdl, char *media)  {
> -     fprintf(stderr, "Usage: %s bearer add media %s name NAME
> remoteip REMOTEIP\n\n",
> +     fprintf(stderr, "Usage: %s bearer add media %s [name NAME|device
> +DEVICE]\n\nremoteip REMOTEIP\n\n",
>               cmdl->argv[0], media);
>  }
> 
>  static void cmd_bearer_add_help(struct cmdl *cmdl)  {
> -     fprintf(stderr, "Usage: %s bearer add media udp name NAME
> remoteip REMOTEIP\n",
> +     fprintf(stderr, "Usage: %s bearer add media udp [name
> NAME|device
> +DEVICE] remoteip REMOTEIP\n",
>               cmdl->argv[0]);
>  }
> 
> @@ -325,6 +383,7 @@ static int cmd_bearer_add_media(struct nlmsghdr
> *nlh, const struct cmd *cmd,
>               { "remoteport",         OPT_KEYVAL,     NULL },
>               { "name",               OPT_KEYVAL,     NULL },
>               { "media",              OPT_KEYVAL,     NULL },
> +             { "device",             OPT_KEYVAL,     NULL },
>               { NULL }
>       };
>       const struct tipc_sup_media sup_media[] = { @@ -349,8 +408,10 @@
> static int cmd_bearer_add_media(struct nlmsghdr *nlh, const struct cmd
> *cmd,
>               return -EINVAL;
>       }
>       if (!(opt = get_opt(opts, "name"))) {
> -             fprintf(stderr, "error, missing media name\n");
> -             return -EINVAL;
> +             if (!(opt = get_opt(opts, "device"))) {
> +                     fprintf(stderr, "error, missing media name\n");
> +                     return -EINVAL;
> +             }
>       }
> 
>       if (!(nlh = msg_init(buf, TIPC_NL_BEARER_ADD))) { @@ -557,6 +618,7
> @@ static int cmd_bearer_set_prop(struct nlmsghdr *nlh, const struct cmd
> *cmd,
>       };
>       struct tipc_sup_media sup_media[] = {
>               { "udp",        "name",         cmd_bearer_set_udp_help},
> +             { "udp",        "device",       cmd_bearer_set_udp_help},
>               { "eth",        "device",       cmd_bearer_set_l2_help },
>               { "ib",         "device",       cmd_bearer_set_l2_help },
>               { NULL, },
> --
> 2.17.1



_______________________________________________
tipc-discussion mailing list
tipc-discussion@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tipc-discussion

Reply via email to