11de7b4b8SPedro F. Giffuni /*- 21de7b4b8SPedro F. Giffuni * SPDX-License-Identifier: BSD-4-Clause 31de7b4b8SPedro F. Giffuni * 49906480aSPeter Wemm * Copyright (c) 1997 Peter Wemm. 59906480aSPeter Wemm * All rights reserved. 69906480aSPeter Wemm * 79906480aSPeter Wemm * Redistribution and use in source and binary forms, with or without 89906480aSPeter Wemm * modification, are permitted provided that the following conditions 99906480aSPeter Wemm * are met: 109906480aSPeter Wemm * 1. Redistributions of source code must retain the above copyright 119906480aSPeter Wemm * notice, this list of conditions and the following disclaimer. 129906480aSPeter Wemm * 2. Redistributions in binary form must reproduce the above copyright 139906480aSPeter Wemm * notice, this list of conditions and the following disclaimer in the 149906480aSPeter Wemm * documentation and/or other materials provided with the distribution. 159906480aSPeter Wemm * 3. All advertising materials mentioning features or use of this software 169906480aSPeter Wemm * must display the following acknowledgement: 179906480aSPeter Wemm * This product includes software developed for the FreeBSD Project 189906480aSPeter Wemm * by Peter Wemm. 199906480aSPeter Wemm * 4. The name of the author may not be used to endorse or promote products 209906480aSPeter Wemm * derived from this software without specific prior written permission. 219906480aSPeter Wemm * 229906480aSPeter Wemm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 239906480aSPeter Wemm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 249906480aSPeter Wemm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 259906480aSPeter Wemm * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 269906480aSPeter Wemm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 279906480aSPeter Wemm * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 289906480aSPeter Wemm * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 299906480aSPeter Wemm * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 309906480aSPeter Wemm * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 319906480aSPeter Wemm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 329906480aSPeter Wemm * SUCH DAMAGE. 339906480aSPeter Wemm * 349906480aSPeter Wemm * so there! 359906480aSPeter Wemm * 367f3dea24SPeter Wemm * $FreeBSD$ 379906480aSPeter Wemm */ 389906480aSPeter Wemm 398b222425SRyan Moeller #pragma once 408b222425SRyan Moeller 418b222425SRyan Moeller #include <libifconfig.h> 428b222425SRyan Moeller 435faf8dcbSSam Leffler #define __constructor __attribute__((constructor)) 449906480aSPeter Wemm 455faf8dcbSSam Leffler struct afswtch; 465faf8dcbSSam Leffler struct cmd; 475faf8dcbSSam Leffler 485faf8dcbSSam Leffler typedef void c_func(const char *cmd, int arg, int s, const struct afswtch *afp); 497541a95aSKonstantin Belousov typedef void c_func2(const char *arg1, const char *arg2, int s, 507541a95aSKonstantin Belousov const struct afswtch *afp); 515faf8dcbSSam Leffler 525faf8dcbSSam Leffler struct cmd { 535faf8dcbSSam Leffler const char *c_name; 545faf8dcbSSam Leffler int c_parameter; 555faf8dcbSSam Leffler #define NEXTARG 0xffffff /* has following arg */ 565faf8dcbSSam Leffler #define NEXTARG2 0xfffffe /* has 2 following args */ 575faf8dcbSSam Leffler #define OPTARG 0xfffffd /* has optional following arg */ 585faf8dcbSSam Leffler union { 595faf8dcbSSam Leffler c_func *c_func; 605faf8dcbSSam Leffler c_func2 *c_func2; 61c508bf7aSStefan Farfeleder } c_u; 622fa02c5fSSam Leffler int c_iscloneop; 635faf8dcbSSam Leffler struct cmd *c_next; 645faf8dcbSSam Leffler }; 655faf8dcbSSam Leffler void cmd_register(struct cmd *); 665faf8dcbSSam Leffler 6758ac5e5bSSam Leffler typedef void callback_func(int s, void *); 6858ac5e5bSSam Leffler void callback_register(callback_func *, void *); 6958ac5e5bSSam Leffler 705faf8dcbSSam Leffler /* 715faf8dcbSSam Leffler * Macros for declaring command functions and initializing entries. 725faf8dcbSSam Leffler */ 735faf8dcbSSam Leffler #define DECL_CMD_FUNC(name, cmd, arg) \ 745faf8dcbSSam Leffler void name(const char *cmd, int arg, int s, const struct afswtch *afp) 755faf8dcbSSam Leffler #define DECL_CMD_FUNC2(name, arg1, arg2) \ 767541a95aSKonstantin Belousov void name(const char *arg1, const char *arg2, int s, \ 777541a95aSKonstantin Belousov const struct afswtch *afp) 785faf8dcbSSam Leffler 79*7aecd12dSKonstantin Belousov #define DEF_CMD(name, param, func) { \ 80*7aecd12dSKonstantin Belousov .c_name = (name), \ 81*7aecd12dSKonstantin Belousov .c_parameter = (param), \ 82*7aecd12dSKonstantin Belousov .c_u = { .c_func = (func) }, \ 83*7aecd12dSKonstantin Belousov .c_iscloneop = 0, \ 84*7aecd12dSKonstantin Belousov .c_next = NULL, 85*7aecd12dSKonstantin Belousov } 86*7aecd12dSKonstantin Belousov #define DEF_CMD_ARG(name, func) { \ 87*7aecd12dSKonstantin Belousov .c_name = (name), \ 88*7aecd12dSKonstantin Belousov .c_parameter = NEXTARG, \ 89*7aecd12dSKonstantin Belousov .c_u = { .c_func = (func) }, \ 90*7aecd12dSKonstantin Belousov .c_iscloneop = 0, \ 91*7aecd12dSKonstantin Belousov .c_next = NULL, \ 92*7aecd12dSKonstantin Belousov } 93*7aecd12dSKonstantin Belousov #define DEF_CMD_OPTARG(name, func) { \ 94*7aecd12dSKonstantin Belousov .c_name = (name), \ 95*7aecd12dSKonstantin Belousov .c_parameter = OPTARG, \ 96*7aecd12dSKonstantin Belousov .c_u = { .c_func = (func) }, \ 97*7aecd12dSKonstantin Belousov .c_iscloneop = 0, \ 98*7aecd12dSKonstantin Belousov .c_next = NULL, \ 99*7aecd12dSKonstantin Belousov } 100*7aecd12dSKonstantin Belousov #define DEF_CMD_ARG2(name, func) { \ 101*7aecd12dSKonstantin Belousov .c_name = (name), \ 102*7aecd12dSKonstantin Belousov .c_parameter = NEXTARG2, \ 103*7aecd12dSKonstantin Belousov .c_u = { .c_func2 = (func) }, \ 104*7aecd12dSKonstantin Belousov .c_iscloneop = 0, \ 105*7aecd12dSKonstantin Belousov .c_next = NULL, \ 106*7aecd12dSKonstantin Belousov } 107*7aecd12dSKonstantin Belousov #define DEF_CLONE_CMD(name, param, func) { \ 108*7aecd12dSKonstantin Belousov .c_name = (name), \ 109*7aecd12dSKonstantin Belousov .c_parameter = (param), \ 110*7aecd12dSKonstantin Belousov .c_u = { .c_func = (func) }, \ 111*7aecd12dSKonstantin Belousov .c_iscloneop = 1, \ 112*7aecd12dSKonstantin Belousov .c_next = NULL, \ 113*7aecd12dSKonstantin Belousov } 114*7aecd12dSKonstantin Belousov #define DEF_CLONE_CMD_ARG(name, func) { \ 115*7aecd12dSKonstantin Belousov .c_name = (name), \ 116*7aecd12dSKonstantin Belousov .c_parameter = NEXTARG, \ 117*7aecd12dSKonstantin Belousov .c_u = { .c_func = (func) }, \ 118*7aecd12dSKonstantin Belousov .c_iscloneop = 1, \ 119*7aecd12dSKonstantin Belousov .c_next = NULL, \ 120*7aecd12dSKonstantin Belousov } 121*7aecd12dSKonstantin Belousov #define DEF_CLONE_CMD_ARG2(name, func) { \ 122*7aecd12dSKonstantin Belousov .c_name = (name), \ 123*7aecd12dSKonstantin Belousov .c_parameter = NEXTARG2, \ 124*7aecd12dSKonstantin Belousov .c_u = { .c_func2 = (func) }, \ 125*7aecd12dSKonstantin Belousov .c_iscloneop = 1, \ 126*7aecd12dSKonstantin Belousov .c_next = NULL, \ 127*7aecd12dSKonstantin Belousov } 1285faf8dcbSSam Leffler 129cb8c905aSSam Leffler struct ifaddrs; 1305faf8dcbSSam Leffler struct addrinfo; 1315faf8dcbSSam Leffler 1325faf8dcbSSam Leffler enum { 1335faf8dcbSSam Leffler RIDADDR, 1345faf8dcbSSam Leffler ADDR, 1355faf8dcbSSam Leffler MASK, 1365faf8dcbSSam Leffler DSTADDR, 1375faf8dcbSSam Leffler }; 1385faf8dcbSSam Leffler 1395faf8dcbSSam Leffler struct afswtch { 1405faf8dcbSSam Leffler const char *af_name; /* as given on cmd line, e.g. "inet" */ 1415faf8dcbSSam Leffler short af_af; /* AF_* */ 14290c4b74cSSam Leffler /* 14390c4b74cSSam Leffler * Status is handled one of two ways; if there is an 14490c4b74cSSam Leffler * address associated with the interface then the 14590c4b74cSSam Leffler * associated address family af_status method is invoked 14690c4b74cSSam Leffler * with the appropriate addressin info. Otherwise, if 14790c4b74cSSam Leffler * all possible info is to be displayed and af_other_status 14890c4b74cSSam Leffler * is defined then it is invoked after all address status 14990c4b74cSSam Leffler * is presented. 15090c4b74cSSam Leffler */ 151cb8c905aSSam Leffler void (*af_status)(int, const struct ifaddrs *); 15290c4b74cSSam Leffler void (*af_other_status)(int); 1535faf8dcbSSam Leffler /* parse address method */ 1545faf8dcbSSam Leffler void (*af_getaddr)(const char *, int); 1555faf8dcbSSam Leffler /* parse prefix method (IPv6) */ 1565faf8dcbSSam Leffler void (*af_getprefix)(const char *, int); 157d8237b95SMike Karels void (*af_postproc)(int s, const struct afswtch *, 158d8237b95SMike Karels int newaddr, int ifflags); 1595faf8dcbSSam Leffler u_long af_difaddr; /* set dst if address ioctl */ 1605faf8dcbSSam Leffler u_long af_aifaddr; /* set if address ioctl */ 1615faf8dcbSSam Leffler void *af_ridreq; /* */ 1625faf8dcbSSam Leffler void *af_addreq; /* */ 1635faf8dcbSSam Leffler struct afswtch *af_next; 1645faf8dcbSSam Leffler 1655faf8dcbSSam Leffler /* XXX doesn't fit model */ 1665faf8dcbSSam Leffler void (*af_status_tunnel)(int); 1675faf8dcbSSam Leffler void (*af_settunnel)(int s, struct addrinfo *srcres, 1685faf8dcbSSam Leffler struct addrinfo *dstres); 1695faf8dcbSSam Leffler }; 1705faf8dcbSSam Leffler void af_register(struct afswtch *); 1715faf8dcbSSam Leffler 1725faf8dcbSSam Leffler struct option { 1735faf8dcbSSam Leffler const char *opt; 1745faf8dcbSSam Leffler const char *opt_usage; 1755faf8dcbSSam Leffler void (*cb)(const char *arg); 1765faf8dcbSSam Leffler struct option *next; 1775faf8dcbSSam Leffler }; 1785faf8dcbSSam Leffler void opt_register(struct option *); 1795faf8dcbSSam Leffler 1808b222425SRyan Moeller extern ifconfig_handle_t *lifh; 1815faf8dcbSSam Leffler extern struct ifreq ifr; 182a4fa9864SBrooks Davis extern char name[IFNAMSIZ]; /* name of interface */ 1839906480aSPeter Wemm extern int allmedia; 184ca299b1fSPoul-Henning Kamp extern int supmedia; 185b7eb47e2SRobert Watson extern int printkeys; 1865faf8dcbSSam Leffler extern int newaddr; 1875faf8dcbSSam Leffler extern int verbose; 1886fe2e176SKristof Provost extern int printifname; 18947528c67SAndrew Gallatin extern int exit_code; 1909906480aSPeter Wemm 1915faf8dcbSSam Leffler void setifcap(const char *, int value, int s, const struct afswtch *); 19297ed1257SBill Paul 1935faf8dcbSSam Leffler void Perror(const char *cmd); 1945faf8dcbSSam Leffler void printb(const char *s, unsigned value, const char *bits); 195419d8080SPoul-Henning Kamp 196cb8c905aSSam Leffler void ifmaybeload(const char *name); 1975faf8dcbSSam Leffler 198c7cffd65SAlexander V. Chernikov typedef int clone_match_func(const char *); 199db82353dSSam Leffler typedef void clone_callback_func(int, struct ifreq *); 200c7cffd65SAlexander V. Chernikov void clone_setdefcallback_prefix(const char *, clone_callback_func *); 201c7cffd65SAlexander V. Chernikov void clone_setdefcallback_filter(clone_match_func *, clone_callback_func *); 2028f3591a5SSam Leffler 203f732123eSAlexander V. Chernikov void sfp_status(int s, struct ifreq *ifr, int verbose); 204f732123eSAlexander V. Chernikov 2058f3591a5SSam Leffler /* 2068f3591a5SSam Leffler * XXX expose this so modules that neeed to know of any pending 2078f3591a5SSam Leffler * operations on ifmedia can avoid cmd line ordering confusion. 2088f3591a5SSam Leffler */ 2092803fa47SRyan Moeller struct ifmediareq *ifmedia_getstate(void); 21008b68b0eSGleb Smirnoff 21108b68b0eSGleb Smirnoff void print_vhid(const struct ifaddrs *, const char *); 21208b68b0eSGleb Smirnoff 21305952067SHans Petter Selasky void ioctl_ifcreate(int s, struct ifreq *); 214