18808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf/* 28808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf * src/lib/addr.c Address Helpers 38808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf * 48808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf * This library is free software; you can redistribute it and/or 58808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf * modify it under the terms of the GNU Lesser General Public 68808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf * License as published by the Free Software Foundation version 2.1 78808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf * of the License. 88808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf * 98808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf * Copyright (c) 2008-2009 Thomas Graf <tgraf@suug.ch> 108808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf */ 118808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 128808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf/** 138808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf * @ingroup cli 148808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf * @defgroup cli_addr Addresses 158808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf * 168808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf * @{ 178808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf */ 188808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 198808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf#include <netlink/cli/utils.h> 208808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf#include <netlink/cli/addr.h> 218808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 228808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Grafstruct rtnl_addr *nl_cli_addr_alloc(void) 238808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf{ 248808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf struct rtnl_addr *addr; 258808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 268808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf addr = rtnl_addr_alloc(); 278808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf if (!addr) 288808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf nl_cli_fatal(ENOMEM, "Unable to allocate address object"); 298808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 308808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf return addr; 318808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf} 328808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 338808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Grafvoid nl_cli_addr_parse_family(struct rtnl_addr *addr, char *arg) 348808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf{ 358808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf int family; 368808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 378808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf if ((family = nl_str2af(arg)) != AF_UNSPEC) 388808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf rtnl_addr_set_family(addr, family); 398808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf} 408808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 418808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Grafvoid nl_cli_addr_parse_local(struct rtnl_addr *addr, char *arg) 428808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf{ 438808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf struct nl_addr *a; 448808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf int err; 458808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 468808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf a = nl_cli_addr_parse(arg, rtnl_addr_get_family(addr)); 478808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf if ((err = rtnl_addr_set_local(addr, a)) < 0) 488808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf nl_cli_fatal(err, "Unable to set local address: %s", 498808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf nl_geterror(err)); 508808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 518808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf nl_addr_put(a); 528808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf} 538808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 548808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Grafvoid nl_cli_addr_parse_dev(struct rtnl_addr *addr, struct nl_cache *link_cache, 558808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf char *arg) 568808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf{ 578808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf int ival; 588808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 598808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf if (!(ival = rtnl_link_name2i(link_cache, arg))) 608808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf nl_cli_fatal(ENOENT, "Link \"%s\" does not exist", arg); 618808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 628808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf rtnl_addr_set_ifindex(addr, ival); 638808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf} 648808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 658808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Grafvoid nl_cli_addr_parse_label(struct rtnl_addr *addr, char *arg) 668808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf{ 678808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf int err; 688808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 698808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf if ((err = rtnl_addr_set_label(addr, arg)) < 0) 708808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf nl_cli_fatal(err, "Unable to set address label: %s", 718808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf nl_geterror(err)); 728808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf} 738808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 748808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Grafvoid nl_cli_addr_parse_peer(struct rtnl_addr *addr, char *arg) 758808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf{ 768808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf struct nl_addr *a; 778808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf int err; 788808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 798808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf a = nl_cli_addr_parse(arg, rtnl_addr_get_family(addr)); 808808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf if ((err = rtnl_addr_set_peer(addr, a)) < 0) 818808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf nl_cli_fatal(err, "Unable to set peer address: %s", 828808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf nl_geterror(err)); 838808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 848808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf nl_addr_put(a); 858808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf} 868808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 878808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Grafvoid nl_cli_addr_parse_scope(struct rtnl_addr *addr, char *arg) 888808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf{ 898808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf int ival; 908808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 918808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf if ((ival = rtnl_str2scope(arg)) < 0) 928808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf nl_cli_fatal(EINVAL, "Unknown address scope \"%s\"", arg); 938808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 948808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf rtnl_addr_set_scope(addr, ival); 958808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf} 968808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 978808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Grafvoid nl_cli_addr_parse_broadcast(struct rtnl_addr *addr, char *arg) 988808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf{ 998808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf struct nl_addr *a; 1008808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf int err; 1018808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 1028808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf a = nl_cli_addr_parse(arg, rtnl_addr_get_family(addr)); 1038808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf if ((err = rtnl_addr_set_broadcast(addr, a)) < 0) 1048808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf nl_cli_fatal(err, "Unable to set broadcast address: %s", 1058808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf nl_geterror(err)); 1068808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 1078808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf nl_addr_put(a); 1088808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf} 1098808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 1108808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Grafstatic uint32_t parse_lifetime(const char *arg) 1118808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf{ 1128808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf uint64_t msecs; 1138808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf int err; 1148808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 1158808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf if (!strcasecmp(arg, "forever")) 1168808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf return 0xFFFFFFFFU; 1178808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 1188808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf if ((err = nl_str2msec(arg, &msecs)) < 0) 1198808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf nl_cli_fatal(err, "Unable to parse time string \"%s\": %s", 1208808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf arg, nl_geterror(err)); 1218808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 1228808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf return (msecs / 1000); 1238808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf} 1248808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 1258808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Grafvoid nl_cli_addr_parse_preferred(struct rtnl_addr *addr, char *arg) 1268808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf{ 1278808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf rtnl_addr_set_preferred_lifetime(addr, parse_lifetime(arg)); 1288808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf} 1298808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 1308808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Grafvoid nl_cli_addr_parse_valid(struct rtnl_addr *addr, char *arg) 1318808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf{ 1328808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf rtnl_addr_set_valid_lifetime(addr, parse_lifetime(arg)); 1338808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf} 1348808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 1358808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf/** @} */ 136