Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.sbin/ip6addrctl Add ip6addrctl from FreeBSD



details:   https://anonhg.NetBSD.org/src/rev/c7039baa69df
branches:  trunk
changeset: 342209:c7039baa69df
user:      christos <christos%NetBSD.org@localhost>
date:      Sat Dec 12 23:35:56 2015 +0000

description:
Add ip6addrctl from FreeBSD

diffstat:

 usr.sbin/ip6addrctl/Makefile               |    7 +
 usr.sbin/ip6addrctl/ip6addrctl.8           |  127 ++++++++
 usr.sbin/ip6addrctl/ip6addrctl.c           |  458 +++++++++++++++++++++++++++++
 usr.sbin/ip6addrctl/ip6addrctl.conf.sample |   12 +
 4 files changed, 604 insertions(+), 0 deletions(-)

diffs (truncated from 620 to 300 lines):

diff -r 0d3cd08c154e -r c7039baa69df usr.sbin/ip6addrctl/Makefile
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/usr.sbin/ip6addrctl/Makefile      Sat Dec 12 23:35:56 2015 +0000
@@ -0,0 +1,7 @@
+#      $NetBSD: Makefile,v 1.1 2015/12/12 23:35:56 christos Exp $
+# $FreeBSD: head/usr.sbin/ip6addrctl/Makefile 241134 2012-10-02 14:48:03Z eadler $
+
+PROG=  ip6addrctl
+MAN=   ip6addrctl.8
+
+.include <bsd.prog.mk>
diff -r 0d3cd08c154e -r c7039baa69df usr.sbin/ip6addrctl/ip6addrctl.8
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/usr.sbin/ip6addrctl/ip6addrctl.8  Sat Dec 12 23:35:56 2015 +0000
@@ -0,0 +1,127 @@
+.\"    $NetBSD: ip6addrctl.8,v 1.1 2015/12/12 23:35:56 christos Exp $
+.\"    $KAME: ip6addrctl.8,v 1.3 2003/03/22 05:56:41 jinmei Exp $
+.\"
+.\" Copyright (C) 2001 WIDE Project.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the project nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD: head/usr.sbin/ip6addrctl/ip6addrctl.8 140368 2005-01-17 07:44:44Z ru $
+.\"
+.Dd September 25, 2001
+.Dt IP6ADDRCTL 8
+.Os
+.\"
+.Sh NAME
+.Nm ip6addrctl
+.Nd configure address selection policy for IPv6 and IPv4
+.\"
+.Sh SYNOPSIS
+.Nm
+.Op Cm show
+.Nm
+.Cm add
+.Ar prefix precedence label
+.Nm
+.Cm delete
+.Ar prefix
+.Nm
+.Cm flush
+.Nm
+.Cm install
+.Ar configfile
+.\"
+.Sh DESCRIPTION
+The
+.Nm
+utility manages the policy table of source and destination address
+selection for outgoing IPv4 and IPv6 packets.
+When
+.Nm
+is invoked without an argument or with a single argument
+.Cm show ,
+it prints the content of the policy table currently installed in the
+kernel.
+.Pp
+To modify the table, the following operations are available:
+.Bl -tag -width indent
+.It Cm add Ar prefix precedence label
+Add a policy entry.
+The
+.Ar prefix
+argument
+is an IPv6 prefix, which is a key for the entry.
+An IPv4 prefix should be specified with an IPv6 prefix using an
+IPv4-mapped IPv6 address.
+The
+.Ar precedence
+and
+.Ar label
+arguments
+are decimal numbers, which specify the precedence and label values
+for the entry, respectively.
+This operation should be performed without an existing entry for the
+prefix.
+.It Cm delete Ar prefix
+Delete a policy entry specified by
+.Ar prefix ,
+which should be an IPv6 prefix.
+A corresponding entry for the prefix should have already been
+installed.
+.It Cm flush
+Delete all existing policy entries in the kernel.
+.It Cm install Ar configfile
+Install policy entries from a configuration file named
+.Ar configfile .
+The configuration file should contain a set of policy entries.
+Each entry is specified in a single line which contains an IPv6 prefix,
+a decimal precedence value, and a decimal label value, separated with
+white space or tab characters.
+In the configuration file, lines beginning with the pound-sign
+.Pq Ql #
+are
+comments and are ignored.
+.El
+.\"
+.Sh EXIT STATUS
+.Ex -std
+.\"
+.Sh SEE ALSO
+.Rs
+.%A "Richard Draves"
+.%T "Default Address Selection for IPv6"
+.%N RFC 3484
+.Re
+.\"
+.Sh HISTORY
+The
+.Nm
+utility first appeared in the KAME IPv6 protocol stack kit.
+The original command name was
+.Nm addrselect ,
+but it was then renamed to the current one so that the name would
+describe its function well.
+.\" .Sh BUGS
+.\" (to be written)
diff -r 0d3cd08c154e -r c7039baa69df usr.sbin/ip6addrctl/ip6addrctl.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/usr.sbin/ip6addrctl/ip6addrctl.c  Sat Dec 12 23:35:56 2015 +0000
@@ -0,0 +1,458 @@
+/*     $KAME: ip6addrctl.c,v 1.3 2003/12/16 08:14:28 suz Exp $ */
+
+/*
+ * Copyright (C) 2001 WIDE Project.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the project nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD: head/usr.sbin/ip6addrctl/ip6addrctl.c 281143 2015-04-06 09:42:23Z glebius $
+ */
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: ip6addrctl.c,v 1.1 2015/12/12 23:35:56 christos Exp $");
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/queue.h>
+#include <sys/param.h>
+#include <sys/ioctl.h>
+#include <sys/sysctl.h>
+
+#include <net/if.h>
+
+#include <netinet/in.h>
+#include <netinet6/in6_var.h>
+
+#include <stdlib.h>
+#include <netdb.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <limits.h>
+#include <string.h>
+#include <err.h>
+
+static char *configfile;
+
+struct policyqueue {
+       TAILQ_ENTRY(policyqueue) pc_entry;
+       struct in6_addrpolicy pc_policy;
+};
+TAILQ_HEAD(policyhead, policyqueue);
+static struct policyhead policyhead;
+
+static void usage(void);
+static void get_policy(void);
+static void dump_policy(void);
+static int mask2plen(struct sockaddr_in6 *);
+static int parse_prefix(const char *, struct in6_addrpolicy *);
+static void make_policy_fromfile(char *);
+static void plen2mask(struct sockaddr_in6 *, int);
+static void set_policy(void);
+static void add_policy(char *, char *, char *);
+static void delete_policy(char *);
+static void flush_policy(void);
+
+int
+main(int argc, char *argv[])
+{
+       TAILQ_INIT(&policyhead);
+
+       if (argc == 1 || strcasecmp(argv[1], "show") == 0) {
+               get_policy();
+               dump_policy();
+       } else if (strcasecmp(argv[1], "add") == 0) {
+               if (argc < 5)
+                       usage();
+               add_policy(argv[2], argv[3], argv[4]);
+       } else if (strcasecmp(argv[1], "delete") == 0) {
+               if (argc < 3)
+                       usage();
+               delete_policy(argv[2]);
+       } else if (strcasecmp(argv[1], "flush") == 0) {
+               get_policy();
+               flush_policy();
+       } else if (strcasecmp(argv[1], "install") == 0) {
+               if (argc < 3)
+                       usage();
+               configfile = argv[2];
+               make_policy_fromfile(configfile);
+               set_policy();
+       } else
+               usage();
+
+       exit(0);
+}
+
+static void
+get_policy(void)
+{
+       int mib[] = { CTL_NET, PF_INET6, IPPROTO_IPV6, IPV6CTL_ADDRCTLPOLICY };
+       size_t l;
+       struct in6_addrpolicy *buf;
+       struct in6_addrpolicy *pol, *ep;
+
+       if (sysctl(mib, sizeof(mib) / sizeof(mib[0]), NULL, &l, NULL, 0) < 0) {
+               err(1, "sysctl(IPV6CTL_ADDRCTLPOLICY)");
+               /* NOTREACHED */
+       }
+       if (l == 0) {
+               printf("no source-address-selection policy is installed\n");
+               return;
+       }
+       if ((buf = malloc(l)) == NULL) {
+               errx(1, "malloc failed");
+               /* NOTREACHED */
+       }
+       if (sysctl(mib, sizeof(mib) / sizeof(mib[0]), buf, &l, NULL, 0) < 0) {
+               err(1, "sysctl(IPV6CTL_ADDRCTLPOLICY)");
+               /* NOTREACHED */
+       }
+
+       ep = buf + l/sizeof(*buf);
+       for (pol = buf; pol + 1 <= ep; pol++) {
+               struct policyqueue *new;
+
+               if ((new = malloc(sizeof(*new))) == NULL)
+                       errx(1, "malloc failed\n");
+               new->pc_policy = *pol;
+               TAILQ_INSERT_TAIL(&policyhead, new, pc_entry);
+       }
+
+       free(buf);
+}
+
+static void
+dump_policy(void)
+{
+       size_t addrlen;
+       char addrbuf[NI_MAXHOST];
+       struct in6_addrpolicy *pol;
+       struct policyqueue *ent;
+       int plen, first = 1;
+



Home | Main Index | Thread Index | Old Index