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

📄 iproute2.diff

📁 一个可以实现MPLS实验的linux源代码.你不仅可以实现单层标签的转发,还可以实现2个标签的实验,很好的.
💻 DIFF
📖 第 1 页 / 共 5 页
字号:
+SUBDIRS=lib ip tc misc netem mpls  LIBNETLINK=../lib/libnetlink.a ../lib/libutil.a diff -uNr iproute2/misc/ss.c iproute2-mpls/misc/ss.c--- iproute2/misc/ss.c	2005-08-24 00:23:21.000000000 -0500+++ iproute2-mpls/misc/ss.c	2005-12-08 22:01:53.000000000 -0600@@ -1460,7 +1460,7 @@ 	char	buf[8192]; 	struct iovec iov[3]; -	if ((fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_TCPDIAG)) < 0)+	if ((fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_INET_DIAG)) < 0) 		return -1;  	memset(&nladdr, 0, sizeof(nladdr));diff -uNr iproute2/mpls/Makefile iproute2-mpls/mpls/Makefile--- iproute2/mpls/Makefile	1969-12-31 18:00:00.000000000 -0600+++ iproute2-mpls/mpls/Makefile	2005-12-08 22:01:53.000000000 -0600@@ -0,0 +1,19 @@+MPLSOBJ=mpls.o mpls_monitor.o++include ../Config++MPLSMODULES :=++MPLSLIB := ++LDFLAGS += -Wl,-export-dynamic -lm++all: mpls ++mpls: $(MPLSOBJ) $(LIBNETLINK) $(LIBUTIL) $(MPLSLIB) ++install: all+	install -m 0755 -s mpls $(DESTDIR)$(SBINDIR)++clean:+	rm -f $(MPLSOBJ) $(MPLSLIB) mplsdiff -uNr iproute2/mpls/mpls.c iproute2-mpls/mpls/mpls.c--- iproute2/mpls/mpls.c	1969-12-31 18:00:00.000000000 -0600+++ iproute2-mpls/mpls/mpls.c	2005-12-17 18:41:34.000000000 -0600@@ -0,0 +1,1349 @@+/*+ * mpls.c		"mpls" utility frontend.+ *+ *	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.+ *+ */++#include <stdio.h>+#include <stdlib.h>+#include <unistd.h>+#include <syslog.h>+#include <fcntl.h>+#include <dlfcn.h>+#include <sys/socket.h>+#include <netinet/in.h>+#include <arpa/inet.h>+#include <string.h>+#include <errno.h>+#include <math.h>+#include <asm/types.h>+#include <linux/if_ether.h>+#include <linux/gen_stats.h>+#include <linux/mpls.h>+#include <linux/socket.h>+#include <sys/ioctl.h>+#include <linux/genetlink.h>++#include "SNAPSHOT.h"+#include "utils.h"++int show_stats = 0;+int show_details = 0;+int show_raw = 0;+int resolve_hosts = 0;++struct rtnl_handle rth1;	/* RTNL for NHLFE Adds */+struct rtnl_handle rth2;	/* RTNL for all other MPLS entity actions */++extern int do_mplsmonitor(int argc, char **argv);+int print_mpls(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg);++static void usage(void)+{+	fprintf(stderr, "Usage: mpls ilm CMD label LABEL labelspace NUMBER [proto PROTO | instructions INSTR]\n");+	fprintf(stderr, "       mpls nhlfe CMD key KEY [mtu MTU propagate_ttl | instructions INSTR]\n");+	fprintf(stderr, "       mpls xc CMD ilm_label LABEL ilm_labelspace NUMBER nhlfe_key KEY\n");+	fprintf(stderr, "       mpls labelspace set dev NAME labelspace NUMBER\n");+	fprintf(stderr, "       mpls labelspace set dev NAME labelspace -1\n");+	fprintf(stderr, "       mpls tunnel CMD dev NAME nhlfe KEY\n");+	fprintf(stderr, "\n");+	fprintf(stderr, "       mpls ilm show [label LABEL labelspace NUMBER]\n");+	fprintf(stderr, "       mpls nhlfe show [key KEY]\n");+	fprintf(stderr, "       mpls xc show [ilm_label LABEL ilm_labelspace NUMBER]\n");+	fprintf(stderr, "       mpls labelspace show [dev NAME]\n");+	fprintf(stderr, "       mpls monitor ...\n");+	fprintf(stderr, "\n");+	fprintf(stderr, "Where:\n");+	fprintf(stderr, "CMD    := add | del | change\n");+	fprintf(stderr, "NUMBER := 0 .. 255\n");+	fprintf(stderr, "TYPE   := gen | atm | fr\n");+	fprintf(stderr, "VALUE  := 16 .. 1048575 | <VPI>/<VCI> | 16 .. 1023\n");+	fprintf(stderr, "LABEL  := TYPE VALUE\n");+	fprintf(stderr, "KEY    := 0 for add | previously returned key\n");+	fprintf(stderr, "NAME   := network device name (i.e. eth0)\n");+	fprintf(stderr, "PROTO  := ipv4 | ipv6\n");+	fprintf(stderr, "ADDR   := ipv6 or ipv4 address\n");+	fprintf(stderr, "NH     := nexthop NAME [none|packet|PROTO ADDR]\n");+	fprintf(stderr, "FWD    := forward KEY\n");+	fprintf(stderr, "PUSH   := push LABEL\n");+	fprintf(stderr, "INSTR  := NH | PUSH | pop | deliver | peek | FWD |\n");+	fprintf(stderr, "	  set-dscp <DSCP> | set-exp <EXP> |\n");+	fprintf(stderr, "	  set-tcindex <TCINDEX> | set-rx-if <NAME>\n");+	fprintf(stderr, "	  forward <KEY> | expfwd <EXP> <KEY> ... |\n");+	fprintf(stderr, "	  exp2tc <EXP> <TCINDEX> ... | exp2ds <EXP> <DSCP> ... |\n");+	fprintf(stderr, "	  nffwd <MASK> [ <NFMARK> <KEY> ... ] |\n");+	fprintf(stderr, "	  nf2exp <MASK> [ <NFMARK> <EXP> ... ] |\n");+	fprintf(stderr, "	  tc2exp <MASK> [ <TCINDEX> <EXP> ... ] |\n");+	fprintf(stderr, "	  ds2exp <MASK> [ <DSCP> <EXP> ... ] |\n");+	fprintf(stderr, "	  dsfwd <MASK> [ <DSCP> <KEY> ... ]\n");+	fprintf(stderr, "\n");+	exit(-1);+}++int mpls_list(int cmd,int argc, char **argv);++int mpls_table_list(int argc, char **argv)+{+	if (argc <= 0) {+		mpls_list(MPLS_CMD_GETNHLFE,0,NULL);+		mpls_list(MPLS_CMD_GETILM,0,NULL);+		mpls_list(MPLS_CMD_GETXC,0,NULL);+		mpls_list(MPLS_CMD_GETLABELSPACE,0,NULL);+	}+	return 0;+}++void+mpls_parse_label (struct mpls_label *label, int *pargc, char ***pargv) {+	unsigned int l1, l2;+	char *value;+	int argc = *pargc;+	char **argv = *pargv;++	if (strncmp(*argv, "fr", 2) == 0) {+		label->ml_type = MPLS_LABEL_FR;+	} else if (strncmp(*argv, "atm", 3) == 0) {+		label->ml_type = MPLS_LABEL_ATM;+	} else if (strncmp(*argv, "gen", 3) == 0) {+		label->ml_type = MPLS_LABEL_GEN;+	} else {+		invarg(*argv, "invalid mpls label type");+	}++	NEXT_ARG();+	value = *argv;++	switch (label->ml_type) {+		case MPLS_LABEL_GEN:+			if (get_unsigned(&l1, value, 0) || l1 > 1048575)+				invarg(value, "invalid label value");+			label->u.ml_gen = l1;+			break;+		case MPLS_LABEL_ATM:+			if (sscanf(value, "%u/%d", &l1, &l2) != 2)+				invarg(value, "invalid label value");+			label->u.ml_atm.mla_vpi = l1;+			label->u.ml_atm.mla_vci = l2;+		case MPLS_LABEL_FR:+			if (get_unsigned(&l1, value, 0) || l1 > 1023)+				invarg(value, "invalid label value");+			label->u.ml_fr = l1;+		default:+			fprintf(stderr, "Invalid label type!\n");+			exit(-1);+	}+	*pargc = argc;+	*pargv = argv;+}++void+mpls_parse_instr(struct mpls_instr_req *instr, int *pargc, char ***pargv,+	int direction) {+	int argc = *pargc;+	char **argv = *pargv;+	int c = 0;++	while (argc > 0) {+		if (strcmp(*argv, "nexthop") == 0) {+			NEXT_ARG();+			inet_prefix addr;+			instr->mir_instr[c].mir_opcode = MPLS_OP_SET;+			instr->mir_instr[c].mir_set.mni_if =+				ll_name_to_index(*argv);+			NEXT_ARG();+			if (strcmp(*argv, "ipv4") == 0) {+				struct sockaddr_in *sin = (struct sockaddr_in*)+					&instr->mir_instr[c].mir_set.mni_addr;+				NEXT_ARG();+				get_addr(&addr, *argv, AF_INET);+				sin->sin_family = AF_INET;+				memcpy(&sin->sin_addr, &addr.data,+					addr.bytelen);+			} else if (strcmp(*argv, "ipv6") == 0) {+				struct sockaddr_in6 *sin6=(struct sockaddr_in6*)+					&instr->mir_instr[c].mir_set.mni_addr;+				NEXT_ARG();+				get_addr(&addr, *argv, AF_INET6);+				sin6->sin6_family = AF_INET6;+				memcpy(&sin6->sin6_addr, &addr.data,+					addr.bytelen);+			} else if (strcmp(*argv, "packet") == 0) {+				struct sockaddr *s =+					&instr->mir_instr[c].mir_set.mni_addr;+				s->sa_family = AF_PACKET;+			} else if (strcmp(*argv, "none") == 0) {+				struct sockaddr *s =+					&instr->mir_instr[c].mir_set.mni_addr;+				memset(s, 0, sizeof(struct sockaddr));+				continue;+			} else {+				invarg(*argv, "invalid nexthop type");+			}+		} else if (strcmp(*argv, "push") == 0) {+			NEXT_ARG();+			instr->mir_instr[c].mir_opcode = MPLS_OP_PUSH;+			*pargc = argc; *pargv = argv;+			mpls_parse_label(&instr->mir_instr[c].mir_push,+				pargc, pargv);+			argc = *pargc; argv = *pargv;+		} else if (strcmp(*argv, "forward") == 0) {+			__u32 key;+			NEXT_ARG();+			if (get_unsigned(&key, *argv, 0))+				invarg(*argv, "invalid key");+			instr->mir_instr[c].mir_fwd.ml_type = MPLS_LABEL_KEY;+			instr->mir_instr[c].mir_fwd.u.ml_key = key;+			instr->mir_instr[c].mir_opcode = MPLS_OP_FWD;+		} else if (strcmp(*argv, "pop") == 0) {+			if (direction == MPLS_OUT)+				invarg(*argv, "invalid NHLFE instruction");+			instr->mir_instr[c].mir_opcode = MPLS_OP_POP;+		} else if (strcmp(*argv, "peek") == 0) {+			if (direction == MPLS_OUT)+				invarg(*argv, "invalid NHLFE instruction");+			instr->mir_instr[c].mir_opcode = MPLS_OP_PEEK;+		} else if (strcmp(*argv, "deliver") == 0) {+			if (direction == MPLS_OUT)+				invarg(*argv, "invalid NHLFE instruction");+			instr->mir_instr[c].mir_opcode = MPLS_OP_DLV;+		} else if (strcmp(*argv, "set-dscp") == 0) {+			__u32 dscp;+			if (direction == MPLS_OUT)+				invarg(*argv, "invalid NHLFE instruction");+			NEXT_ARG();+			if (get_unsigned(&dscp, *argv, 0))+				invarg(*argv, "invalid DSCP");+			instr->mir_instr[c].mir_opcode = MPLS_OP_SET_DS;+			instr->mir_instr[c].mir_set_ds = dscp;+		} else if (strcmp(*argv, "set-tcindex") == 0) {+			__u32 tcindex;+			NEXT_ARG();+			if (get_unsigned(&tcindex, *argv, 0))+				invarg(*argv, "invalid TCINDEX");+			instr->mir_instr[c].mir_opcode = MPLS_OP_SET_TC;+			instr->mir_instr[c].mir_set_tc = tcindex;+		} else if (strcmp(*argv, "set-exp") == 0) {+			__u32 exp;+			NEXT_ARG();+			if (get_unsigned(&exp, *argv, 0))+				invarg(*argv, "invalid EXP");+			instr->mir_instr[c].mir_opcode = MPLS_OP_SET_EXP;+			instr->mir_instr[c].mir_set_exp = exp;+		} else if (strcmp(*argv, "set-rx-if") == 0) {+			if (direction == MPLS_OUT)+				invarg(*argv, "invalid NHLFE instruction");+			NEXT_ARG();+			instr->mir_instr[c].mir_opcode = MPLS_OP_SET_RX;+			instr->mir_instr[c].mir_set_rx =ll_name_to_index(*argv);+		} else if (strcmp(*argv, "expfwd") == 0) {+			int done = 0;+			unsigned int exp;+			unsigned int key;+			do {+				NEXT_ARG();+				if (get_unsigned(&exp, *argv, 0)) {+					done = 1;+					break;+				}+				NEXT_ARG();+				if (get_unsigned(&key, *argv, 0)) {+					done = 1;+					break;+				}+				instr->mir_instr[c].mir_exp_fwd.ef_key[exp] = key;+			} while (!done);+			PREV_ARG();+			instr->mir_instr[c].mir_opcode = MPLS_OP_EXP_FWD;+		} else if (strcmp(*argv, "exp2tc") == 0) {+			int done = 0;+			unsigned int exp;+			unsigned int tcindex;+			do {+				NEXT_ARG();+				if (get_unsigned(&exp, *argv, 0)) {+					done = 1;+					break;+				}+				NEXT_ARG();+				if (get_unsigned(&tcindex, *argv, 0)) {+					done = 1;+					break;+				}+				instr->mir_instr[c].mir_exp2tc.e2t[exp] =+									tcindex;+			} while (!done);+			PREV_ARG();+			instr->mir_instr[c].mir_opcode = MPLS_OP_EXP2TC;+		} else if (strcmp(*argv, "exp2ds") == 0) {+			int done = 0;+			unsigned int exp;+			unsigned int dscp;+			if (direction == MPLS_OUT)+				invarg(*argv, "invalid NHLFE instruction");+			do {+				NEXT_ARG();+				if (get_unsigned(&exp, *argv, 0)) {+					done = 1;+					break;+				}+				NEXT_ARG();+				if (get_unsigned(&dscp, *argv, 0)) {+					done = 1;+					break;+				}+				instr->mir_instr[c].mir_exp2ds.e2d[exp] = dscp;+			} while (!done);+			PREV_ARG();+			instr->mir_instr[c].mir_opcode = MPLS_OP_EXP2DS;+		} else if (strcmp(*argv, "nffwd") == 0) {+			int done = 0;+			unsigned int nfmark;+			unsigned int key;+			unsigned int mask;+			NEXT_ARG();+			if (!get_unsigned(&mask, *argv, 0)) {+				instr->mir_instr[c].mir_nf_fwd.nf_mask = mask;+				do {+					NEXT_ARG();+					if (get_unsigned(&nfmark, *argv, 0)) {+						done = 1;+						break;+					}+					NEXT_ARG();+					if (get_unsigned(&key, *argv, 0)) {+						done = 1;+						break;+					}+					instr->mir_instr[c].mir_nf_fwd.nf_key[nfmark] = key;+				} while (!done);+			}+			PREV_ARG();+			instr->mir_instr[c].mir_opcode = MPLS_OP_NF_FWD;+		} else if (strcmp(*argv, "nf2exp") == 0) {+			int done = 0;+			unsigned int nfmark;+			unsigned int exp;+			unsigned int mask;+			NEXT_ARG();+			if (!get_unsigned(&mask, *argv, 0)) {+				instr->mir_instr[c].mir_nf2exp.n2e_mask = mask;+				do {+					NEXT_ARG();+					if (get_unsigned(&nfmark, *argv, 0)) {+						done = 1;+						break;+					}+					NEXT_ARG();+					if (get_unsigned(&exp, *argv, 0)) {+						done = 1;+						break;+					}+					instr->mir_instr[c].mir_nf2exp.n2e[nfmark] = exp;+				} while (!done);+			}+			PREV_ARG();+			instr->mir_instr[c].mir_opcode = MPLS_OP_NF2EXP;+		} else if (strcmp(*argv, "tc2exp") == 0) {+			int done = 0;+			unsigned int tcindex;+			unsigned int exp;+			unsigned int mask;+			NEXT_ARG();+			if (!get_unsigned(&mask, *argv, 0)) {+				instr->mir_instr[c].mir_tc2exp.t2e_mask = mask;+				do {+					NEXT_ARG();+					if (get_unsigned(&tcindex, *argv, 0)) {+						done = 1;+						break;+					}+					NEXT_ARG();+					if (get_unsigned(&exp, *argv, 0)) {+						done = 1;+						break;+					}+					instr->mir_instr[c].mir_tc2exp.t2e[tcindex] = exp;+				} while (!done);+			}+			PREV_ARG();+			instr->mir_instr[c].mir_opcode = MPLS_OP_TC2EXP;+		} else if (strcmp(*argv, "ds2exp") == 0) {+			int done = 0;+			unsigned int dscp;+			unsigned int exp;+			unsigned int mask;+			if (direction == MPLS_IN)+				invarg(*argv, "invalid ILM instruction");+			NEXT_ARG();+			if (!get_unsigned(&mask, *argv, 0)) {+				instr->mir_instr[c].mir_ds2exp.d2e_mask = mask;+				do {+					NEXT_ARG();+					if (get_unsigned(&dscp, *argv, 0)) {+						done = 1;+						break;+					}+					NEXT_ARG();+					if (get_unsigned(&exp, *argv, 0)) {+						done = 1;+						break;+					}+					instr->mir_instr[c].mir_ds2exp.d2e[dscp] = exp;+				} while (!done);+			}+			PREV_ARG();+			instr->mir_instr[c].mir_opcode = MPLS_OP_DS2EXP;+		} else if (strcmp(*argv, "dsfwd") == 0) {+			int done = 0;+			unsigned int dscp;+			unsigned int key;+			unsigned int mask;+			NEXT_ARG();+			if (!get_unsigned(&mask, *argv, 0)) {+				instr->mir_instr[c].mir_ds_fwd.df_mask = mask;+				do {+					NEXT_ARG();+					if (get_unsigned(&dscp, *argv, 0)) {+						done = 1;+						break;+					}+					NEXT_ARG();+					if (get_unsigned(&key, *argv, 0)) {+						done = 1;+						break;+					}+					instr->mir_instr[c].mir_ds_fwd.df_key[dscp] = key;+				} while (!done);+			}+			PREV_ARG();+			instr->mir_instr[c].mir_opcode = MPLS_OP_DS_FWD;+		} else {+			invarg(*argv, "invalid mpls instruction");+		}+		argc--; argv++; c++;+	}+	instr->mir_instr_length = c;+	instr->mir_direction = direction;++	*pargc = argc;+	*pargv = argv;+}++int+mpls_ilm_modify(int cmd, unsigned flags, int argc, char **argv)+{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -