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

📄 iproute2.diff

📁 一个可以实现MPLS实验的linux源代码.你不仅可以实现单层标签的转发,还可以实现2个标签的实验,很好的.
💻 DIFF
📖 第 1 页 / 共 5 页
字号:
+		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 + -