📄 iproute2.diff
字号:
+ }++ print_mpls_stats(fp, s, *d);+ fprintf(fp, "\n");++ fflush(fp);+ return 0;+}++int print_xc(const struct sockaddr_nl *who, const struct nlmsghdr *n, void *arg)+{+ FILE *fp = (FILE*)arg;+ struct mpls_xconnect_req *t = NLMSG_DATA(n);+ int len = n->nlmsg_len;++ if (n->nlmsg_type != MPLS_RTM_ADDXC &&+ n->nlmsg_type != MPLS_RTM_DELXC) {+ fprintf(stderr, "Not an XC\n");+ return 0;+ }+ len -= NLMSG_LENGTH(sizeof(*t));+ if (len < 0) {+ fprintf(stderr, "Wrong len %d\n", len);+ return -1;+ }++ if (n->nlmsg_type == MPLS_RTM_DELXC)+ fprintf(fp, "deleted XC entry ");++ if (n->nlmsg_type == MPLS_RTM_ADDXC)+ fprintf(fp, "XC entry ");++ fprintf(fp, "ilm_label ");+ print_label(fp, &t->mx_in);+ fprintf(fp, "ilm_labelspace %d ", t->mx_in.ml_index);+ fprintf(fp, "nhlfe_key 0x%08x ",t->mx_out.u.ml_key);+ fprintf(fp, "\n");+ fflush(fp);+ return 0;+}++int print_labelspace(const struct sockaddr_nl *who, const struct nlmsghdr *n, void *arg)+{+ FILE *fp = (FILE*)arg;+ struct mpls_labelspace_req *t = NLMSG_DATA(n);+ int len = n->nlmsg_len;++ if (n->nlmsg_type != MPLS_RTM_ADDLABELSPACE &&+ n->nlmsg_type != MPLS_RTM_DELLABELSPACE) {+ fprintf(stderr, "Not a Labelspace\n");+ return 0;+ }+ len -= NLMSG_LENGTH(sizeof(*t));+ if (len < 0) {+ fprintf(stderr, "Wrong len %d\n", len);+ return -1;+ }++ if (n->nlmsg_type == MPLS_RTM_DELLABELSPACE)+ fprintf(fp, "deleted LABELSPACE entry ");++ if (n->nlmsg_type == MPLS_RTM_ADDLABELSPACE)+ fprintf(fp, "LABELSPACE entry ");++ fprintf(fp, "dev %s ", ll_index_to_name(t->mls_ifindex));+ fprintf(fp, "labelspace %d ",t->mls_labelspace);+ fprintf(fp, "\n");+ fflush(fp);++ return 0;+}++int print_nhlfe(const struct sockaddr_nl *who, const struct nlmsghdr *n, void *arg)+{+ FILE *fp = (FILE*)arg;+ struct mpls_out_label_req *t = NLMSG_DATA(n);+ struct mpls_instr_req *i = (void*)&t[1];+ struct gnet_stats_basic *s = (void*)&i[1];+ unsigned int *d = (void*)&s[1];+ int len = n->nlmsg_len;++ if (n->nlmsg_type != MPLS_RTM_ADDNHLFE &&+ n->nlmsg_type != MPLS_RTM_DELNHLFE) {+ fprintf(stderr, "Not a NHLFE\n");+ return 0;+ }+ len -= NLMSG_LENGTH(sizeof(*t));+ if (len < 0) {+ fprintf(stderr, "Wrong len %d\n", len);+ return -1;+ }++ if (n->nlmsg_type == MPLS_RTM_DELNHLFE)+ fprintf(fp, "deleted NHLFE entry ");++ if (n->nlmsg_type == MPLS_RTM_ADDNHLFE)+ fprintf(fp, "NHLFE entry ");++ fprintf(fp, "key 0x%08x ", t->mol_label.u.ml_key);+ fprintf(fp, "mtu %d ",t->mol_mtu);+ if (t->mol_propagate_ttl) {+ fprintf(fp, "propagate_ttl ");+ }+ fprintf(fp, "\n\t");+ if (i->mir_instr_length) {+ print_instructions(fp, i);+ }++ print_mpls_stats(fp, s, *d);+ fprintf(fp, "\n");++ fflush(fp);+ return 0;+}++int print_tunnel(const struct sockaddr_nl *who, const struct nlmsghdr *n, void *arg)+{+ FILE *fp = (FILE*)arg;+ struct mpls_tunnel_req *t = NLMSG_DATA(n);+ int len = n->nlmsg_len;++ if (n->nlmsg_type != MPLS_RTM_ADDTUNNEL &&+ n->nlmsg_type != MPLS_RTM_DELTUNNEL) {+ fprintf(stderr, "Not a TUNNEL\n");+ return 0;+ }+ len -= NLMSG_LENGTH(sizeof(*t));+ if (len < 0) {+ fprintf(stderr, "Wrong len %d\n", len);+ return -1;+ }++ if (n->nlmsg_type == MPLS_RTM_DELTUNNEL)+ fprintf(fp, "deleted TUNNEL entry ");++ if (n->nlmsg_type == MPLS_RTM_ADDTUNNEL)+ fprintf(fp, "TUNNEL entry ");++ fprintf(fp, "%s 0x%08x", t->mt_ifname, t->mt_nhlfe_key);+ fprintf(fp, "\n");++ fflush(fp);+ return 0;+}++int print_mpls(const struct sockaddr_nl *who, const struct nlmsghdr *n, void *arg)+{++ if (n->nlmsg_type >= MPLS_RTM_ADDNHLFE &&+ n->nlmsg_type <= MPLS_RTM_DELNHLFE) {+ return print_nhlfe(who,n,arg);+ }+ if (n->nlmsg_type >= MPLS_RTM_ADDILM &&+ n->nlmsg_type <= MPLS_RTM_DELILM) {+ return print_ilm(who,n,arg);+ }+ if (n->nlmsg_type >= MPLS_RTM_ADDXC &&+ n->nlmsg_type <= MPLS_RTM_DELXC) {+ return print_xc(who,n,arg);+ }+ if (n->nlmsg_type >= MPLS_RTM_ADDLABELSPACE &&+ n->nlmsg_type <= MPLS_RTM_DELLABELSPACE) {+ return print_labelspace(who,n,arg);+ }++ if (n->nlmsg_type >= MPLS_RTM_ADDTUNNEL &&+ n->nlmsg_type <= MPLS_RTM_DELTUNNEL) {+ return print_tunnel(who,n,arg);+ }++ return 0;+}++int mpls_list(int cmd,int argc, char **argv)+{+ struct mpls_out_label_req n;+ struct mpls_in_label_req i;+ struct mpls_xconnect_req x;+ struct mpls_labelspace_req l;+ struct mpls_tunnel_req t;+ void *tab = NULL;+ int size = -1;+ + switch (cmd) {+ case MPLS_RTM_GETNHLFE:+ memset(&n, 0, sizeof(n));+ n.mol_family = AF_MPLS;+ size = sizeof(n);+ tab = &n;+ break;+ case MPLS_RTM_GETILM:+ memset(&i, 0, sizeof(i));+ i.mil_family = AF_MPLS;+ size = sizeof(i);+ tab = &i;+ break;+ case MPLS_RTM_GETXC:+ memset(&x, 0, sizeof(x));+ x.mx_family = AF_MPLS;+ size = sizeof(x);+ tab = &x;+ break;+ case MPLS_RTM_GETLABELSPACE:+ memset(&l, 0, sizeof(l));+ l.mls_family = AF_MPLS;+ size = sizeof(l);+ tab = &l;+ break;+ case MPLS_RTM_GETTUNNEL:+ memset(&t, 0, sizeof(t));+ t.mt_family = AF_MPLS;+ size = sizeof(t);+ tab = &t;+ break;+ }++ if (rtnl_dump_request(&rth1, cmd, tab, size) < 0) {+ perror("Cannot send dump request");+ exit(1);+ }++ if (rtnl_dump_filter(&rth1, print_mpls, stdout, NULL, NULL) < 0) {+ fprintf(stderr, "Dump terminated\n");+ exit(1);+ }++ return 0;+}++int do_ilm(int argc, char **argv) {++ if (matches(*argv, "add") == 0)+ return mpls_ilm_modify(MPLS_RTM_ADDILM,+ NLM_F_CREATE, argc-1, argv+1);+ if (matches(*argv, "change") == 0)+ return mpls_ilm_modify(MPLS_RTM_ADDILM, 0, argc-1, argv+1);+ if (matches(*argv, "delete") == 0)+ return mpls_ilm_modify(MPLS_RTM_DELILM, 0, argc-1, argv+1);+ if (matches(*argv, "list") == 0 || matches(*argv, "show") == 0)+ return mpls_list(MPLS_RTM_GETILM,argc-1, argv+1);+ if (matches(*argv, "help") == 0)+ usage();+ else {+ fprintf(stderr, "Option \"%s\" is unknown, try \"mpls -help\".\n", argv[0]);+ return -EINVAL;+ }++ return 0;+}++int do_nhlfe(int argc, char **argv)+{+ if (matches(*argv, "add") == 0)+ return mpls_nhlfe_modify(MPLS_RTM_ADDNHLFE,+ NLM_F_CREATE, argc-1, argv+1);+ if (matches(*argv, "change") == 0)+ return mpls_nhlfe_modify(MPLS_RTM_ADDNHLFE, 0, argc-1, argv+1);+ if (matches(*argv, "delete") == 0)+ return mpls_nhlfe_modify(MPLS_RTM_DELNHLFE, 0, argc-1, argv+1);+ if (matches(*argv, "list") == 0 || matches(*argv, "show") == 0)+ return mpls_list(MPLS_RTM_GETNHLFE,argc-1, argv+1);+ if (matches(*argv, "help") == 0)+ usage();+ else {+ fprintf(stderr, "Option \"%s\" is unknown, try \"mpls -help\".\n", argv[0]);+ return -EINVAL;+ }++ return 0;+}++int do_xc(int argc, char **argv) {++ if (matches(*argv, "add") == 0)+ return mpls_xc_modify(MPLS_RTM_ADDXC, NLM_F_CREATE,+ argc-1, argv+1);+ if (matches(*argv, "change") == 0)+ return mpls_xc_modify(MPLS_RTM_ADDXC, 0, argc-1, argv+1);+ if (matches(*argv, "delete") == 0)+ return mpls_xc_modify(MPLS_RTM_DELXC, 0, argc-1, argv+1);+ if (matches(*argv, "list") == 0 || matches(*argv, "show") == 0)+ return mpls_list(MPLS_RTM_GETXC,argc-1, argv+1);+ if (matches(*argv, "help") == 0)+ usage();+ else {+ fprintf(stderr, "Option \"%s\" is unknown, try \"mpls -help\".\n", argv[0]);+ return -EINVAL;+ }++ return 0;+}++int do_labelspace(int argc, char **argv) {++ if (matches(*argv, "add") == 0)+ return mpls_labelspace_modify(MPLS_RTM_ADDLABELSPACE,+ NLM_F_CREATE, argc-1, argv+1);+ if (matches(*argv, "change") == 0)+ return mpls_labelspace_modify(MPLS_RTM_ADDLABELSPACE,+ 0, argc-1, argv+1);+ if (matches(*argv, "delete") == 0)+ return mpls_labelspace_modify(MPLS_RTM_DELLABELSPACE,+ 0, argc-1, argv+1);+ if (matches(*argv, "list") == 0 || matches(*argv, "show") == 0)+ return mpls_list(MPLS_RTM_GETLABELSPACE,argc-1, argv+1);+ if (matches(*argv, "help") == 0)+ usage();+ else {+ fprintf(stderr, "Option \"%s\" is unknown, try \"mpls -help\".\n", argv[0]);+ return -EINVAL;+ }++ return 0;+}++int do_tunnel(int argc, char **argv) {++ if (matches(*argv, "add") == 0)+ return mpls_tunnel_modify(MPLS_RTM_ADDTUNNEL,+ NLM_F_CREATE, argc-1, argv+1);+ if (matches(*argv, "change") == 0)+ return mpls_tunnel_modify(MPLS_RTM_ADDTUNNEL,+ NLM_F_APPEND, argc-1, argv+1);+ if (matches(*argv, "delete") == 0)+ return mpls_tunnel_modify(MPLS_RTM_DELTUNNEL,+ 0, argc-1, argv+1);+ if (matches(*argv, "list") == 0 || matches(*argv, "show") == 0)+ return mpls_list(MPLS_RTM_GETTUNNEL,argc-1, argv+1);+ if (matches(*argv, "help") == 0)+ usage();+ else {+ fprintf(stderr, "Option \"%s\" is unknown, try \"mpls -help\".\n", argv[0]);+ return -EINVAL;+ }++ return 0;+}+int main(int argc, char **argv) {+ char *basename;+ int retval;++ basename = strrchr(argv[0], '/');+ if (basename == NULL)+ basename = argv[0];+ else+ basename++;++ while (argc > 1) {+ if (argv[1][0] != '-')+ break;+ if (matches(argv[1], "-Version") == 0) {+ printf("mpls utility, iproute2-ss%s mpls-linux %d.%d%d%d\n",+ SNAPSHOT, (MPLS_LINUX_VERSION >> 24) & 0xFF,+ (MPLS_LINUX_VERSION >> 16) & 0xFF,+ (MPLS_LINUX_VERSION >> 8) & 0xFF,+ (MPLS_LINUX_VERSION) & 0xFF);+ exit(0);+ } else if (matches(argv[1], "-help") == 0) {+ usage();+ } else {+ fprintf(stderr, "Option \"%s\" is unknown, try \"mpls -help\".\n", argv[1]);+ exit(-1);+ }+ argc--; argv++;+ }++ if (argc > 1) {++ if (rtnl_open(&rth1, 0) < 0) {+ fprintf (stderr, "Error openning netlink socket\n");+ exit(-1);+ }+ ll_init_map(&rth1);++ if (matches(argv[1], "monitor") == 0) {+ retval = do_mplsmonitor(argc-2,argv+2);+ } else if (matches(argv[1], "nhlfe") == 0) {+ retval = do_nhlfe(argc-2,argv+2);+ } else if (matches(argv[1], "ilm") == 0) {+ retval = do_ilm(argc-2,argv+2);+ } else if (matches(argv[1], "xc") == 0) {+ retval = do_xc(argc-2,argv+2);+ } else if (matches(argv[1], "labelspace") == 0) {+ retval = do_labelspace(argc-2,argv+2);+ } else if (matches(argv[1], "tunnel") == 0) {+ retval = do_tunnel(argc-2,argv+2);+ } else {+ usage();+ retval = 1;+ }+ rtnl_close(&rth1);+ } else {+ usage();+ retval = 1;+ }+ return retval;+}diff -uNr iproute2/mpls/mpls.h iproute2-mpls-1.1/mpls/mpls.h--- iproute2/mpls/mpls.h 1969-12-31 18:00:00.000000000 -0600+++ iproute2-mpls-1.1/mpls/mpls.h 2004-09-23 16:48:00.000000000 -0500@@ -0,0 +1,11 @@+#ifndef IPROUTE_MPLS_H+#define IPROUTE_MPLS_H++extern int print_ilm(struct sockaddr_nl *who, struct nlmsghdr *n, void *arg);+extern int print_xc(struct sockaddr_nl *who, struct nlmsghdr *n, void *arg);+extern int print_labelspace(struct sockaddr_nl *who, struct nlmsghdr *n,+ void *arg);+extern int print_nhlfe(struct sockaddr_nl *who, struct nlmsghdr *n, void *arg);++#endif+diff -uNr iproute2/mpls/mpls_monitor.c iproute2-mpls-1.1/mpls/mpls_monitor.c--- iproute2/mpls/mpls_monitor.c 1969-12-31 18:00:00.000000000 -0600+++ iproute2-mpls-1.1/mpls/mpls_monitor.c 2004-12-30 15:15:16.000000000 -0600@@ -0,0 +1,143 @@+/*+ * mplsmonitor.c "mpls monitor".+ *+ * This program is free software; you can redistribute it and/or+ * modify it under the terms of the GNU General Public License+ * as published by the Free Software Foundation; either version+ * 2 of the License, or (at your option) any later version.+ *+ * Authors: James R. Leu <jleu@mindspring.com> shamlesslessly copied+ * this code from Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>+ *+ */++#include <stdio.h>+#include <stdlib.h>+#include <unistd.h>+#include <syslog.h>+#include <fcntl.h>+#include <sys/socket.h>+#include <netinet/in.h>+#include <arpa/inet.h>+#include <string.h>+#include <time.h>+#include <linux/mpls.h>++#include "utils.h"++extern int print_ilm(struct sockaddr_nl *who, struct nlmsghdr *n, void *arg);+extern int print_xc(struct sockaddr_nl *who, struct nlmsghdr *n, void *arg);+extern int print_labelspace(struct sockaddr_nl *who, struct nlmsghdr *n,+ void *arg);+extern int print_nhlfe(struct sockaddr_nl *who, struct nlmsghdr *n, void *arg);++static void usage(void) __attribute__((noreturn));++static void usage(void)+{+ fprintf(stderr, "Usage: mpls monitor [ all | LISTofOBJECTS ]\n");+ exit(-1);+}++int accept_msg(struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)+{+ struct rtgenmsg *msg = NLMSG_DATA(n);+ FILE *fp = (FILE*)arg;++ if (msg->rtgen_family != AF_MPLS)+ return 0;++ if (n->nlmsg_type == MPLS_RTM_ADDNHLFE ||+ n->nlmsg_type == MPLS_RTM_DELNHLFE) {+ print_nhlfe(who, n, arg);+ return 0;+ }+ if (n->nlmsg_type == MPLS_RTM_ADDILM ||+ n->nlmsg_type == MPLS_RTM_DELILM) {+ print_ilm(who, n, arg);+ return 0;+ }+ if (n->nlmsg_type == MPLS_RTM_ADDXC ||+ n->nlmsg_type == MPLS_RTM_DELXC) {+ print_xc(who, n, arg);+ return 0;+ }+ if (n->nlmsg_type == MPLS_RTM_ADDLABELSPACE ||+ n->nlmsg_type == MPLS_RTM_DELLABELSPACE) {+ print_labelspace(who, n, arg);+ return 0;+ }+ if (n->nlmsg_type != NLMSG_ERROR && n->nlmsg_type != NLMSG_NOOP &&+ n->nlmsg_type != NLMSG_DONE) {+ fprintf(fp, "Unknown message: %08x %08x %08x\n",+ n->nlmsg_len, n->nlmsg_type, n->nlmsg_flags);+ }+ return 0;+}++int do_mplsmonitor(int argc, char **argv)+{+ struct rtnl_handle rth;+ char *file = NULL;+ unsigned int groups = 0xf;+ int nhlfe=0;+ int ilm=0;+ int xc=0;+ int labelspace=0;++ while (argc > 0) {+ if (matches(*argv, "file") == 0) {+ NEXT_ARG();+ file = *argv;+ } else if (matches(*argv, "nhlfe") == 0) {+ nhlfe=1;+ groups = 0;+ } else if (matches(*argv, "ilm") == 0) {+ ilm=1;+ groups = 0;+ } else if (matches(*argv, "xc") == 0) {+ xc=1;+ groups = 0;+ } else if (matches(*argv, "labelspace") == 0) {+ labelspace=1;+ groups = 0;+ } else if (strcmp(*argv, "all") == 0) {+ groups = 0xf;+ } else if (matches(*argv, "help") == 0) {+ usage();+ } else {+ fprintf(stderr, "Argument \"%s\" is unknown, try \"mpls monitor help\".\n", *argv);+ exit(-1);+ }+ argc--; argv++;+ }++ if (nhlfe)+ groups |= MPLS_GRP_NHLFE;+ if (ilm)+ groups |= MPLS_GRP_ILM;+ if (xc)+ groups |= MPLS_GRP_XC;+ if (labelspace)+ groups |= MPLS_GRP_LABELSPACE;++ if (file) {+ FILE *fp;+ fp = fopen(file, "r");+ if (fp == NULL) {+ perror("Cannot fopen");+ exit(-1);+ }+ return rtnl_from_file(fp, accept_msg, (void*)stdout);+ }++ if (rtnl_open(&rth, groups) < 0)+ exit(1);++ ll_init_map(&rth);++ if (rtnl_listen(&rth, accept_msg, (void*)stdout) < 0)+ exit(2);++ exit(0);+}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -