]>
git.proxmox.com Git - mirror_iproute2.git/blob - ip/tunnel.c
2 * Copyright (C)2006 USAGI/WIDE Project
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, see <http://www.gnu.org/licenses>.
18 * split from ip_tunnel.c
22 * Masahide NAKAMURA @USAGI
29 #include <sys/types.h>
30 #include <sys/socket.h>
31 #include <sys/ioctl.h>
32 #include <netinet/in.h>
35 #include <linux/if_tunnel.h>
40 const char *tnl_strproto(__u8 proto
)
61 strcpy(buf
, "unknown");
68 int tnl_get_ioctl(const char *basedev
, void *p
)
74 strncpy(ifr
.ifr_name
, basedev
, IFNAMSIZ
);
75 ifr
.ifr_ifru
.ifru_data
= (void *)p
;
77 fd
= socket(preferred_family
, SOCK_DGRAM
, 0);
79 fprintf(stderr
, "create socket failed: %s\n", strerror(errno
));
83 err
= ioctl(fd
, SIOCGETTUNNEL
, &ifr
);
85 fprintf(stderr
, "get tunnel \"%s\" failed: %s\n", basedev
,
92 int tnl_add_ioctl(int cmd
, const char *basedev
, const char *name
, void *p
)
98 if (cmd
== SIOCCHGTUNNEL
&& name
[0])
99 strncpy(ifr
.ifr_name
, name
, IFNAMSIZ
);
101 strncpy(ifr
.ifr_name
, basedev
, IFNAMSIZ
);
102 ifr
.ifr_ifru
.ifru_data
= p
;
104 fd
= socket(preferred_family
, SOCK_DGRAM
, 0);
106 fprintf(stderr
, "create socket failed: %s\n", strerror(errno
));
110 err
= ioctl(fd
, cmd
, &ifr
);
112 fprintf(stderr
, "add tunnel \"%s\" failed: %s\n", ifr
.ifr_name
,
118 int tnl_del_ioctl(const char *basedev
, const char *name
, void *p
)
125 strncpy(ifr
.ifr_name
, name
, IFNAMSIZ
);
127 strncpy(ifr
.ifr_name
, basedev
, IFNAMSIZ
);
129 ifr
.ifr_ifru
.ifru_data
= p
;
131 fd
= socket(preferred_family
, SOCK_DGRAM
, 0);
133 fprintf(stderr
, "create socket failed: %s\n", strerror(errno
));
137 err
= ioctl(fd
, SIOCDELTUNNEL
, &ifr
);
139 fprintf(stderr
, "delete tunnel \"%s\" failed: %s\n",
140 ifr
.ifr_name
, strerror(errno
));
145 static int tnl_gen_ioctl(int cmd
, const char *name
,
146 void *p
, int skiperr
)
152 strncpy(ifr
.ifr_name
, name
, IFNAMSIZ
);
153 ifr
.ifr_ifru
.ifru_data
= p
;
155 fd
= socket(preferred_family
, SOCK_DGRAM
, 0);
157 fprintf(stderr
, "create socket failed: %s\n", strerror(errno
));
161 err
= ioctl(fd
, cmd
, &ifr
);
162 if (err
&& errno
!= skiperr
)
163 fprintf(stderr
, "%s: ioctl %x failed: %s\n", name
,
164 cmd
, strerror(errno
));
169 int tnl_prl_ioctl(int cmd
, const char *name
, void *p
)
171 return tnl_gen_ioctl(cmd
, name
, p
, -1);
174 int tnl_6rd_ioctl(int cmd
, const char *name
, void *p
)
176 return tnl_gen_ioctl(cmd
, name
, p
, -1);
179 int tnl_ioctl_get_6rd(const char *name
, void *p
)
181 return tnl_gen_ioctl(SIOCGET6RD
, name
, p
, EINVAL
);
184 __be32
tnl_parse_key(const char *name
, const char *key
)
188 if (strchr(key
, '.'))
189 return get_addr32(key
);
191 if (get_unsigned(&uval
, key
, 0) < 0) {
192 fprintf(stderr
, "invalid value for \"%s\": \"%s\";", name
, key
);
193 fprintf(stderr
, " it should be an unsigned integer\n");
199 /* tnl_print_stats - print tunnel statistics
201 * @buf - tunnel interface's line in /proc/net/dev,
202 * starting past the interface name and following colon
204 void tnl_print_stats(const char *buf
)
206 unsigned long rx_bytes
, rx_packets
, rx_errs
, rx_drops
,
208 tx_bytes
, tx_packets
, tx_errs
, tx_drops
,
209 tx_fifo
, tx_colls
, tx_carrier
, rx_multi
;
211 if (sscanf(buf
, "%lu%lu%lu%lu%lu%lu%lu%*d%lu%lu%lu%lu%lu%lu%lu",
212 &rx_bytes
, &rx_packets
, &rx_errs
, &rx_drops
,
213 &rx_fifo
, &rx_frame
, &rx_multi
,
214 &tx_bytes
, &tx_packets
, &tx_errs
, &tx_drops
,
215 &tx_fifo
, &tx_colls
, &tx_carrier
) != 14)
219 printf("RX: Packets Bytes Errors CsumErrs OutOfSeq Mcasts%s", _SL_
);
220 printf(" %-10ld %-12ld %-6ld %-8ld %-8ld %-8ld%s",
221 rx_packets
, rx_bytes
, rx_errs
, rx_frame
, rx_fifo
, rx_multi
, _SL_
);
222 printf("TX: Packets Bytes Errors DeadLoop NoRoute NoBufs%s", _SL_
);
223 printf(" %-10ld %-12ld %-6ld %-8ld %-8ld %-6ld",
224 tx_packets
, tx_bytes
, tx_errs
, tx_colls
, tx_carrier
, tx_drops
);