19447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA/* 29447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA * Copyright (C)2006 USAGI/WIDE Project 3ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger * 49447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA * This program is free software; you can redistribute it and/or modify 59447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA * it under the terms of the GNU General Public License as published by 69447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA * the Free Software Foundation; either version 2 of the License, or 79447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA * (at your option) any later version. 8ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger * 99447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA * This program is distributed in the hope that it will be useful, 109447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA * but WITHOUT ANY WARRANTY; without even the implied warranty of 119447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 129447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA * GNU General Public License for more details. 13ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger * 149447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA * You should have received a copy of the GNU General Public License 159447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA * along with this program; if not, write to the Free Software 169447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 179447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA */ 189447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA/* 199447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA * Author: 209447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA * Masahide NAKAMURA @USAGI 219447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA */ 22ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger 239447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA#include <stdio.h> 249447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA#include <string.h> 259447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA#include <stdlib.h> 269447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA#include <unistd.h> 27288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA#include <sys/types.h> 28288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA#include <sys/socket.h> 299447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA#include <arpa/inet.h> 30288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA#include <sys/ioctl.h> 319447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA#include <linux/ip.h> 32288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA#include <linux/if.h> 33288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA#include <linux/if_arp.h> 349447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA#include <linux/if_tunnel.h> 35288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA#include <linux/ip6_tunnel.h> 369447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA 37288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA#include "utils.h" 38288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA#include "tunnel.h" 39ea71beacacb9ebf756bbc250c71df59ec2f46243Stephen Hemminger#include "ip_common.h" 409447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA 41288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA#define IP6_FLOWINFO_TCLASS htonl(0x0FF00000) 42288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA#define IP6_FLOWINFO_FLOWLABEL htonl(0x000FFFFF) 439447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA 44288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA#define DEFAULT_TNL_HOP_LIMIT (64) 45288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA 46288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURAstatic void usage(void) __attribute__((noreturn)); 479447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA 489447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURAstatic void usage(void) 499447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA{ 50288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA fprintf(stderr, "Usage: ip -f inet6 tunnel { add | change | del | show } [ NAME ]\n"); 510b959b0f4dcb9c905fb1b7f60d39d9e284e77eeaYOSHIFUJI Hideaki / 吉藤英明 fprintf(stderr, " [ mode { ip6ip6 | ipip6 | any } ]\n"); 52288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA fprintf(stderr, " [ remote ADDR local ADDR ] [ dev PHYS_DEV ]\n"); 53288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA fprintf(stderr, " [ encaplimit ELIM ]\n"); 54eddde1101c6f906b61011bbf787c4006c9ca5b30YOSHIFUJI Hideaki / 吉藤英明 fprintf(stderr ," [ hoplimit TTL ] [ tclass TCLASS ] [ flowlabel FLOWLABEL ]\n"); 55288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA fprintf(stderr, " [ dscp inherit ]\n"); 56288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA fprintf(stderr, "\n"); 57eddde1101c6f906b61011bbf787c4006c9ca5b30YOSHIFUJI Hideaki / 吉藤英明 fprintf(stderr, "Where: NAME := STRING\n"); 58eddde1101c6f906b61011bbf787c4006c9ca5b30YOSHIFUJI Hideaki / 吉藤英明 fprintf(stderr, " ADDR := IPV6_ADDRESS\n"); 59eddde1101c6f906b61011bbf787c4006c9ca5b30YOSHIFUJI Hideaki / 吉藤英明 fprintf(stderr, " ELIM := { none | 0..255 }(default=%d)\n", 60288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA IPV6_DEFAULT_TNL_ENCAP_LIMIT); 61eddde1101c6f906b61011bbf787c4006c9ca5b30YOSHIFUJI Hideaki / 吉藤英明 fprintf(stderr, " TTL := 0..255 (default=%d)\n", 62288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA DEFAULT_TNL_HOP_LIMIT); 63eddde1101c6f906b61011bbf787c4006c9ca5b30YOSHIFUJI Hideaki / 吉藤英明 fprintf(stderr, " TOS := { 0x0..0xff | inherit }\n"); 64eddde1101c6f906b61011bbf787c4006c9ca5b30YOSHIFUJI Hideaki / 吉藤英明 fprintf(stderr, " FLOWLABEL := { 0x0..0xfffff | inherit }\n"); 659447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA exit(-1); 669447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA} 679447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA 68288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURAstatic void print_tunnel(struct ip6_tnl_parm *p) 699447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA{ 709447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA char remote[64]; 719447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA char local[64]; 72ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger 739447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA inet_ntop(AF_INET6, &p->raddr, remote, sizeof(remote)); 749447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA inet_ntop(AF_INET6, &p->laddr, local, sizeof(local)); 759447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA 76288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA printf("%s: %s/ipv6 remote %s local %s", 77288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA p->name, tnl_strproto(p->proto), remote, local); 789447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA if (p->link) { 79ea71beacacb9ebf756bbc250c71df59ec2f46243Stephen Hemminger const char *n = ll_index_to_name(p->link); 809447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA if (n) 819447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA printf(" dev %s", n); 829447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA } 839447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA 84288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (p->flags & IP6_TNL_F_IGN_ENCAP_LIMIT) 85288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA printf(" encaplimit none"); 86288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA else 87288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA printf(" encaplimit %u", p->encap_limit); 889447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA 89288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA printf(" hoplimit %u", p->hop_limit); 909447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA 91288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (p->flags & IP6_TNL_F_USE_ORIG_TCLASS) 92eddde1101c6f906b61011bbf787c4006c9ca5b30YOSHIFUJI Hideaki / 吉藤英明 printf(" tclass inherit"); 93288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA else { 94288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA __u32 val = ntohl(p->flowinfo & IP6_FLOWINFO_TCLASS); 95eddde1101c6f906b61011bbf787c4006c9ca5b30YOSHIFUJI Hideaki / 吉藤英明 printf(" tclass 0x%02x", (__u8)(val >> 20)); 969447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA } 979447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA 98288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (p->flags & IP6_TNL_F_USE_ORIG_FLOWLABEL) 99eddde1101c6f906b61011bbf787c4006c9ca5b30YOSHIFUJI Hideaki / 吉藤英明 printf(" flowlabel inherit"); 100288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA else 101eddde1101c6f906b61011bbf787c4006c9ca5b30YOSHIFUJI Hideaki / 吉藤英明 printf(" flowlabel 0x%05x", ntohl(p->flowinfo & IP6_FLOWINFO_FLOWLABEL)); 1029447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA 103288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA printf(" (flowinfo 0x%08x)", ntohl(p->flowinfo)); 1049447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA 105288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (p->flags & IP6_TNL_F_RCV_DSCP_COPY) 106288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA printf(" dscp inherit"); 1079447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA} 1089447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA 10921a5a6b37892d7173f38691d1f84366840ce3917Jiri Bencstatic int parse_args(int argc, char **argv, int cmd, struct ip6_tnl_parm *p) 1109447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA{ 11121a5a6b37892d7173f38691d1f84366840ce3917Jiri Benc int count = 0; 1129447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA char medium[IFNAMSIZ]; 1139447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA 114288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA memset(medium, 0, sizeof(medium)); 1159447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA 1169447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA while (argc > 0) { 1170b959b0f4dcb9c905fb1b7f60d39d9e284e77eeaYOSHIFUJI Hideaki / 吉藤英明 if (strcmp(*argv, "mode") == 0) { 1180b959b0f4dcb9c905fb1b7f60d39d9e284e77eeaYOSHIFUJI Hideaki / 吉藤英明 NEXT_ARG(); 1190b959b0f4dcb9c905fb1b7f60d39d9e284e77eeaYOSHIFUJI Hideaki / 吉藤英明 if (strcmp(*argv, "ipv6/ipv6") == 0 || 1200b959b0f4dcb9c905fb1b7f60d39d9e284e77eeaYOSHIFUJI Hideaki / 吉藤英明 strcmp(*argv, "ip6ip6") == 0) 1210b959b0f4dcb9c905fb1b7f60d39d9e284e77eeaYOSHIFUJI Hideaki / 吉藤英明 p->proto = IPPROTO_IPV6; 1220b959b0f4dcb9c905fb1b7f60d39d9e284e77eeaYOSHIFUJI Hideaki / 吉藤英明 else if (strcmp(*argv, "ip/ipv6") == 0 || 1230b959b0f4dcb9c905fb1b7f60d39d9e284e77eeaYOSHIFUJI Hideaki / 吉藤英明 strcmp(*argv, "ipv4/ipv6") == 0 || 1240b959b0f4dcb9c905fb1b7f60d39d9e284e77eeaYOSHIFUJI Hideaki / 吉藤英明 strcmp(*argv, "ipip6") == 0 || 1250b959b0f4dcb9c905fb1b7f60d39d9e284e77eeaYOSHIFUJI Hideaki / 吉藤英明 strcmp(*argv, "ip4ip6") == 0) 1260b959b0f4dcb9c905fb1b7f60d39d9e284e77eeaYOSHIFUJI Hideaki / 吉藤英明 p->proto = IPPROTO_IPIP; 1270b959b0f4dcb9c905fb1b7f60d39d9e284e77eeaYOSHIFUJI Hideaki / 吉藤英明 else if (strcmp(*argv, "any/ipv6") == 0 || 1280b959b0f4dcb9c905fb1b7f60d39d9e284e77eeaYOSHIFUJI Hideaki / 吉藤英明 strcmp(*argv, "any") == 0) 1290b959b0f4dcb9c905fb1b7f60d39d9e284e77eeaYOSHIFUJI Hideaki / 吉藤英明 p->proto = 0; 1300b959b0f4dcb9c905fb1b7f60d39d9e284e77eeaYOSHIFUJI Hideaki / 吉藤英明 else { 1310b959b0f4dcb9c905fb1b7f60d39d9e284e77eeaYOSHIFUJI Hideaki / 吉藤英明 fprintf(stderr,"Cannot guess tunnel mode.\n"); 1320b959b0f4dcb9c905fb1b7f60d39d9e284e77eeaYOSHIFUJI Hideaki / 吉藤英明 exit(-1); 1330b959b0f4dcb9c905fb1b7f60d39d9e284e77eeaYOSHIFUJI Hideaki / 吉藤英明 } 1340b959b0f4dcb9c905fb1b7f60d39d9e284e77eeaYOSHIFUJI Hideaki / 吉藤英明 } else if (strcmp(*argv, "remote") == 0) { 135288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA inet_prefix raddr; 136288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA NEXT_ARG(); 137288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA get_prefix(&raddr, *argv, preferred_family); 138288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (raddr.family == AF_UNSPEC) 139288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA invarg("\"remote\" address family is AF_UNSPEC", *argv); 140288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA memcpy(&p->raddr, &raddr.data, sizeof(p->raddr)); 141288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA } else if (strcmp(*argv, "local") == 0) { 142288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA inet_prefix laddr; 143288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA NEXT_ARG(); 144288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA get_prefix(&laddr, *argv, preferred_family); 145288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (laddr.family == AF_UNSPEC) 146288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA invarg("\"local\" address family is AF_UNSPEC", *argv); 147288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA memcpy(&p->laddr, &laddr.data, sizeof(p->laddr)); 148288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA } else if (strcmp(*argv, "dev") == 0) { 149288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA NEXT_ARG(); 1509447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA strncpy(medium, *argv, IFNAMSIZ - 1); 151288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA } else if (strcmp(*argv, "encaplimit") == 0) { 152288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA NEXT_ARG(); 153288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (strcmp(*argv, "none") == 0) { 154288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA p->flags |= IP6_TNL_F_IGN_ENCAP_LIMIT; 1559447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA } else { 1569447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA __u8 uval; 157288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (get_u8(&uval, *argv, 0) < -1) 158288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA invarg("invalid ELIM", *argv); 1599447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA p->encap_limit = uval; 1609447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA } 161eddde1101c6f906b61011bbf787c4006c9ca5b30YOSHIFUJI Hideaki / 吉藤英明 } else if (strcmp(*argv, "hoplimit") == 0 || 162eddde1101c6f906b61011bbf787c4006c9ca5b30YOSHIFUJI Hideaki / 吉藤英明 strcmp(*argv, "ttl") == 0 || 163eddde1101c6f906b61011bbf787c4006c9ca5b30YOSHIFUJI Hideaki / 吉藤英明 strcmp(*argv, "hlim") == 0) { 164288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA __u8 uval; 165288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA NEXT_ARG(); 166288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (get_u8(&uval, *argv, 0)) 167eddde1101c6f906b61011bbf787c4006c9ca5b30YOSHIFUJI Hideaki / 吉藤英明 invarg("invalid TTL", *argv); 168288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA p->hop_limit = uval; 169eddde1101c6f906b61011bbf787c4006c9ca5b30YOSHIFUJI Hideaki / 吉藤英明 } else if (strcmp(*argv, "tclass") == 0 || 170eddde1101c6f906b61011bbf787c4006c9ca5b30YOSHIFUJI Hideaki / 吉藤英明 strcmp(*argv, "tc") == 0 || 171eddde1101c6f906b61011bbf787c4006c9ca5b30YOSHIFUJI Hideaki / 吉藤英明 strcmp(*argv, "tos") == 0 || 172eddde1101c6f906b61011bbf787c4006c9ca5b30YOSHIFUJI Hideaki / 吉藤英明 matches(*argv, "dsfield") == 0) { 173288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA __u8 uval; 174288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA NEXT_ARG(); 175288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (strcmp(*argv, "inherit") == 0) 176288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA p->flags |= IP6_TNL_F_USE_ORIG_TCLASS; 177288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA else { 178288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (get_u8(&uval, *argv, 16)) 179eddde1101c6f906b61011bbf787c4006c9ca5b30YOSHIFUJI Hideaki / 吉藤英明 invarg("invalid TClass", *argv); 180288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA p->flowinfo |= htonl((__u32)uval << 20) & IP6_FLOWINFO_TCLASS; 181288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA p->flags &= ~IP6_TNL_F_USE_ORIG_TCLASS; 182288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA } 183eddde1101c6f906b61011bbf787c4006c9ca5b30YOSHIFUJI Hideaki / 吉藤英明 } else if (strcmp(*argv, "flowlabel") == 0 || 184eddde1101c6f906b61011bbf787c4006c9ca5b30YOSHIFUJI Hideaki / 吉藤英明 strcmp(*argv, "fl") == 0) { 185288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA __u32 uval; 186288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA NEXT_ARG(); 187288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (strcmp(*argv, "inherit") == 0) 188288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA p->flags |= IP6_TNL_F_USE_ORIG_FLOWLABEL; 189288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA else { 190288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (get_u32(&uval, *argv, 16)) 191eddde1101c6f906b61011bbf787c4006c9ca5b30YOSHIFUJI Hideaki / 吉藤英明 invarg("invalid Flowlabel", *argv); 192288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (uval > 0xFFFFF) 193eddde1101c6f906b61011bbf787c4006c9ca5b30YOSHIFUJI Hideaki / 吉藤英明 invarg("invalid Flowlabel", *argv); 194288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA p->flowinfo |= htonl(uval) & IP6_FLOWINFO_FLOWLABEL; 195288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA p->flags &= ~IP6_TNL_F_USE_ORIG_FLOWLABEL; 196288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA } 197288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA } else if (strcmp(*argv, "dscp") == 0) { 198288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA NEXT_ARG(); 199288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (strcmp(*argv, "inherit") != 0) 200288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA invarg("not inherit", *argv); 201288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA p->flags |= IP6_TNL_F_RCV_DSCP_COPY; 2029447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA } else { 203288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (strcmp(*argv, "name") == 0) { 204288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA NEXT_ARG(); 205288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA } 206288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (matches(*argv, "help") == 0) 2079447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA usage(); 208288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (p->name[0]) 209288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA duparg2("name", *argv); 2109447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA strncpy(p->name, *argv, IFNAMSIZ - 1); 21121a5a6b37892d7173f38691d1f84366840ce3917Jiri Benc if (cmd == SIOCCHGTUNNEL && count == 0) { 21221a5a6b37892d7173f38691d1f84366840ce3917Jiri Benc struct ip6_tnl_parm old_p; 21321a5a6b37892d7173f38691d1f84366840ce3917Jiri Benc memset(&old_p, 0, sizeof(old_p)); 21421a5a6b37892d7173f38691d1f84366840ce3917Jiri Benc if (tnl_get_ioctl(*argv, &old_p)) 21521a5a6b37892d7173f38691d1f84366840ce3917Jiri Benc return -1; 21621a5a6b37892d7173f38691d1f84366840ce3917Jiri Benc *p = old_p; 21721a5a6b37892d7173f38691d1f84366840ce3917Jiri Benc } 2189447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA } 21921a5a6b37892d7173f38691d1f84366840ce3917Jiri Benc count++; 2209447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA argc--; argv++; 2219447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA } 2229447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA if (medium[0]) { 223ea71beacacb9ebf756bbc250c71df59ec2f46243Stephen Hemminger p->link = ll_name_to_index(medium); 2249447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA if (p->link == 0) 2259447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA return -1; 2269447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA } 2279447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA return 0; 2289447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA} 2299447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA 230288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURAstatic void ip6_tnl_parm_init(struct ip6_tnl_parm *p, int apply_default) 231288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA{ 232288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA memset(p, 0, sizeof(*p)); 233288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA p->proto = IPPROTO_IPV6; 234288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (apply_default) { 235288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA p->hop_limit = DEFAULT_TNL_HOP_LIMIT; 236288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA p->encap_limit = IPV6_DEFAULT_TNL_ENCAP_LIMIT; 237288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA } 238288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA} 239288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA 240288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA/* 241288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA * @p1: user specified parameter 242288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA * @p2: database entry 243288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA */ 244288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURAstatic int ip6_tnl_parm_match(const struct ip6_tnl_parm *p1, 245288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA const struct ip6_tnl_parm *p2) 246288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA{ 247288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA return ((!p1->link || p1->link == p2->link) && 248288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA (!p1->name[0] || strcmp(p1->name, p2->name) == 0) && 249288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA (memcmp(&p1->laddr, &in6addr_any, sizeof(p1->laddr)) == 0 || 250288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA memcmp(&p1->laddr, &p2->laddr, sizeof(p1->laddr)) == 0) && 251288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA (memcmp(&p1->raddr, &in6addr_any, sizeof(p1->raddr)) == 0 || 252288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA memcmp(&p1->raddr, &p2->raddr, sizeof(p1->raddr)) == 0) && 253288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA (!p1->proto || !p2->proto || p1->proto == p2->proto) && 254288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA (!p1->encap_limit || p1->encap_limit == p2->encap_limit) && 255288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA (!p1->hop_limit || p1->hop_limit == p2->hop_limit) && 256288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA (!(p1->flowinfo & IP6_FLOWINFO_TCLASS) || 257288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA !((p1->flowinfo ^ p2->flowinfo) & IP6_FLOWINFO_TCLASS)) && 258288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA (!(p1->flowinfo & IP6_FLOWINFO_FLOWLABEL) || 259288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA !((p1->flowinfo ^ p2->flowinfo) & IP6_FLOWINFO_FLOWLABEL)) && 260288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA (!p1->flags || (p1->flags & p2->flags))); 261288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA} 262288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA 263288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURAstatic int do_tunnels_list(struct ip6_tnl_parm *p) 264288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA{ 265288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA char buf[512]; 266288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA int err = -1; 267288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA FILE *fp = fopen("/proc/net/dev", "r"); 268288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (fp == NULL) { 269288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA perror("fopen"); 270288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA goto end; 271288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA } 272288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA 273288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA /* skip two lines at the begenning of the file */ 27438c867d2a82d6f2b60450550fbaaadc5d9c77579Stephen Hemminger if (!fgets(buf, sizeof(buf), fp) || 27538c867d2a82d6f2b60450550fbaaadc5d9c77579Stephen Hemminger !fgets(buf, sizeof(buf), fp)) { 27638c867d2a82d6f2b60450550fbaaadc5d9c77579Stephen Hemminger fprintf(stderr, "/proc/net/dev read error\n"); 27738c867d2a82d6f2b60450550fbaaadc5d9c77579Stephen Hemminger return -1; 27838c867d2a82d6f2b60450550fbaaadc5d9c77579Stephen Hemminger } 279288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA 280288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA while (fgets(buf, sizeof(buf), fp) != NULL) { 281288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA char name[IFNAMSIZ]; 282ea71beacacb9ebf756bbc250c71df59ec2f46243Stephen Hemminger int index, type; 283288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA unsigned long rx_bytes, rx_packets, rx_errs, rx_drops, 284288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA rx_fifo, rx_frame, 285288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA tx_bytes, tx_packets, tx_errs, tx_drops, 286288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA tx_fifo, tx_colls, tx_carrier, rx_multi; 287288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA struct ip6_tnl_parm p1; 288288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA char *ptr; 289288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA 290288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA buf[sizeof(buf) - 1] = '\0'; 291288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if ((ptr = strchr(buf, ':')) == NULL || 292288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA (*ptr++ = 0, sscanf(buf, "%s", name) != 1)) { 293288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA fprintf(stderr, "Wrong format of /proc/net/dev. Sorry.\n"); 294288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA goto end; 295288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA } 296288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (sscanf(ptr, "%ld%ld%ld%ld%ld%ld%ld%*d%ld%ld%ld%ld%ld%ld%ld", 297288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA &rx_bytes, &rx_packets, &rx_errs, &rx_drops, 298288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA &rx_fifo, &rx_frame, &rx_multi, 299288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA &tx_bytes, &tx_packets, &tx_errs, &tx_drops, 300288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA &tx_fifo, &tx_colls, &tx_carrier) != 14) 301288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA continue; 302288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (p->name[0] && strcmp(p->name, name)) 303288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA continue; 304ea71beacacb9ebf756bbc250c71df59ec2f46243Stephen Hemminger index = ll_name_to_index(name); 305ea71beacacb9ebf756bbc250c71df59ec2f46243Stephen Hemminger if (index == 0) 306ea71beacacb9ebf756bbc250c71df59ec2f46243Stephen Hemminger continue; 307ea71beacacb9ebf756bbc250c71df59ec2f46243Stephen Hemminger type = ll_index_to_type(index); 308288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (type == -1) { 309288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA fprintf(stderr, "Failed to get type of [%s]\n", name); 310288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA continue; 311288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA } 312288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (type != ARPHRD_TUNNEL6) 313288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA continue; 314288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA memset(&p1, 0, sizeof(p1)); 315288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA ip6_tnl_parm_init(&p1, 0); 316288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA strcpy(p1.name, name); 317ea71beacacb9ebf756bbc250c71df59ec2f46243Stephen Hemminger p1.link = ll_name_to_index(p1.name); 318288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (p1.link == 0) 319288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA continue; 320288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (tnl_get_ioctl(p1.name, &p1)) 321288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA continue; 322288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (!ip6_tnl_parm_match(p, &p1)) 323288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA continue; 324288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA print_tunnel(&p1); 325288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (show_stats) { 326288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA printf("%s", _SL_); 327288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA printf("RX: Packets Bytes Errors CsumErrs OutOfSeq Mcasts%s", _SL_); 328288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA printf(" %-10ld %-12ld %-6ld %-8ld %-8ld %-8ld%s", 329288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA rx_packets, rx_bytes, rx_errs, rx_frame, rx_fifo, rx_multi, _SL_); 330288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA printf("TX: Packets Bytes Errors DeadLoop NoRoute NoBufs%s", _SL_); 331288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA printf(" %-10ld %-12ld %-6ld %-8ld %-8ld %-6ld", 332288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA tx_packets, tx_bytes, tx_errs, tx_colls, tx_carrier, tx_drops); 333288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA } 334288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA printf("\n"); 335288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA } 336288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA err = 0; 337288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA 338288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA end: 339288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (fp) 340288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA fclose(fp); 341288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA return err; 342288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA} 343288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA 3449447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURAstatic int do_show(int argc, char **argv) 3459447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA{ 346288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA struct ip6_tnl_parm p; 347288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA 348ea71beacacb9ebf756bbc250c71df59ec2f46243Stephen Hemminger ll_init_map(&rth); 349288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA ip6_tnl_parm_init(&p, 0); 350c3651bf4763d7247e3edd4e20526a85de459041bSrivats P p.proto = 0; /* default to any */ 3519447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA 35221a5a6b37892d7173f38691d1f84366840ce3917Jiri Benc if (parse_args(argc, argv, SIOCGETTUNNEL, &p) < 0) 3539447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA return -1; 3549447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA 355288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (!p.name[0] || show_stats) 356288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA do_tunnels_list(&p); 357288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA else { 358288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (tnl_get_ioctl(p.name, &p)) 359288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA return -1; 360288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA print_tunnel(&p); 361288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA printf("\n"); 362288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA } 3639447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA 3649447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA return 0; 3659447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA} 3669447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA 3679447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURAstatic int do_add(int cmd, int argc, char **argv) 3689447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA{ 369288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA struct ip6_tnl_parm p; 370288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA 371288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA ip6_tnl_parm_init(&p, 1); 3729447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA 37321a5a6b37892d7173f38691d1f84366840ce3917Jiri Benc if (parse_args(argc, argv, cmd, &p) < 0) 3749447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA return -1; 375288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA 376288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA return tnl_add_ioctl(cmd, 377288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA cmd == SIOCCHGTUNNEL && p.name[0] ? 378288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA p.name : "ip6tnl0", p.name, &p); 3799447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA} 3809447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA 381288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURAstatic int do_del(int argc, char **argv) 3829447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA{ 383288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA struct ip6_tnl_parm p; 384288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA 385288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA ip6_tnl_parm_init(&p, 1); 3869447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA 38721a5a6b37892d7173f38691d1f84366840ce3917Jiri Benc if (parse_args(argc, argv, SIOCDELTUNNEL, &p) < 0) 3889447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA return -1; 3899447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA 390288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA return tnl_del_ioctl(p.name[0] ? p.name : "ip6tnl0", p.name, &p); 3919447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA} 3929447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA 393ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemmingerint do_ip6tunnel(int argc, char **argv) 394ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger{ 395288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA switch (preferred_family) { 396288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA case AF_UNSPEC: 397288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA preferred_family = AF_INET6; 398288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA break; 399288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA case AF_INET6: 400288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA break; 401288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA default: 402288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA fprintf(stderr, "Unsupported family:%d\n", preferred_family); 403288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA exit(-1); 404288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA } 405288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA 4069447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA if (argc > 0) { 407288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (matches(*argv, "add") == 0) 4089447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA return do_add(SIOCADDTUNNEL, argc - 1, argv + 1); 409288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (matches(*argv, "change") == 0) 4109447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA return do_add(SIOCCHGTUNNEL, argc - 1, argv + 1); 411288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (matches(*argv, "del") == 0) 4129447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA return do_del(argc - 1, argv + 1); 413288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (matches(*argv, "show") == 0 || 414288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA matches(*argv, "lst") == 0 || 415288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA matches(*argv, "list") == 0) 4169447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA return do_show(argc - 1, argv + 1); 417288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA if (matches(*argv, "help") == 0) 4189447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA usage(); 4199447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA } else 4209447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA return do_show(0, NULL); 4219447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA 422288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA fprintf(stderr, "Command \"%s\" is unknown, try \"ip -f inet6 tunnel help\".\n", *argv); 423288384f22ffafd2d7d888ee45d8dfcf26d3f2b1cMasahide NAKAMURA exit(-1); 4249447a0d344bf772027a9012a44b6b536e170da35Masahide NAKAMURA} 425