18808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf/* 28808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf * src/lib/neigh.c CLI Neighbour 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_neigh Neighbour 158808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf * 168808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf * @{ 178808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf */ 188808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 198808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf#include <netlink/cli/utils.h> 208808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf#include <netlink/cli/neigh.h> 218808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 228808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Grafstruct rtnl_neigh *nl_cli_neigh_alloc(void) 238808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf{ 248808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf struct rtnl_neigh *neigh; 258808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 268808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf neigh = rtnl_neigh_alloc(); 278808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf if (!neigh) 288808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf nl_cli_fatal(ENOMEM, "Unable to allocate neighbout object"); 298808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 308808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf return neigh; 318808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf} 328808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 338808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Grafvoid nl_cli_neigh_parse_dst(struct rtnl_neigh *neigh, char *arg) 348808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf{ 358808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf struct nl_addr *a; 368808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf int err; 378808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 388808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf a = nl_cli_addr_parse(arg, rtnl_neigh_get_family(neigh)); 398808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf if ((err = rtnl_neigh_set_dst(neigh, a)) < 0) 408808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf nl_cli_fatal(err, "Unable to set local address: %s", 418808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf nl_geterror(err)); 428808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 438808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf nl_addr_put(a); 448808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf} 458808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 468808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Grafvoid nl_cli_neigh_parse_lladdr(struct rtnl_neigh *neigh, char *arg) 478808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf{ 488808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf struct nl_addr *a; 498808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 508808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf a = nl_cli_addr_parse(arg, AF_UNSPEC); 518808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf rtnl_neigh_set_lladdr(neigh, a); 528808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf nl_addr_put(a); 538808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf} 548808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 558808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Grafvoid nl_cli_neigh_parse_dev(struct rtnl_neigh *neigh, 568808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf struct nl_cache *link_cache, char *arg) 578808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf{ 588808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf int ival; 598808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 608808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf if (!(ival = rtnl_link_name2i(link_cache, arg))) 618808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf nl_cli_fatal(ENOENT, "Link \"%s\" does not exist", arg); 628808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 638808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf rtnl_neigh_set_ifindex(neigh, ival); 648808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf} 658808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 668808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Grafvoid nl_cli_neigh_parse_family(struct rtnl_neigh *neigh, char *arg) 678808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf{ 688808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf int family; 698808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 708808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf if ((family = nl_str2af(arg)) == AF_UNSPEC) 718808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf nl_cli_fatal(EINVAL, 728808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf "Unable to translate address family \"%s\"", arg); 738808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 748808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf rtnl_neigh_set_family(neigh, family); 758808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf} 768808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 778808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Grafvoid nl_cli_neigh_parse_state(struct rtnl_neigh *neigh, char *arg) 788808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf{ 798808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf int state; 808808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 818808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf if ((state = rtnl_neigh_str2state(arg)) < 0) 828808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf nl_cli_fatal(state, "Unable to translate state \"%s\": %s", 838808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf arg, state); 848808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 858808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf rtnl_neigh_set_state(neigh, state); 868808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf} 878808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 888808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf/** @} */ 89