📄 iproute2.diff
字号:
+ return -1;+ }++ if (ghdr->cmd == MPLS_CMD_DELILM)+ fprintf(fp, "deleted ILM entry ");++ if (ghdr->cmd == MPLS_CMD_NEWILM)+ fprintf(fp, "ILM entry ");++ mil = RTA_DATA(tb[MPLS_ATTR_ILM]);+ instr = RTA_DATA(tb[MPLS_ATTR_INSTR]);+ stats = RTA_DATA(tb[MPLS_ATTR_STATS]);++ fprintf(fp, "label ");+ print_label(fp, &mil->mil_label);++ fprintf(fp, "labelspace %d ", mil->mil_label.ml_index);++ switch(mil->mil_proto) {+ case AF_INET:+ fprintf(fp, "proto ipv4 ");+ break;+ case AF_INET6:+ fprintf(fp, "proto ipv6 ");+ break;+ case AF_PACKET:+ fprintf(fp, "proto packet ");+ break;+ default:+ fprintf(fp, "<unknown proto %d> ", mil->mil_proto);+ }++ fprintf(fp, "\n\t");+ if (instr && instr->mir_instr_length) {+ print_instructions(fp, instr);+ }++ if (stats)+ print_mpls_stats(fp, stats);++ fprintf(fp, "\n");+ fflush(fp);+ return 0;+}++int print_xc(const struct nlmsghdr *n, void *arg, struct rtattr **tb)+{+ FILE *fp = (FILE*)arg;+ struct mpls_xconnect_req *xc;+ struct genlmsghdr *ghdr = NLMSG_DATA(n);++ if ((ghdr->cmd != MPLS_CMD_NEWXC &&+ ghdr->cmd != MPLS_CMD_DELXC) ||+ (!tb[MPLS_ATTR_XC])) {+ fprintf(stderr, "Not an XC\n");+ return -1;+ }++ xc = RTA_DATA(tb[MPLS_ATTR_XC]);++ if (ghdr->cmd == MPLS_CMD_DELXC)+ fprintf(fp, "deleted XC entry ");++ if (ghdr->cmd == MPLS_CMD_NEWXC)+ fprintf(fp, "XC entry ");++ fprintf(fp, "ilm_label ");+ print_label(fp, &xc->mx_in);+ fprintf(fp, "ilm_labelspace %d ", xc->mx_in.ml_index);+ fprintf(fp, "nhlfe_key 0x%08x ",xc->mx_out.u.ml_key);+ fprintf(fp, "\n");+ fflush(fp);+ return 0;+}++int print_labelspace(const struct nlmsghdr *n, void *arg, struct rtattr **tb)+{+ FILE *fp = (FILE*)arg;+ struct mpls_labelspace_req *ls;+ struct genlmsghdr *ghdr = NLMSG_DATA(n);++ if ((ghdr->cmd != MPLS_CMD_SETLABELSPACE) ||+ (!tb[MPLS_ATTR_LABELSPACE])) {+ fprintf(stderr, "Not an Labelspace\n");+ return -1;+ }++ ls = RTA_DATA(tb[MPLS_ATTR_LABELSPACE]);++ fprintf(fp, "LABELSPACE entry ");++ fprintf(fp, "dev %s ", ll_index_to_name(ls->mls_ifindex));+ fprintf(fp, "labelspace %d ",ls->mls_labelspace);+ fprintf(fp, "\n");+ fflush(fp);++ return 0;+}++int print_nhlfe(const struct nlmsghdr *n, void *arg, struct rtattr **tb)+{+ FILE *fp = (FILE*)arg;+ struct mpls_out_label_req *mol;+ struct mpls_instr_req *instr;+ struct gnet_stats_basic *stats;+ struct genlmsghdr *ghdr = NLMSG_DATA(n);++ if ((ghdr->cmd != MPLS_CMD_NEWNHLFE &&+ ghdr->cmd != MPLS_CMD_DELNHLFE) ||+ (!tb[MPLS_ATTR_NHLFE])) {+ fprintf(stderr, "Not a NHLFE\n");+ return -1;+ }++ mol = RTA_DATA(tb[MPLS_ATTR_NHLFE]);+ instr = RTA_DATA(tb[MPLS_ATTR_INSTR]);+ stats = RTA_DATA(tb[MPLS_ATTR_STATS]);++ if (ghdr->cmd == MPLS_CMD_DELNHLFE)+ fprintf(fp, "deleted NHLFE entry ");++ if (ghdr->cmd == MPLS_CMD_NEWNHLFE)+ fprintf(fp, "NHLFE entry ");++ fprintf(fp, "key 0x%08x ", mol->mol_label.u.ml_key);+ fprintf(fp, "mtu %d ",mol->mol_mtu);+ if (mol->mol_propagate_ttl) {+ fprintf(fp, "propagate_ttl ");+ }+ fprintf(fp, "\n\t");+ if (instr && instr->mir_instr_length) {+ print_instructions(fp, instr);+ }++ if (stats)+ print_mpls_stats(fp, stats);+ fprintf(fp, "\n");++ fflush(fp);+ return 0;+}++#if 0+int print_tunnel(const struct nlmsghdr *n, void *arg, struct rtattr **tb)+{+ 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;+ }++ 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;+}+#endif++int print_mpls(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)+{+ struct rtattr *tb[MPLS_ATTR_MAX + 1];+ struct genlmsghdr *ghdr = NLMSG_DATA(n);+ int len = n->nlmsg_len;+ struct rtattr *attrs;++ if (n->nlmsg_type != PF_MPLS) {+ fprintf(stderr, "Not a controller message, nlmsg_len=%d "+ "nlmsg_type=0x%x\n", n->nlmsg_len, n->nlmsg_type);+ return 0;+ }++ len -= NLMSG_LENGTH(GENL_HDRLEN);+ if (len < 0) {+ fprintf(stderr, "BUG: wrong nlmsg len %d\n", len);+ return -1;+ }++ attrs = (struct rtattr *) ((char *) ghdr + GENL_HDRLEN);+ parse_rtattr(tb, MPLS_ATTR_MAX, attrs, len);++ switch (ghdr->cmd) {+ case MPLS_CMD_NEWILM:+ return print_ilm(n,arg,tb);+ case MPLS_CMD_NEWNHLFE:+ return print_nhlfe(n,arg,tb);+ case MPLS_CMD_NEWXC:+ return print_xc(n,arg,tb);+ case MPLS_CMD_SETLABELSPACE:+ return print_labelspace(n,arg,tb);+ default:+ return 0;+ }++#if 0+ if (n->nlmsg_type >= MPLS_RTM_ADDTUNNEL &&+ n->nlmsg_type <= MPLS_RTM_DELTUNNEL) {+ return print_tunnel(n,arg, tb);+ }+#endif+ return 0;+}++int mpls_list(int cmd,int argc, char **argv)+{+ struct genlmsghdr *ghdr;+ struct rtnl_handle rth;++ struct {+ struct nlmsghdr n;+ char buf[4096];+ } req;++ if (rtnl_open_byproto(&rth, 0, NETLINK_GENERIC) < 0) {+ fprintf (stderr, "Error opening nl socket\n");+ exit(-1);+ }+ memset(&req, 0, sizeof(req));++ req.n.nlmsg_len = NLMSG_LENGTH(GENL_HDRLEN);+ req.n.nlmsg_flags = NLM_F_ROOT|NLM_F_MATCH|NLM_F_REQUEST;+ req.n.nlmsg_type = PF_MPLS;+ req.n.nlmsg_seq = rth.dump = ++rth.seq;++ ghdr = NLMSG_DATA(&req.n);+ ghdr->cmd = cmd;+ + if (rtnl_send(&rth, (const char *)&req.n, req.n.nlmsg_len) < 0) {+ perror("Cannot send dump request");+ exit(1);+ }++ if (rtnl_dump_filter(&rth, print_mpls, stdout, NULL, NULL) < 0) {+ fprintf(stderr, "Dump terminated\n");+ exit(1);+ }+ rtnl_close(&rth);++ return 0;+}++int do_ilm(int argc, char **argv) {++ if (argc <= 0 || matches(*argv, "list") == 0 ||+ matches(*argv, "show") == 0)+ return mpls_list(MPLS_CMD_GETILM,argc-1, argv+1);+ if (matches(*argv, "add") == 0)+ return mpls_ilm_modify(MPLS_CMD_NEWILM, NLM_F_CREATE,+ argc-1, argv+1);+ if (matches(*argv, "change") == 0)+ return mpls_ilm_modify(MPLS_CMD_NEWILM, 0, argc-1, argv+1);+ if (matches(*argv, "delete") == 0)+ return mpls_ilm_modify(MPLS_CMD_DELILM, 0, 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 (argc <= 0 || matches(*argv, "list") == 0 ||+ matches(*argv, "show") == 0)+ return mpls_list(MPLS_CMD_GETNHLFE,argc-1, argv+1);+ if (matches(*argv, "add") == 0)+ return mpls_nhlfe_modify(MPLS_CMD_NEWNHLFE,+ NLM_F_CREATE, argc-1, argv+1);+ if (matches(*argv, "change") == 0)+ return mpls_nhlfe_modify(MPLS_CMD_NEWNHLFE, 0, argc-1, argv+1);+ if (matches(*argv, "delete") == 0)+ return mpls_nhlfe_modify(MPLS_CMD_DELNHLFE, 0, 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 (argc <= 0 || matches(*argv, "list") == 0 ||+ matches(*argv, "show") == 0)+ return mpls_list(MPLS_CMD_GETXC,argc-1, argv+1);+ if (matches(*argv, "add") == 0)+ return mpls_xc_modify(MPLS_CMD_NEWXC, NLM_F_CREATE,+ argc-1, argv+1);+ if (matches(*argv, "delete") == 0)+ return mpls_xc_modify(MPLS_CMD_DELXC, 0, 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 (argc <= 0 || matches(*argv, "list") == 0 ||+ matches(*argv, "show") == 0)+ return mpls_list(MPLS_CMD_GETLABELSPACE,argc-1, argv+1);+ if (matches(*argv, "set") == 0)+ return mpls_labelspace_modify(MPLS_CMD_SETLABELSPACE,+ 0, 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 0+ if (argc <= 0 || matches(*argv, "list") == 0 ||+ matches(*argv, "show") == 0)+ return mpls_list(SHIM_VIRT,argc-1, argv+1);+#endif+ if (matches(*argv, "set") == 0)+ return mpls_tunnel_modify(SIOCDEVPRIVATE, argc-1, argv+1);+ if (matches(*argv, "get") == 0)+ return mpls_tunnel_modify(SIOCDEVPRIVATE + 1, 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);+ rtnl_close(&rth1);++ if (matches(argv[1], "monitor") == 0) {+ retval = do_mplsmonitor(argc-2,argv+2);+ } else {+ if (rtnl_open_byproto(&rth1, MPLS_GRP_NHLFE,+ NETLINK_GENERIC) < 0) {+ fprintf (stderr,"Error opening NHLFE rtnl\n");+ exit(-1);+ }+ if (rtnl_open_byproto(&rth2, 0, NETLINK_GENERIC) < 0) {+ fprintf (stderr,"Error opening generic rtnl\n");+ exit(-1);+ }+ 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);+ rtnl_close(&rth2);+ }+ } else {+ usage();+ retval = 1;+ }+ return retval;+}diff -uNr iproute2/mpls/mpls.h iproute2-mpls/mpls/mpls.h--- iproute2/mpls/mpls.h 1969-12-31 18:00:00.000000000 -0600+++ iproute2-mpls/mpls/mpls.h 2005-12-08 22:01:53.000000000 -0600@@ -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/mpls/mpls_monitor.c--- iproute2/mpls/mpls_monitor.c 1969-12-31 18:00:00.000000000 -0600+++ iproute2-mpls/mpls/mpls_monitor.c 2005-12-09 00:41:12.000000000 -0600@@ -0,0 +1,163 @@+/*+ * 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 <linux/genetlink.h>++#include "utils.h"++extern int print_ilm(const struct nlmsghdr *n, void *arg, struct rtattr **tb);+extern int print_nhlfe(const struct nlmsghdr *n, void *arg, struct rtattr
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -