]> rtime.felk.cvut.cz Git - lisovros/iproute2_canprio.git/blobdiff - ip/ipneigh.c
Convert to use rta_getattr_ functions
[lisovros/iproute2_canprio.git] / ip / ipneigh.c
index 1ba13ac3f0ffe52aab9907c565dcdd0d43fc624e..93cfba257211e0b497fadc8dfc6cbe30e09cbf67 100644 (file)
@@ -8,10 +8,6 @@
  *
  * Authors:    Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
  *
- *
- * Changes:
- *
- * Rani Assaf <rani@magic.metawire.com> 980929:        resolve addresses
  */
 
 #include <stdio.h>
@@ -21,7 +17,6 @@
 #include <fcntl.h>
 #include <string.h>
 #include <sys/time.h>
-#include <net/if.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <netinet/ip.h>
@@ -44,7 +39,6 @@ static struct
        char *flushb;
        int flushp;
        int flushe;
-       struct rtnl_handle *rth;
 } filter;
 
 static void usage(void) __attribute__((noreturn));
@@ -89,8 +83,8 @@ int nud_state_a2n(unsigned *state, char *arg)
 
 static int flush_update(void)
 {
-       if (rtnl_send(filter.rth, filter.flushb, filter.flushp) < 0) {
-               perror("Failed to send flush request\n");
+       if (rtnl_send_check(&rth, filter.flushb, filter.flushp) < 0) {
+               perror("Failed to send flush request");
                return -1;
        }
        filter.flushp = 0;
@@ -100,7 +94,6 @@ static int flush_update(void)
 
 static int ipneigh_modify(int cmd, int flags, int argc, char **argv)
 {
-       struct rtnl_handle rth;
        struct {
                struct nlmsghdr         n;
                struct ndmsg            ndm;
@@ -167,16 +160,13 @@ static int ipneigh_modify(int cmd, int flags, int argc, char **argv)
        addattr_l(&req.n, sizeof(req), NDA_DST, &dst.data, dst.bytelen);
 
        if (lla && strcmp(lla, "null")) {
-               char llabuf[16];
+               char llabuf[20];
                int l;
 
                l = ll_addr_a2n(llabuf, sizeof(llabuf), lla);
                addattr_l(&req.n, sizeof(req), NDA_LLADDR, llabuf, l);
        }
 
-       if (rtnl_open(&rth, 0) < 0)
-               exit(1);
-
        ll_init_map(&rth);
 
        if ((req.ndm.ndm_ifindex = ll_name_to_index(d)) == 0) {
@@ -184,10 +174,10 @@ static int ipneigh_modify(int cmd, int flags, int argc, char **argv)
                return -1;
        }
 
-       if (rtnl_talk(&rth, &req.n, 0, 0, NULL, NULL, NULL) < 0)
+       if (rtnl_talk(&rth, &req.n, 0, 0, NULL) < 0)
                exit(2);
 
-       exit(0);
+       return 0;
 }
 
 
@@ -202,7 +192,7 @@ int print_neigh(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
        if (n->nlmsg_type != RTM_NEWNEIGH && n->nlmsg_type != RTM_DELNEIGH) {
                fprintf(stderr, "Not RTM_NEWNEIGH: %08x %08x %08x\n",
                        n->nlmsg_len, n->nlmsg_type, n->nlmsg_flags);
-               
+
                return 0;
        }
        len -= NLMSG_LENGTH(sizeof(*r));
@@ -219,6 +209,7 @@ int print_neigh(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
        if (filter.index && filter.index != r->ndm_ifindex)
                return 0;
        if (!(filter.state&r->ndm_state) &&
+           !(r->ndm_flags & NTF_PROXY) &&
            (r->ndm_state || !(filter.state&0x100)) &&
              (r->ndm_family != AF_DECnet))
                return 0;
@@ -251,7 +242,7 @@ int print_neigh(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
                memcpy(fn, n, n->nlmsg_len);
                fn->nlmsg_type = RTM_DELNEIGH;
                fn->nlmsg_flags = NLM_F_REQUEST;
-               fn->nlmsg_seq = ++filter.rth->seq;
+               fn->nlmsg_seq = ++rth.seq;
                filter.flushp = (((char*)fn) + n->nlmsg_len) - filter.flushb;
                filter.flushed++;
                if (show_stats < 2)
@@ -259,7 +250,7 @@ int print_neigh(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
        }
 
        if (tb[NDA_DST]) {
-               fprintf(fp, "%s ", 
+               fprintf(fp, "%s ",
                        format_host(r->ndm_family,
                                    RTA_PAYLOAD(tb[NDA_DST]),
                                    RTA_DATA(tb[NDA_DST]),
@@ -277,23 +268,23 @@ int print_neigh(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
        if (r->ndm_flags & NTF_ROUTER) {
                fprintf(fp, " router");
        }
+       if (r->ndm_flags & NTF_PROXY) {
+               fprintf(fp, " proxy");
+       }
        if (tb[NDA_CACHEINFO] && show_stats) {
-               static int hz;
                struct nda_cacheinfo *ci = RTA_DATA(tb[NDA_CACHEINFO]);
-               if (!hz)
-                       hz = get_hz();
+               int hz = get_user_hz();
+
                if (ci->ndm_refcnt)
                        printf(" ref %d", ci->ndm_refcnt);
                fprintf(fp, " used %d/%d/%d", ci->ndm_used/hz,
                       ci->ndm_confirmed/hz, ci->ndm_updated/hz);
        }
 
-#ifdef NDA_PROBES
        if (tb[NDA_PROBES] && show_stats) {
-               __u32 p = *(__u32 *) RTA_DATA(tb[NDA_PROBES]);
+               __u32 p = rta_getattr_u32(tb[NDA_PROBES]);
                fprintf(fp, " probes %u", p);
        }
-#endif
 
        if (r->ndm_state) {
                int nud = r->ndm_state;
@@ -326,8 +317,8 @@ void ipneigh_reset_filter()
 int do_show_or_flush(int argc, char **argv, int flush)
 {
        char *filter_dev = NULL;
-       struct rtnl_handle rth;
        int state_given = 0;
+       struct ndmsg ndm = { 0 };
 
        ipneigh_reset_filter();
 
@@ -368,7 +359,9 @@ int do_show_or_flush(int argc, char **argv, int flush)
                        if (state == 0)
                                state = 0x100;
                        filter.state |= state;
-               } else {
+               } else if (strcmp(*argv, "proxy") == 0)
+                       ndm.ndm_flags = NTF_PROXY;
+               else {
                        if (strcmp(*argv, "to") == 0) {
                                NEXT_ARG();
                        }
@@ -381,9 +374,6 @@ int do_show_or_flush(int argc, char **argv, int flush)
                argc--; argv++;
        }
 
-       if (rtnl_open(&rth, 0) < 0)
-               exit(1);
-
        ll_init_map(&rth);
 
        if (filter_dev) {
@@ -400,7 +390,6 @@ int do_show_or_flush(int argc, char **argv, int flush)
                filter.flushb = flushb;
                filter.flushp = 0;
                filter.flushe = sizeof(flushb);
-               filter.rth = &rth;
                filter.state &= ~NUD_FAILED;
 
                while (round < MAX_ROUNDS) {
@@ -409,15 +398,17 @@ int do_show_or_flush(int argc, char **argv, int flush)
                                exit(1);
                        }
                        filter.flushed = 0;
-                       if (rtnl_dump_filter(&rth, print_neigh, stdout, NULL, NULL) < 0) {
+                       if (rtnl_dump_filter(&rth, print_neigh, stdout) < 0) {
                                fprintf(stderr, "Flush terminated\n");
                                exit(1);
                        }
                        if (filter.flushed == 0) {
-                               if (round == 0) {
-                                       fprintf(stderr, "Nothing to flush.\n");
-                               } else if (show_stats)
-                                       printf("*** Flush is complete after %d round%s ***\n", round, round>1?"s":"");
+                               if (show_stats) {
+                                       if (round == 0)
+                                               printf("Nothing to flush.\n");
+                                       else
+                                               printf("*** Flush is complete after %d round%s ***\n", round, round>1?"s":"");
+                               }
                                fflush(stdout);
                                return 0;
                        }
@@ -434,12 +425,14 @@ int do_show_or_flush(int argc, char **argv, int flush)
                return 1;
        }
 
-       if (rtnl_wilddump_request(&rth, filter.family, RTM_GETNEIGH) < 0) {
+       ndm.ndm_family = filter.family;
+
+       if (rtnl_dump_request(&rth, RTM_GETNEIGH, &ndm, sizeof(struct ndmsg)) < 0) {
                perror("Cannot send dump request");
                exit(1);
        }
 
-       if (rtnl_dump_filter(&rth, print_neigh, stdout, NULL, NULL) < 0) {
+       if (rtnl_dump_filter(&rth, print_neigh, stdout) < 0) {
                fprintf(stderr, "Dump terminated\n");
                exit(1);
        }