Home | History | Annotate | Line # | Download | only in ifconfig
agr.c revision 1.8.2.1
      1  1.8.2.1  wrstuden /*	$NetBSD: agr.c,v 1.8.2.1 2008/06/23 04:29:57 wrstuden Exp $	*/
      2      1.1      yamt 
      3      1.1      yamt /*-
      4      1.1      yamt  * Copyright (c)2005 YAMAMOTO Takashi,
      5      1.1      yamt  * All rights reserved.
      6      1.1      yamt  *
      7      1.1      yamt  * Redistribution and use in source and binary forms, with or without
      8      1.1      yamt  * modification, are permitted provided that the following conditions
      9      1.1      yamt  * are met:
     10      1.1      yamt  * 1. Redistributions of source code must retain the above copyright
     11      1.1      yamt  *    notice, this list of conditions and the following disclaimer.
     12      1.1      yamt  * 2. Redistributions in binary form must reproduce the above copyright
     13      1.1      yamt  *    notice, this list of conditions and the following disclaimer in the
     14      1.1      yamt  *    documentation and/or other materials provided with the distribution.
     15      1.1      yamt  *
     16      1.1      yamt  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     17      1.1      yamt  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     18      1.1      yamt  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     19      1.1      yamt  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     20      1.1      yamt  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     21      1.1      yamt  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     22      1.1      yamt  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     23      1.1      yamt  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     24      1.1      yamt  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     25      1.1      yamt  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     26      1.1      yamt  * SUCH DAMAGE.
     27      1.1      yamt  */
     28      1.1      yamt 
     29      1.1      yamt #include <sys/cdefs.h>
     30      1.1      yamt #if !defined(lint)
     31  1.8.2.1  wrstuden __RCSID("$NetBSD: agr.c,v 1.8.2.1 2008/06/23 04:29:57 wrstuden Exp $");
     32      1.1      yamt #endif /* !defined(lint) */
     33      1.1      yamt 
     34      1.1      yamt #include <sys/param.h>
     35      1.1      yamt #include <sys/ioctl.h>
     36      1.1      yamt 
     37      1.1      yamt #include <net/if.h>
     38      1.1      yamt #include <net/agr/if_agrioctl.h>
     39      1.1      yamt 
     40      1.1      yamt #include <ctype.h>
     41      1.1      yamt #include <err.h>
     42      1.1      yamt #include <errno.h>
     43      1.1      yamt #include <string.h>
     44      1.5    dyoung #include <stdio.h>
     45      1.1      yamt #include <stdlib.h>
     46      1.1      yamt #include <util.h>
     47      1.1      yamt 
     48  1.8.2.1  wrstuden #include "agr.h"
     49      1.5    dyoung #include "env.h"
     50      1.2   thorpej #include "extern.h"
     51  1.8.2.1  wrstuden #include "parse.h"
     52  1.8.2.1  wrstuden #include "util.h"
     53  1.8.2.1  wrstuden 
     54  1.8.2.1  wrstuden static int checkifname(prop_dictionary_t);
     55  1.8.2.1  wrstuden static void assertifname(prop_dictionary_t);
     56      1.1      yamt 
     57  1.8.2.1  wrstuden static struct piface agrif = PIFACE_INITIALIZER(&agrif, "agr interface",
     58  1.8.2.1  wrstuden     agrsetport, "agrport", &command_root.pb_parser);
     59  1.8.2.1  wrstuden 
     60  1.8.2.1  wrstuden static const struct kwinst agrkw[] = {
     61  1.8.2.1  wrstuden 	  {.k_word = "agrport", .k_type = KW_T_INT, .k_int = AGRCMD_ADDPORT,
     62  1.8.2.1  wrstuden 	   .k_nextparser = &agrif.pif_parser}
     63  1.8.2.1  wrstuden 	, {.k_word = "-agrport", .k_type = KW_T_INT, .k_int = AGRCMD_REMPORT,
     64  1.8.2.1  wrstuden 	   .k_nextparser = &agrif.pif_parser}
     65  1.8.2.1  wrstuden };
     66  1.8.2.1  wrstuden 
     67  1.8.2.1  wrstuden struct pkw agr = PKW_INITIALIZER(&agr, "agr", NULL, "agrcmd",
     68  1.8.2.1  wrstuden     agrkw, __arraycount(agrkw), NULL);
     69      1.1      yamt 
     70      1.1      yamt static int
     71  1.8.2.1  wrstuden checkifname(prop_dictionary_t env)
     72      1.1      yamt {
     73  1.8.2.1  wrstuden 	const char *ifname;
     74  1.8.2.1  wrstuden 
     75  1.8.2.1  wrstuden 	if ((ifname = getifname(env)) == NULL)
     76  1.8.2.1  wrstuden 		return 1;
     77      1.1      yamt 
     78      1.3   thorpej 	return strncmp(ifname, "agr", 3) != 0 ||
     79      1.3   thorpej 	    !isdigit((unsigned char)ifname[3]);
     80      1.1      yamt }
     81      1.1      yamt 
     82      1.1      yamt static void
     83  1.8.2.1  wrstuden assertifname(prop_dictionary_t env)
     84      1.1      yamt {
     85  1.8.2.1  wrstuden 	if (checkifname(env))
     86      1.1      yamt 		errx(EXIT_FAILURE, "valid only with agr(4) interfaces");
     87      1.1      yamt }
     88      1.1      yamt 
     89      1.5    dyoung int
     90      1.5    dyoung agrsetport(prop_dictionary_t env, prop_dictionary_t xenv)
     91      1.1      yamt {
     92      1.4    dyoung 	char buf[IFNAMSIZ];
     93      1.1      yamt 	struct agrreq ar;
     94      1.7    dyoung 	const char *port;
     95      1.7    dyoung 	int64_t cmd;
     96      1.5    dyoung 
     97      1.7    dyoung 	if (!prop_dictionary_get_int64(env, "agrcmd", &cmd)) {
     98      1.5    dyoung 		warnx("%s.%d", __func__, __LINE__);
     99      1.5    dyoung 		errno = ENOENT;
    100      1.5    dyoung 		return -1;
    101      1.5    dyoung 	}
    102      1.4    dyoung 
    103      1.7    dyoung 	if (!prop_dictionary_get_cstring_nocopy(env, "agrport", &port)) {
    104      1.5    dyoung 		warnx("%s.%d", __func__, __LINE__);
    105      1.5    dyoung 		errno = ENOENT;
    106      1.5    dyoung 		return -1;
    107      1.5    dyoung 	}
    108      1.7    dyoung 	strlcpy(buf, port, sizeof(buf));
    109      1.4    dyoung 
    110  1.8.2.1  wrstuden 	assertifname(env);
    111      1.1      yamt 	memset(&ar, 0, sizeof(ar));
    112      1.1      yamt 	ar.ar_version = AGRREQ_VERSION;
    113      1.7    dyoung 	ar.ar_cmd = cmd;
    114      1.4    dyoung 	ar.ar_buf = buf;
    115      1.4    dyoung 	ar.ar_buflen = strlen(buf);
    116      1.1      yamt 
    117  1.8.2.1  wrstuden 	if (indirect_ioctl(env, SIOCSETAGR, &ar) == -1)
    118      1.1      yamt 		err(EXIT_FAILURE, "SIOCSETAGR");
    119      1.5    dyoung 	return 0;
    120      1.1      yamt }
    121      1.1      yamt 
    122      1.1      yamt void
    123      1.6    dyoung agr_status(prop_dictionary_t env, prop_dictionary_t oenv)
    124      1.1      yamt {
    125      1.1      yamt 	struct agrreq ar;
    126      1.1      yamt 	void *buf = NULL;
    127      1.1      yamt 	size_t buflen = 0;
    128      1.1      yamt 	struct agrportlist *apl;
    129      1.1      yamt 	struct agrportinfo *api;
    130      1.1      yamt 	int i;
    131      1.5    dyoung 
    132  1.8.2.1  wrstuden 	if (checkifname(env))
    133      1.1      yamt 		return;
    134      1.1      yamt 
    135      1.1      yamt again:
    136      1.1      yamt 	memset(&ar, 0, sizeof(ar));
    137      1.1      yamt 	ar.ar_version = AGRREQ_VERSION;
    138      1.1      yamt 	ar.ar_cmd = AGRCMD_PORTLIST;
    139      1.1      yamt 	ar.ar_buf = buf;
    140      1.1      yamt 	ar.ar_buflen = buflen;
    141      1.1      yamt 
    142  1.8.2.1  wrstuden 	if (indirect_ioctl(env, SIOCGETAGR, &ar) == -1) {
    143      1.1      yamt 		if (errno != E2BIG) {
    144      1.1      yamt 			warn("SIOCGETAGR");
    145      1.1      yamt 			return;
    146      1.1      yamt 		}
    147      1.1      yamt 
    148      1.1      yamt 		free(buf);
    149      1.1      yamt 		buf = NULL;
    150      1.1      yamt 		buflen = 0;
    151      1.1      yamt 		goto again;
    152      1.1      yamt 	}
    153      1.1      yamt 
    154      1.1      yamt 	if (buf == NULL) {
    155      1.1      yamt 		buflen = ar.ar_buflen;
    156      1.1      yamt 		buf = malloc(buflen);
    157      1.1      yamt 		if (buf == NULL) {
    158      1.1      yamt 			err(EXIT_FAILURE, "agr_status");
    159      1.1      yamt 		}
    160      1.1      yamt 		goto again;
    161      1.1      yamt 	}
    162      1.1      yamt 
    163      1.1      yamt 	apl = buf;
    164      1.1      yamt 	api = (void *)(apl + 1);
    165      1.1      yamt 
    166      1.1      yamt 	for (i = 0; i < apl->apl_nports; i++) {
    167      1.1      yamt 		char tmp[256];
    168      1.1      yamt 
    169      1.1      yamt 		snprintb(tmp, sizeof(tmp), AGRPORTINFO_BITS, api->api_flags);
    170      1.1      yamt 		printf("\tagrport: %s, flags=%s\n", api->api_ifname, tmp);
    171      1.1      yamt 		api++;
    172      1.1      yamt 	}
    173      1.1      yamt }
    174