📄 iproute2.diff
字号:
+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 + -