144d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "../src/utils.h" 2080727d90b62418cb103f5b0fc6ccecdf8317009Thomas Graf#include <signal.h> 3080727d90b62418cb103f5b0fc6ccecdf8317009Thomas Graf 4080727d90b62418cb103f5b0fc6ccecdf8317009Thomas Grafstatic int quit = 0; 544d362409d5469aed47d19e7908d19bd194493aThomas Graf 644d362409d5469aed47d19e7908d19bd194493aThomas Grafstatic void change_cb(struct nl_cache *cache, struct nl_object *obj, 744d362409d5469aed47d19e7908d19bd194493aThomas Graf int action) 844d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 944d362409d5469aed47d19e7908d19bd194493aThomas Graf struct nl_dump_params dp = { 10562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf .dp_type = NL_DUMP_LINE, 1144d362409d5469aed47d19e7908d19bd194493aThomas Graf .dp_fd = stdout, 1244d362409d5469aed47d19e7908d19bd194493aThomas Graf }; 1344d362409d5469aed47d19e7908d19bd194493aThomas Graf 1444d362409d5469aed47d19e7908d19bd194493aThomas Graf if (action == NL_ACT_NEW) 1544d362409d5469aed47d19e7908d19bd194493aThomas Graf printf("NEW "); 1644d362409d5469aed47d19e7908d19bd194493aThomas Graf else if (action == NL_ACT_DEL) 1744d362409d5469aed47d19e7908d19bd194493aThomas Graf printf("DEL "); 1844d362409d5469aed47d19e7908d19bd194493aThomas Graf else if (action == NL_ACT_CHANGE) 1944d362409d5469aed47d19e7908d19bd194493aThomas Graf printf("CHANGE "); 2044d362409d5469aed47d19e7908d19bd194493aThomas Graf 2144d362409d5469aed47d19e7908d19bd194493aThomas Graf nl_object_dump(obj, &dp); 2244d362409d5469aed47d19e7908d19bd194493aThomas Graf} 2344d362409d5469aed47d19e7908d19bd194493aThomas Graf 24080727d90b62418cb103f5b0fc6ccecdf8317009Thomas Grafstatic void sigint(int arg) 25080727d90b62418cb103f5b0fc6ccecdf8317009Thomas Graf{ 26080727d90b62418cb103f5b0fc6ccecdf8317009Thomas Graf quit = 1; 27080727d90b62418cb103f5b0fc6ccecdf8317009Thomas Graf} 28080727d90b62418cb103f5b0fc6ccecdf8317009Thomas Graf 2944d362409d5469aed47d19e7908d19bd194493aThomas Grafint main(int argc, char *argv[]) 3044d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 3144d362409d5469aed47d19e7908d19bd194493aThomas Graf struct nl_cache_mngr *mngr; 3244d362409d5469aed47d19e7908d19bd194493aThomas Graf struct nl_cache *lc, *nc, *ac, *rc; 33562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf struct nl_sock *sock; 34562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf int err; 3544d362409d5469aed47d19e7908d19bd194493aThomas Graf 36080727d90b62418cb103f5b0fc6ccecdf8317009Thomas Graf signal(SIGINT, sigint); 37080727d90b62418cb103f5b0fc6ccecdf8317009Thomas Graf 38562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf sock = nlt_alloc_socket(); 39562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf err = nl_cache_mngr_alloc(sock, NETLINK_ROUTE, NL_AUTO_PROVIDE, &mngr); 40562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf if (err < 0) 41562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf fatal(err, "Unable to allocate cache manager: %s", 42562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf nl_geterror(err)); 4344d362409d5469aed47d19e7908d19bd194493aThomas Graf 44562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf if ((err = nl_cache_mngr_add(mngr, "route/link", &change_cb, &lc)) < 0) 45562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf fatal(err, "Unable to add cache route/link: %s", 46562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf nl_geterror(err)); 4744d362409d5469aed47d19e7908d19bd194493aThomas Graf 48562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf if ((err = nl_cache_mngr_add(mngr, "route/neigh", &change_cb, &nc)) < 0) 49562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf fatal(err, "Unable to add cache route/neigh: %s", 50562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf nl_geterror(err)); 5144d362409d5469aed47d19e7908d19bd194493aThomas Graf 52562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf if ((err = nl_cache_mngr_add(mngr, "route/addr", &change_cb, &ac)) < 0) 53562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf fatal(err, "Unable to add cache route/addr: %s", 54562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf nl_geterror(err)); 5544d362409d5469aed47d19e7908d19bd194493aThomas Graf 56562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf if ((err = nl_cache_mngr_add(mngr, "route/route", &change_cb, &rc)) < 0) 57562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf fatal(err, "Unable to add cache route/route: %s", 58562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf nl_geterror(err)); 5944d362409d5469aed47d19e7908d19bd194493aThomas Graf 60080727d90b62418cb103f5b0fc6ccecdf8317009Thomas Graf while (!quit) { 6144d362409d5469aed47d19e7908d19bd194493aThomas Graf int err = nl_cache_mngr_poll(mngr, 5000); 62562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf if (err < 0 && err != -NLE_INTR) 63562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf fatal(err, "Polling failed: %s", nl_geterror(err)); 6444d362409d5469aed47d19e7908d19bd194493aThomas Graf 6544d362409d5469aed47d19e7908d19bd194493aThomas Graf } 6644d362409d5469aed47d19e7908d19bd194493aThomas Graf 6744d362409d5469aed47d19e7908d19bd194493aThomas Graf nl_cache_mngr_free(mngr); 68562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf nl_socket_free(sock); 6944d362409d5469aed47d19e7908d19bd194493aThomas Graf 7044d362409d5469aed47d19e7908d19bd194493aThomas Graf return 0; 7144d362409d5469aed47d19e7908d19bd194493aThomas Graf} 72