⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iproute2.diff

📁 基于linux内核2.6.9的mpls补丁
💻 DIFF
📖 第 1 页 / 共 3 页
字号:
+	}++	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 + -