Hello @tech and all honorable OpenBSD Developer, first of all, I happy about any help or helpful advice!
Based on Edd Barrett (edd@) idea[1] to develop a Network Interface Daemon for OpenBSD, I'm currently hack on it. My first really huge problem is similar to Edd thoughts: "I guess this would mean moving all of the functions apart from main() from ifconfig.c into another file (complete with header), so that we can call them from the new ifconfigd? I'm no expert" My first initial solution was similar. I created ifconfig.h. This diff is just for example. It works fine with ifconfig but how can I use it from another directory like src/usr.sbin/ifconfigd. My first try with modify[2] PATH and -L and -I CFLAGS doesn't work. It break with suff like this (I understand the error but I not know any solution): cc -o ifconfigd parse.o log.o control.o ifconfigd.o ifconfigde.o ifconfig.o bioctl.o pbkdf2.o -levent -lutil ifconfig.o(.text+0x2220): In function `usage': : multiple definition of `usage'[1;3B ifconfigd.o(.text+0x400): first defined here /usr/bin/ld: Warning: size of symbol `usage' changed from 38 in ifconfigd.o to 35 in ifconfig.o ifconfig.o(.text+0xa440): In function `main': : multiple definition of `main' ifconfigd.o(.text+0x430): first defined here /usr/bin/ld: Warning: size of symbol `main' changed from 883 in ifconfigd.o to 1790 in ifconfig.o bioctl.o(.text+0x1fa0): In function `usage': : multiple definition of `usage' ifconfigd.o(.text+0x400): first defined here /usr/bin/ld: Warning: size of symbol `usage' changed from 35 in ifconfigd.o to 41 in bioctl.o bioctl.o(.text+0x1fd0): In function `main': : multiple definition of `main' ifconfigd.o(.text+0x430): first defined here /usr/bin/ld: Warning: size of symbol `main' changed from 1790 in ifconfigd.o to 1151 in bioctl.o ifconfig.o(.text+0x6c7b): In function `getinfo': : undefined reference to `is_bridge' ifconfig.o(.text+0x968b): In function `status': : undefined reference to `is_bridge' ifconfig.o(.text+0x990a): In function `status': : undefined reference to `bridge_status' ifconfig.o(.text+0xaa20): In function `main': : undefined reference to `bridge_rule' ifconfig.o(.rodata+0x12d0): undefined reference to `bridge_add' ... (and more undefined reference to ...) collect2: ld returned 1 exit status *** Error code 1 [1] http://www.theunixzoo.co.uk/wiki/doku.php?id=edd:openbsd#network_interface_daemon_ifconfigd [2 Makefile Section: .PATH: ${.CURDIR} ${.CURDIR}/../../sbin/ifconfig ${.CURDIR}/../../sbin/bioctl PROG= ifconfigd SRCS= parse.y log.c control.c ifconfigd.c ifconfigde.c SRCS+= ifconfig.c bioctl.c pbkdf2.c LDADD+= -levent -lutil MAN= ifconfigd.8 ifconfigd.conf.5 CFLAGS+= -DINET6 -I${.CURDIR}/../bioctl -I${.CURDIR}/../../sbin/ifconfig CFLAGS+= -L${.CURDIR}/../bioctl -L${.CURDIR}/../../sbin/ifconfig Index: ifconfig/ifconfig.c =================================================================== RCS file: /cvs/src/sbin/ifconfig/ifconfig.c,v retrieving revision 1.246 diff -u -r1.246 ifconfig.c --- ifconfig/ifconfig.c 23 Mar 2011 18:36:41 -0000 1.246 +++ ifconfig/ifconfig.c 4 May 2011 09:03:50 -0000 @@ -104,22 +104,8 @@ #include <unistd.h> #include <ifaddrs.h> -#include "brconfig.h" -#include "pbkdf2.h" +#include "ifconfig.h" -struct ifreq ifr, ridreq; -struct in_aliasreq in_addreq; -#ifdef INET6 -struct in6_ifreq ifr6; -struct in6_ifreq in6_ridreq; -struct in6_aliasreq in6_addreq; -#endif /* INET6 */ -struct sockaddr_in netmask; - -#ifndef SMALL -struct ifaliasreq addreq; -struct netrange at_nr; /* AppleTalk net range */ -#endif /* SMALL */ char name[IFNAMSIZ]; int flags, xflags, setaddr, setipdst, doalias; @@ -137,440 +123,9 @@ int shownet80211chans; int shownet80211nodes; -void notealias(const char *, int); -void setifaddr(const char *, int); -void setifrtlabel(const char *, int); -void setiflladdr(const char *, int); -void setifdstaddr(const char *, int); -void setifflags(const char *, int); -void setifxflags(const char *, int); -void setifbroadaddr(const char *, int); -void setifmtu(const char *, int); -void setifnwid(const char *, int); -void setifbssid(const char *, int); -void setifnwkey(const char *, int); -void setifwpa(const char *, int); -void setifwpaprotos(const char *, int); -void setifwpaakms(const char *, int); -void setifwpaciphers(const char *, int); -void setifwpagroupcipher(const char *, int); -void setifwpakey(const char *, int); -void setifchan(const char *, int); -void setifscan(const char *, int); -void setiftxpower(const char *, int); -void setifnwflag(const char *, int); -void unsetifnwflag(const char *, int); -void setifnetmask(const char *, int); -void setifprefixlen(const char *, int); -void setatrange(const char *, int); -void setatphase(const char *, int); -void settunnel(const char *, const char *); -void deletetunnel(const char *, int); -void settunnelinst(const char *, int); -#ifdef INET6 -void setia6flags(const char *, int); -void setia6pltime(const char *, int); -void setia6vltime(const char *, int); -void setia6lifetime(const char *, const char *); -void setia6eui64(const char *, int); -void setkeepalive(const char *, const char *); -void unsetkeepalive(const char *, int); -#endif /* INET6 */ -void checkatrange(struct sockaddr_at *); -void setmedia(const char *, int); -void setmediaopt(const char *, int); -void setmediamode(const char *, int); -void clone_create(const char *, int); -void clone_destroy(const char *, int); -void unsetmediaopt(const char *, int); -void setmediainst(const char *, int); -void settimeslot(const char *, int); -void timeslot_status(void); -void setmpelabel(const char *, int); -void setvlantag(const char *, int); -void setvlanprio(const char *, int); -void setvlandev(const char *, int); -void unsetvlandev(const char *, int); -void mpe_status(void); -void vlan_status(void); -void setinstance(const char *, int); -int main(int, char *[]); -int prefix(void *val, int); - -#ifndef SMALL -void getifgroups(void); -void carp_status(void); -void setcarp_advbase(const char *,int); -void setcarp_advskew(const char *, int); -void setcarppeer(const char *, int); -void unsetcarppeer(const char *, int); -void setcarp_passwd(const char *, int); -void setcarp_vhid(const char *, int); -void setcarp_state(const char *, int); -void setcarpdev(const char *, int); -void unsetcarpdev(const char *, int); -void setcarp_nodes(const char *, int); -void setcarp_balancing(const char *, int); -void setpfsync_syncdev(const char *, int); -void setpfsync_maxupd(const char *, int); -void unsetpfsync_syncdev(const char *, int); -void setpfsync_syncpeer(const char *, int); -void unsetpfsync_syncpeer(const char *, int); -void setpfsync_defer(const char *, int); -void pfsync_status(void); -void setpppoe_dev(const char *,int); -void setpppoe_svc(const char *,int); -void setpppoe_ac(const char *,int); -void pppoe_status(void); -void setspppproto(const char *, int); -void setspppname(const char *, int); -void setspppkey(const char *, int); -void setsppppeerproto(const char *, int); -void setsppppeername(const char *, int); -void setsppppeerkey(const char *, int); -void setsppppeerflag(const char *, int); -void unsetsppppeerflag(const char *, int); -void spppinfo(struct spppreq *); -void sppp_status(void); -void sppp_printproto(const char *, struct sauthreq *); -void settrunkport(const char *, int); -void unsettrunkport(const char *, int); -void settrunkproto(const char *, int); -void trunk_status(void); -void setifgroup(const char *, int); -void unsetifgroup(const char *, int); -void setifpriority(const char *, int); -void setifpowersave(const char *, int); -void setifmetric(const char *, int); -void notrailers(const char *, int); -void setgroupattribs(char *, int, char *[]); -void pflow_status(void); -void setpflow_sender(const char *, int); -void unsetpflow_sender(const char *, int); -void setpflow_receiver(const char *, int); -void unsetpflow_receiver(const char *, int); -void list_cloners(void); -void setifipdst(const char *, int); -void setifdesc(const char *, int); -void unsetifdesc(const char *, int); -int printgroup(char *, int); -#else -void setignore(const char *, int); -#endif - -/* - * Media stuff. Whenever a media command is first performed, the - * currently select media is grabbed for this interface. If `media' - * is given, the current media word is modified. `mediaopt' commands - * only modify the set and clear words. They then operate on the - * current media word later. - */ -int media_current; -int mediaopt_set; -int mediaopt_clear; - -int actions; /* Actions performed */ - -#define A_MEDIA 0x0001 /* media command */ -#define A_MEDIAOPTSET 0x0002 /* mediaopt command */ -#define A_MEDIAOPTCLR 0x0004 /* -mediaopt command */ -#define A_MEDIAOPT (A_MEDIAOPTSET|A_MEDIAOPTCLR) -#define A_MEDIAINST 0x0008 /* instance or inst command */ -#define A_MEDIAMODE 0x0010 /* mode command */ -#define A_SILENT 0x8000000 /* doing operation, do not print */ - -#define NEXTARG0 0xffffff -#define NEXTARG 0xfffffe -#define NEXTARG2 0xfffffd - -const struct cmd { - char *c_name; - int c_parameter; /* NEXTARG means next argv */ - int c_action; /* defered action */ - void (*c_func)(const char *, int); - void (*c_func2)(const char *, const char *); -} cmds[] = { - { "up", IFF_UP, 0, setifflags } , - { "down", -IFF_UP, 0, setifflags }, - { "arp", -IFF_NOARP, 0, setifflags }, - { "-arp", IFF_NOARP, 0, setifflags }, - { "debug", IFF_DEBUG, 0, setifflags }, - { "-debug", -IFF_DEBUG, 0, setifflags }, - { "alias", IFF_UP, 0, notealias }, - { "-alias", -IFF_UP, 0, notealias }, - { "delete", -IFF_UP, 0, notealias }, -#ifdef notdef -#define EN_SWABIPS 0x1000 - { "swabips", EN_SWABIPS, 0, setifflags }, - { "-swabips", -EN_SWABIPS, 0, setifflags }, -#endif /* notdef */ - { "netmask", NEXTARG, 0, setifnetmask }, - { "mtu", NEXTARG, 0, setifmtu }, - { "nwid", NEXTARG, 0, setifnwid }, - { "-nwid", -1, 0, setifnwid }, - { "bssid", NEXTARG, 0, setifbssid }, - { "-bssid", -1, 0, setifbssid }, - { "nwkey", NEXTARG, 0, setifnwkey }, - { "-nwkey", -1, 0, setifnwkey }, - { "wpa", 1, 0, setifwpa }, - { "-wpa", 0, 0, setifwpa }, - { "wpaakms", NEXTARG, 0, setifwpaakms }, - { "wpaciphers", NEXTARG, 0, setifwpaciphers }, - { "wpagroupcipher", NEXTARG, 0, setifwpagroupcipher }, - { "wpaprotos", NEXTARG, 0, setifwpaprotos }, - { "wpakey", NEXTARG, 0, setifwpakey }, - { "-wpakey", -1, 0, setifwpakey }, -/*XXX delete these two after the 4.9 release */ -/*XXX*/ { "wpapsk", NEXTARG, 0, setifwpakey }, -/*XXX*/ { "-wpapsk", -1, 0, setifwpakey }, - { "chan", NEXTARG0, 0, setifchan }, - { "-chan", -1, 0, setifchan }, - { "scan", NEXTARG0, 0, setifscan }, - { "broadcast", NEXTARG, 0, setifbroadaddr }, - { "prefixlen", NEXTARG, 0, setifprefixlen}, - { "vlan", NEXTARG, 0, setvlantag }, - { "vlandev", NEXTARG, 0, setvlandev }, - { "-vlandev", 1, 0, unsetvlandev }, -#ifdef INET6 - { "anycast", IN6_IFF_ANYCAST, 0, setia6flags }, - { "-anycast", -IN6_IFF_ANYCAST, 0, setia6flags }, - { "tentative", IN6_IFF_TENTATIVE, 0, setia6flags }, - { "-tentative", -IN6_IFF_TENTATIVE, 0, setia6flags }, - { "pltime", NEXTARG, 0, setia6pltime }, - { "vltime", NEXTARG, 0, setia6vltime }, - { "eui64", 0, 0, setia6eui64 }, - { "autoconfprivacy", IFXF_INET6_PRIVACY, 0, setifxflags }, - { "-autoconfprivacy", -IFXF_INET6_PRIVACY, 0, setifxflags }, -#endif /*INET6*/ -#ifndef SMALL - { "group", NEXTARG, 0, setifgroup }, - { "-group", NEXTARG, 0, unsetifgroup }, - { "trailers", -1, 0, notrailers }, - { "-trailers", 1, 0, notrailers }, - { "metric", NEXTARG, 0, setifmetric }, - { "powersave", NEXTARG0, 0, setifpowersave }, - { "-powersave", -1, 0, setifpowersave }, - { "priority", NEXTARG, 0, setifpriority }, - { "rtlabel", NEXTARG, 0, setifrtlabel }, - { "-rtlabel", -1, 0, setifrtlabel }, - { "rdomain", NEXTARG, 0, setinstance }, - { "range", NEXTARG, 0, setatrange }, - { "phase", NEXTARG, 0, setatphase }, - { "mpls", IFXF_MPLS, 0, setifxflags }, - { "-mpls", -IFXF_MPLS, 0, setifxflags }, - { "mplslabel", NEXTARG, 0, setmpelabel }, - { "advbase", NEXTARG, 0, setcarp_advbase }, - { "advskew", NEXTARG, 0, setcarp_advskew }, - { "carppeer", NEXTARG, 0, setcarppeer }, - { "-carppeer", 1, 0, unsetcarppeer }, - { "pass", NEXTARG, 0, setcarp_passwd }, - { "vhid", NEXTARG, 0, setcarp_vhid }, - { "vlanprio", NEXTARG, 0, setvlanprio }, - { "state", NEXTARG, 0, setcarp_state }, - { "carpdev", NEXTARG, 0, setcarpdev }, - { "carpnodes", NEXTARG, 0, setcarp_nodes }, - { "balancing", NEXTARG, 0, setcarp_balancing }, - { "-carpdev", 1, 0, unsetcarpdev }, - { "syncdev", NEXTARG, 0, setpfsync_syncdev }, - { "-syncdev", 1, 0, unsetpfsync_syncdev }, - { "syncif", NEXTARG, 0, setpfsync_syncdev }, - { "-syncif", 1, 0, unsetpfsync_syncdev }, - { "syncpeer", NEXTARG, 0, setpfsync_syncpeer }, - { "-syncpeer", 1, 0, unsetpfsync_syncpeer }, - { "maxupd", NEXTARG, 0, setpfsync_maxupd }, - { "defer", 1, 0, setpfsync_defer }, - { "-defer", 0, 0, setpfsync_defer }, - /* giftunnel is for backward compat */ - { "giftunnel", NEXTARG2, 0, NULL, settunnel } , - { "tunnel", NEXTARG2, 0, NULL, settunnel } , - { "deletetunnel", 0, 0, deletetunnel } , - { "tunneldomain", NEXTARG, 0, settunnelinst } , - { "pppoedev", NEXTARG, 0, setpppoe_dev }, - { "pppoesvc", NEXTARG, 0, setpppoe_svc }, - { "-pppoesvc", 1, 0, setpppoe_svc }, - { "pppoeac", NEXTARG, 0, setpppoe_ac }, - { "-pppoeac", 1, 0, setpppoe_ac }, - { "timeslot", NEXTARG, 0, settimeslot }, - { "txpower", NEXTARG, 0, setiftxpower }, - { "-txpower", 1, 0, setiftxpower }, - { "trunkport", NEXTARG, 0, settrunkport }, - { "-trunkport", NEXTARG, 0, unsettrunkport }, - { "trunkproto", NEXTARG, 0, settrunkproto }, - { "authproto", NEXTARG, 0, setspppproto }, - { "authname", NEXTARG, 0, setspppname }, - { "authkey", NEXTARG, 0, setspppkey }, - { "peerproto", NEXTARG, 0, setsppppeerproto }, - { "peername", NEXTARG, 0, setsppppeername }, - { "peerkey", NEXTARG, 0, setsppppeerkey }, - { "peerflag", NEXTARG, 0, setsppppeerflag }, - { "-peerflag", NEXTARG, 0, unsetsppppeerflag }, - { "nwflag", NEXTARG, 0, setifnwflag }, - { "-nwflag", NEXTARG, 0, unsetifnwflag }, - { "flowsrc", NEXTARG, 0, setpflow_sender }, - { "-flowsrc", 1, 0, unsetpflow_sender }, - { "flowdst", NEXTARG, 0, setpflow_receiver }, - { "-flowdst", 1, 0, unsetpflow_receiver }, - { "-inet6", IFXF_NOINET6, 0, setifxflags } , - { "keepalive", NEXTARG2, 0, NULL, setkeepalive }, - { "-keepalive", 1, 0, unsetkeepalive }, - { "add", NEXTARG, 0, bridge_add }, - { "del", NEXTARG, 0, bridge_delete }, - { "addspan", NEXTARG, 0, bridge_addspan }, - { "delspan", NEXTARG, 0, bridge_delspan }, - { "discover", NEXTARG, 0, setdiscover }, - { "-discover", NEXTARG, 0, unsetdiscover }, - { "blocknonip", NEXTARG, 0, setblocknonip }, - { "-blocknonip",NEXTARG, 0, unsetblocknonip }, - { "learn", NEXTARG, 0, setlearn }, - { "-learn", NEXTARG, 0, unsetlearn }, - { "stp", NEXTARG, 0, setstp }, - { "-stp", NEXTARG, 0, unsetstp }, - { "edge", NEXTARG, 0, setedge }, - { "-edge", NEXTARG, 0, unsetedge }, - { "autoedge", NEXTARG, 0, setautoedge }, - { "-autoedge", NEXTARG, 0, unsetautoedge }, - { "ptp", NEXTARG, 0, setptp }, - { "-ptp", NEXTARG, 0, unsetptp }, - { "autoptp", NEXTARG, 0, setautoptp }, - { "-autoptp", NEXTARG, 0, unsetautoptp }, - { "flush", 0, 0, bridge_flush }, - { "flushall", 0, 0, bridge_flushall }, - { "static", NEXTARG2, 0, NULL, bridge_addaddr }, - { "deladdr", NEXTARG, 0, bridge_deladdr }, - { "maxaddr", NEXTARG, 0, bridge_maxaddr }, - { "addr", 0, 0, bridge_addrs }, - { "hellotime", NEXTARG, 0, bridge_hellotime }, - { "fwddelay", NEXTARG, 0, bridge_fwddelay }, - { "maxage", NEXTARG, 0, bridge_maxage }, - { "proto", NEXTARG, 0, bridge_proto }, - { "ifpriority", NEXTARG2, 0, NULL, bridge_ifprio }, - { "ifcost", NEXTARG2, 0, NULL, bridge_ifcost }, - { "-ifcost", NEXTARG, 0, bridge_noifcost }, - { "timeout", NEXTARG, 0, bridge_timeout }, - { "holdcnt", NEXTARG, 0, bridge_holdcnt }, - { "spanpriority", NEXTARG, 0, bridge_priority }, - { "ipdst", NEXTARG, 0, setifipdst }, -#if 0 - /* XXX `rule` special-cased below */ - { "rule", 0, 0, bridge_rule }, -#endif - { "rules", NEXTARG, 0, bridge_rules }, - { "rulefile", NEXTARG, 0, bridge_rulefile }, - { "flushrule", NEXTARG, 0, bridge_flushrule }, - { "description", NEXTARG, 0, setifdesc }, - { "descr", NEXTARG, 0, setifdesc }, - { "-description", 1, 0, unsetifdesc }, - { "-descr", 1, 0, unsetifdesc }, - { "wol", IFXF_WOL, 0, setifxflags }, - { "-wol", -IFXF_WOL, 0, setifxflags }, -#else /* SMALL */ - { "group", NEXTARG, 0, setignore }, - { "powersave", NEXTARG0, 0, setignore }, - { "priority", NEXTARG, 0, setignore }, - { "rtlabel", NEXTARG, 0, setignore }, - { "mpls", IFXF_MPLS, 0, setignore }, - { "vlanprio", NEXTARG, 0, setignore }, - { "txpower", NEXTARG, 0, setignore }, - { "nwflag", NEXTARG, 0, setignore }, - { "rdomain", NEXTARG, 0, setignore }, - { "-inet6", IFXF_NOINET6, 0, setignore } , - { "description", NEXTARG, 0, setignore }, - { "descr", NEXTARG, 0, setignore }, - { "wol", IFXF_WOL, 0, setignore }, - { "-wol", -IFXF_WOL, 0, setignore }, -#endif /* SMALL */ -#if 0 - /* XXX `create' special-cased below */ - { "create", 0, 0, clone_create } , -#endif - { "destroy", 0, 0, clone_destroy } , - { "link0", IFF_LINK0, 0, setifflags } , - { "-link0", -IFF_LINK0, 0, setifflags } , - { "link1", IFF_LINK1, 0, setifflags } , - { "-link1", -IFF_LINK1, 0, setifflags } , - { "link2", IFF_LINK2, 0, setifflags } , - { "-link2", -IFF_LINK2, 0, setifflags } , - { "media", NEXTARG0, A_MEDIA, setmedia }, - { "mediaopt", NEXTARG, A_MEDIAOPTSET, setmediaopt }, - { "-mediaopt", NEXTARG, A_MEDIAOPTCLR, unsetmediaopt }, - { "mode", NEXTARG, A_MEDIAMODE, setmediamode }, - { "instance", NEXTARG, A_MEDIAINST, setmediainst }, - { "inst", NEXTARG, A_MEDIAINST, setmediainst }, - { "lladdr", NEXTARG, 0, setiflladdr }, - { NULL, /*src*/ 0, 0, setifaddr }, - { NULL, /*dst*/ 0, 0, setifdstaddr }, - { NULL, /*illegal*/0, 0, NULL }, -}; - -int getinfo(struct ifreq *, int); -void getsock(int); -void printgroupattribs(char *); -void printif(char *, int); -void printb_status(unsigned short, char *); -const char *get_linkstate(int, int); -void status(int, struct sockaddr_dl *, int); +/*NOT in ifconfig.h because everbody use it */ void usage(int); -const char *get_string(const char *, const char *, u_int8_t *, int *); -void print_string(const u_int8_t *, int); -char *sec2str(time_t); - -const char *get_media_type_string(int); -const char *get_media_subtype_string(int); -int get_media_mode(int, const char *); -int get_media_subtype(int, const char *); -int get_media_options(int, const char *); -int lookup_media_word(const struct ifmedia_description *, int, - const char *); -void print_media_word(int, int, int); -void process_media_commands(void); -void init_current_media(void); - -unsigned long get_ts_map(int, int, int); - -void in_status(int); -void in_getaddr(const char *, int); -void in_getprefix(const char *, int); -#ifdef INET6 -void in6_fillscopeid(struct sockaddr_in6 *sin6); -void in6_alias(struct in6_ifreq *); -void in6_status(int); -void in6_getaddr(const char *, int); -void in6_getprefix(const char *, int); -#endif /* INET6 */ -void at_status(int); -void at_getaddr(const char *, int); -void ieee80211_status(void); -void ieee80211_listchans(void); -void ieee80211_listnodes(void); -void ieee80211_printnode(struct ieee80211_nodereq *); - -/* Known address families */ -const struct afswtch { - char *af_name; - short af_af; - void (*af_status)(int); - void (*af_getaddr)(const char *, int); - void (*af_getprefix)(const char *, int); - u_long af_difaddr; - u_long af_aifaddr; - caddr_t af_ridreq; - caddr_t af_addreq; -} afs[] = { -#define C(x) ((caddr_t) &x) - { "inet", AF_INET, in_status, in_getaddr, in_getprefix, - SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(in_addreq) }, -#ifdef INET6 - { "inet6", AF_INET6, in6_status, in6_getaddr, in6_getprefix, - SIOCDIFADDR_IN6, SIOCAIFADDR_IN6, C(in6_ridreq), C(in6_addreq) }, -#endif /* INET6 */ -#ifndef SMALL - { "atalk", AF_APPLETALK, at_status, at_getaddr, NULL, - SIOCDIFADDR, SIOCAIFADDR, C(addreq), C(addreq) }, -#endif - { 0, 0, 0, 0 } -}; -const struct afswtch *afp; /*the address family being set or asked about*/ int ifaliases = 0; int aflag = 0; Index: ifconfig/ifconfig.h =================================================================== RCS file: ifconfig/ifconfig.h diff -N ifconfig/ifconfig.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ ifconfig/ifconfig.h 4 May 2011 09:03:50 -0000 @@ -0,0 +1,529 @@ +/* + * Copyright (c) 2011 Rafael Sadowski <raf...@sizeofvoid.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +#ifndef _IFCONFIG_H_ +#define _IFCONFIG_H_ + +#include <sys/param.h> +#include <sys/socket.h> +#include <sys/ioctl.h> + +#include <net/if.h> +#include <net/if_dl.h> +#include <net/if_media.h> +#include <net/if_types.h> +#include <netinet/in.h> +#include <netinet/in_var.h> +#include <netinet6/nd6.h> +#include <arpa/inet.h> +#include <netinet/ip_ipsp.h> +#include <netinet/if_ether.h> +#include <net/if_enc.h> +#include <net80211/ieee80211.h> +#include <net80211/ieee80211_ioctl.h> +#include <net/pfvar.h> +#include <net/if_pfsync.h> +#include <net/if_pflow.h> +#include <net/if_pppoe.h> +#include <net/if_trunk.h> +#include <net/if_sppp.h> +#include <net/ppp_defs.h> + +#include <netatalk/at.h> + +#include <netinet/ip_carp.h> + +#include <netdb.h> + +#include <net/if_vlan_var.h> + +#include <netmpls/mpls.h> + +#include <ctype.h> +#include <err.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <ifaddrs.h> + +#include "brconfig.h" + +/* +#include <sys/param.h> +#include <sys/socket.h> +#include <sys/ioctl.h> + +#include <netinet6/in6_var.h> +#include <net80211/ieee80211.h> +#include <net80211/ieee80211_ioctl.h> + +#include <net/if_sppp.h> + +#include <netatalk/at.h> +#include <net/if_media.h> + +#include "brconfig.h" +#include "pbkdf2.h" +*/ +struct ifreq ifr, ridreq; +struct in_aliasreq in_addreq; +#ifdef INET6 +struct in6_ifreq ifr6; +struct in6_ifreq in6_ridreq; +struct in6_aliasreq in6_addreq; +#endif /* INET6 */ +struct sockaddr_in netmask; + +#ifndef SMALL +struct ifaliasreq addreq; +struct netrange at_nr; /* AppleTalk net range */ +#endif /* SMALL */ + +void notealias(const char *, int); +void setifaddr(const char *, int); +void setifrtlabel(const char *, int); +void setiflladdr(const char *, int); +void setifdstaddr(const char *, int); +void setifflags(const char *, int); +void setifxflags(const char *, int); +void setifbroadaddr(const char *, int); +void setifmtu(const char *, int); +void setifnwid(const char *, int); +void setifbssid(const char *, int); +void setifnwkey(const char *, int); +void setifwpa(const char *, int); +void setifwpaprotos(const char *, int); +void setifwpaakms(const char *, int); +void setifwpaciphers(const char *, int); +void setifwpagroupcipher(const char *, int); +void setifwpakey(const char *, int); +void setifchan(const char *, int); +void setifscan(const char *, int); +void setiftxpower(const char *, int); +void setifnwflag(const char *, int); +void unsetifnwflag(const char *, int); +void setifnetmask(const char *, int); +void setifprefixlen(const char *, int); +void setatrange(const char *, int); +void setatphase(const char *, int); +void settunnel(const char *, const char *); +void deletetunnel(const char *, int); +void settunnelinst(const char *, int); +#ifdef INET6 +void setia6flags(const char *, int); +void setia6pltime(const char *, int); +void setia6vltime(const char *, int); +void setia6lifetime(const char *, const char *); +void setia6eui64(const char *, int); +void setkeepalive(const char *, const char *); +void unsetkeepalive(const char *, int); +#endif /* INET6 */ +void checkatrange(struct sockaddr_at *); +void setmedia(const char *, int); +void setmediaopt(const char *, int); +void setmediamode(const char *, int); +void clone_create(const char *, int); +void clone_destroy(const char *, int); +void unsetmediaopt(const char *, int); +void setmediainst(const char *, int); +void settimeslot(const char *, int); +void timeslot_status(void); +void setmpelabel(const char *, int); +void setvlantag(const char *, int); +void setvlanprio(const char *, int); +void setvlandev(const char *, int); +void unsetvlandev(const char *, int); +void mpe_status(void); +void vlan_status(void); +void setinstance(const char *, int); +int main(int, char *[]); +int prefix(void *val, int); + +#ifndef SMALL +void getifgroups(void); +void carp_status(void); +void setcarp_advbase(const char *,int); +void setcarp_advskew(const char *, int); +void setcarppeer(const char *, int); +void unsetcarppeer(const char *, int); +void setcarp_passwd(const char *, int); +void setcarp_vhid(const char *, int); +void setcarp_state(const char *, int); +void setcarpdev(const char *, int); +void unsetcarpdev(const char *, int); +void setcarp_nodes(const char *, int); +void setcarp_balancing(const char *, int); +void setpfsync_syncdev(const char *, int); +void setpfsync_maxupd(const char *, int); +void unsetpfsync_syncdev(const char *, int); +void setpfsync_syncpeer(const char *, int); +void unsetpfsync_syncpeer(const char *, int); +void setpfsync_defer(const char *, int); +void pfsync_status(void); +void setpppoe_dev(const char *,int); +void setpppoe_svc(const char *,int); +void setpppoe_ac(const char *,int); +void pppoe_status(void); +void setspppproto(const char *, int); +void setspppname(const char *, int); +void setspppkey(const char *, int); +void setsppppeerproto(const char *, int); +void setsppppeername(const char *, int); +void setsppppeerkey(const char *, int); +void setsppppeerflag(const char *, int); +void unsetsppppeerflag(const char *, int); +void spppinfo(struct spppreq *); +void sppp_status(void); +void sppp_printproto(const char *, struct sauthreq *); +void settrunkport(const char *, int); +void unsettrunkport(const char *, int); +void settrunkproto(const char *, int); +void trunk_status(void); +void setifgroup(const char *, int); +void unsetifgroup(const char *, int); +void setifpriority(const char *, int); +void setifpowersave(const char *, int); +void setifmetric(const char *, int); +void notrailers(const char *, int); +void setgroupattribs(char *, int, char *[]); +void pflow_status(void); +void setpflow_sender(const char *, int); +void unsetpflow_sender(const char *, int); +void setpflow_receiver(const char *, int); +void unsetpflow_receiver(const char *, int); +void list_cloners(void); +void setifipdst(const char *, int); +void setifdesc(const char *, int); +void unsetifdesc(const char *, int); +int printgroup(char *, int); +#else +void setignore(const char *, int); +#endif + +/* + * Media stuff. Whenever a media command is first performed, the + * currently select media is grabbed for this interface. If `media' + * is given, the current media word is modified. `mediaopt' commands + * only modify the set and clear words. They then operate on the + * current media word later. + */ +int media_current; +int mediaopt_set; +int mediaopt_clear; + +int actions; /* Actions performed */ + +#define A_MEDIA 0x0001 /* media command */ +#define A_MEDIAOPTSET 0x0002 /* mediaopt command */ +#define A_MEDIAOPTCLR 0x0004 /* -mediaopt command */ +#define A_MEDIAOPT (A_MEDIAOPTSET|A_MEDIAOPTCLR) +#define A_MEDIAINST 0x0008 /* instance or inst command */ +#define A_MEDIAMODE 0x0010 /* mode command */ +#define A_SILENT 0x8000000 /* doing operation, do not print */ + +#define NEXTARG0 0xffffff +#define NEXTARG 0xfffffe +#define NEXTARG2 0xfffffd + +const struct cmd { + char *c_name; + int c_parameter; /* NEXTARG means next argv */ + int c_action; /* defered action */ + void (*c_func)(const char *, int); + void (*c_func2)(const char *, const char *); +} cmds[] = { + { "up", IFF_UP, 0, setifflags } , + { "down", -IFF_UP, 0, setifflags }, + { "arp", -IFF_NOARP, 0, setifflags }, + { "-arp", IFF_NOARP, 0, setifflags }, + { "debug", IFF_DEBUG, 0, setifflags }, + { "-debug", -IFF_DEBUG, 0, setifflags }, + { "alias", IFF_UP, 0, notealias }, + { "-alias", -IFF_UP, 0, notealias }, + { "delete", -IFF_UP, 0, notealias }, +#ifdef notdef +#define EN_SWABIPS 0x1000 + { "swabips", EN_SWABIPS, 0, setifflags }, + { "-swabips", -EN_SWABIPS, 0, setifflags }, +#endif /* notdef */ + { "netmask", NEXTARG, 0, setifnetmask }, + { "mtu", NEXTARG, 0, setifmtu }, + { "nwid", NEXTARG, 0, setifnwid }, + { "-nwid", -1, 0, setifnwid }, + { "bssid", NEXTARG, 0, setifbssid }, + { "-bssid", -1, 0, setifbssid }, + { "nwkey", NEXTARG, 0, setifnwkey }, + { "-nwkey", -1, 0, setifnwkey }, + { "wpa", 1, 0, setifwpa }, + { "-wpa", 0, 0, setifwpa }, + { "wpaakms", NEXTARG, 0, setifwpaakms }, + { "wpaciphers", NEXTARG, 0, setifwpaciphers }, + { "wpagroupcipher", NEXTARG, 0, setifwpagroupcipher }, + { "wpaprotos", NEXTARG, 0, setifwpaprotos }, + { "wpakey", NEXTARG, 0, setifwpakey }, + { "-wpakey", -1, 0, setifwpakey }, +/*XXX delete these two after the 4.9 release */ +/*XXX*/ { "wpapsk", NEXTARG, 0, setifwpakey }, +/*XXX*/ { "-wpapsk", -1, 0, setifwpakey }, + { "chan", NEXTARG0, 0, setifchan }, + { "-chan", -1, 0, setifchan }, + { "scan", NEXTARG0, 0, setifscan }, + { "broadcast", NEXTARG, 0, setifbroadaddr }, + { "prefixlen", NEXTARG, 0, setifprefixlen}, + { "vlan", NEXTARG, 0, setvlantag }, + { "vlandev", NEXTARG, 0, setvlandev }, + { "-vlandev", 1, 0, unsetvlandev }, +#ifdef INET6 + { "anycast", IN6_IFF_ANYCAST, 0, setia6flags }, + { "-anycast", -IN6_IFF_ANYCAST, 0, setia6flags }, + { "tentative", IN6_IFF_TENTATIVE, 0, setia6flags }, + { "-tentative", -IN6_IFF_TENTATIVE, 0, setia6flags }, + { "pltime", NEXTARG, 0, setia6pltime }, + { "vltime", NEXTARG, 0, setia6vltime }, + { "eui64", 0, 0, setia6eui64 }, + { "autoconfprivacy", IFXF_INET6_PRIVACY, 0, setifxflags }, + { "-autoconfprivacy", -IFXF_INET6_PRIVACY, 0, setifxflags }, + { "keepalive", NEXTARG2, 0, NULL, setkeepalive }, + { "-keepalive", 1, 0, unsetkeepalive }, +#endif /*INET6*/ +#ifndef SMALL + { "group", NEXTARG, 0, setifgroup }, + { "-group", NEXTARG, 0, unsetifgroup }, + { "trailers", -1, 0, notrailers }, + { "-trailers", 1, 0, notrailers }, + { "metric", NEXTARG, 0, setifmetric }, + { "powersave", NEXTARG0, 0, setifpowersave }, + { "-powersave", -1, 0, setifpowersave }, + { "priority", NEXTARG, 0, setifpriority }, + { "rtlabel", NEXTARG, 0, setifrtlabel }, + { "-rtlabel", -1, 0, setifrtlabel }, + { "rdomain", NEXTARG, 0, setinstance }, + { "range", NEXTARG, 0, setatrange }, + { "phase", NEXTARG, 0, setatphase }, + { "mpls", IFXF_MPLS, 0, setifxflags }, + { "-mpls", -IFXF_MPLS, 0, setifxflags }, + { "mplslabel", NEXTARG, 0, setmpelabel }, + { "advbase", NEXTARG, 0, setcarp_advbase }, + { "advskew", NEXTARG, 0, setcarp_advskew }, + { "carppeer", NEXTARG, 0, setcarppeer }, + { "-carppeer", 1, 0, unsetcarppeer }, + { "pass", NEXTARG, 0, setcarp_passwd }, + { "vhid", NEXTARG, 0, setcarp_vhid }, + { "vlanprio", NEXTARG, 0, setvlanprio }, + { "state", NEXTARG, 0, setcarp_state }, + { "carpdev", NEXTARG, 0, setcarpdev }, + { "carpnodes", NEXTARG, 0, setcarp_nodes }, + { "balancing", NEXTARG, 0, setcarp_balancing }, + { "-carpdev", 1, 0, unsetcarpdev }, + { "syncdev", NEXTARG, 0, setpfsync_syncdev }, + { "-syncdev", 1, 0, unsetpfsync_syncdev }, + { "syncif", NEXTARG, 0, setpfsync_syncdev }, + { "-syncif", 1, 0, unsetpfsync_syncdev }, + { "syncpeer", NEXTARG, 0, setpfsync_syncpeer }, + { "-syncpeer", 1, 0, unsetpfsync_syncpeer }, + { "maxupd", NEXTARG, 0, setpfsync_maxupd }, + { "defer", 1, 0, setpfsync_defer }, + { "-defer", 0, 0, setpfsync_defer }, + /* giftunnel is for backward compat */ + { "giftunnel", NEXTARG2, 0, NULL, settunnel } , + { "tunnel", NEXTARG2, 0, NULL, settunnel } , + { "deletetunnel", 0, 0, deletetunnel } , + { "tunneldomain", NEXTARG, 0, settunnelinst } , + { "pppoedev", NEXTARG, 0, setpppoe_dev }, + { "pppoesvc", NEXTARG, 0, setpppoe_svc }, + { "-pppoesvc", 1, 0, setpppoe_svc }, + { "pppoeac", NEXTARG, 0, setpppoe_ac }, + { "-pppoeac", 1, 0, setpppoe_ac }, + { "timeslot", NEXTARG, 0, settimeslot }, + { "txpower", NEXTARG, 0, setiftxpower }, + { "-txpower", 1, 0, setiftxpower }, + { "trunkport", NEXTARG, 0, settrunkport }, + { "-trunkport", NEXTARG, 0, unsettrunkport }, + { "trunkproto", NEXTARG, 0, settrunkproto }, + { "authproto", NEXTARG, 0, setspppproto }, + { "authname", NEXTARG, 0, setspppname }, + { "authkey", NEXTARG, 0, setspppkey }, + { "peerproto", NEXTARG, 0, setsppppeerproto }, + { "peername", NEXTARG, 0, setsppppeername }, + { "peerkey", NEXTARG, 0, setsppppeerkey }, + { "peerflag", NEXTARG, 0, setsppppeerflag }, + { "-peerflag", NEXTARG, 0, unsetsppppeerflag }, + { "nwflag", NEXTARG, 0, setifnwflag }, + { "-nwflag", NEXTARG, 0, unsetifnwflag }, + { "flowsrc", NEXTARG, 0, setpflow_sender }, + { "-flowsrc", 1, 0, unsetpflow_sender }, + { "flowdst", NEXTARG, 0, setpflow_receiver }, + { "-flowdst", 1, 0, unsetpflow_receiver }, + { "-inet6", IFXF_NOINET6, 0, setifxflags } , + { "add", NEXTARG, 0, bridge_add }, + { "del", NEXTARG, 0, bridge_delete }, + { "addspan", NEXTARG, 0, bridge_addspan }, + { "delspan", NEXTARG, 0, bridge_delspan }, + { "discover", NEXTARG, 0, setdiscover }, + { "-discover", NEXTARG, 0, unsetdiscover }, + { "blocknonip", NEXTARG, 0, setblocknonip }, + { "-blocknonip",NEXTARG, 0, unsetblocknonip }, + { "learn", NEXTARG, 0, setlearn }, + { "-learn", NEXTARG, 0, unsetlearn }, + { "stp", NEXTARG, 0, setstp }, + { "-stp", NEXTARG, 0, unsetstp }, + { "edge", NEXTARG, 0, setedge }, + { "-edge", NEXTARG, 0, unsetedge }, + { "autoedge", NEXTARG, 0, setautoedge }, + { "-autoedge", NEXTARG, 0, unsetautoedge }, + { "ptp", NEXTARG, 0, setptp }, + { "-ptp", NEXTARG, 0, unsetptp }, + { "autoptp", NEXTARG, 0, setautoptp }, + { "-autoptp", NEXTARG, 0, unsetautoptp }, + { "flush", 0, 0, bridge_flush }, + { "flushall", 0, 0, bridge_flushall }, + { "static", NEXTARG2, 0, NULL, bridge_addaddr }, + { "deladdr", NEXTARG, 0, bridge_deladdr }, + { "maxaddr", NEXTARG, 0, bridge_maxaddr }, + { "addr", 0, 0, bridge_addrs }, + { "hellotime", NEXTARG, 0, bridge_hellotime }, + { "fwddelay", NEXTARG, 0, bridge_fwddelay }, + { "maxage", NEXTARG, 0, bridge_maxage }, + { "proto", NEXTARG, 0, bridge_proto }, + { "ifpriority", NEXTARG2, 0, NULL, bridge_ifprio }, + { "ifcost", NEXTARG2, 0, NULL, bridge_ifcost }, + { "-ifcost", NEXTARG, 0, bridge_noifcost }, + { "timeout", NEXTARG, 0, bridge_timeout }, + { "holdcnt", NEXTARG, 0, bridge_holdcnt }, + { "spanpriority", NEXTARG, 0, bridge_priority }, + { "ipdst", NEXTARG, 0, setifipdst }, +#if 0 + /* XXX `rule` special-cased below */ + { "rule", 0, 0, bridge_rule }, +#endif + { "rules", NEXTARG, 0, bridge_rules }, + { "rulefile", NEXTARG, 0, bridge_rulefile }, + { "flushrule", NEXTARG, 0, bridge_flushrule }, + { "description", NEXTARG, 0, setifdesc }, + { "descr", NEXTARG, 0, setifdesc }, + { "-description", 1, 0, unsetifdesc }, + { "-descr", 1, 0, unsetifdesc }, + { "wol", IFXF_WOL, 0, setifxflags }, + { "-wol", -IFXF_WOL, 0, setifxflags }, +#else /* SMALL */ + { "group", NEXTARG, 0, setignore }, + { "powersave", NEXTARG0, 0, setignore }, + { "priority", NEXTARG, 0, setignore }, + { "rtlabel", NEXTARG, 0, setignore }, + { "mpls", IFXF_MPLS, 0, setignore }, + { "vlanprio", NEXTARG, 0, setignore }, + { "txpower", NEXTARG, 0, setignore }, + { "nwflag", NEXTARG, 0, setignore }, + { "rdomain", NEXTARG, 0, setignore }, + { "-inet6", IFXF_NOINET6, 0, setignore } , + { "description", NEXTARG, 0, setignore }, + { "descr", NEXTARG, 0, setignore }, + { "wol", IFXF_WOL, 0, setignore }, + { "-wol", -IFXF_WOL, 0, setignore }, +#endif /* SMALL */ +#if 0 + /* XXX `create' special-cased below */ + { "create", 0, 0, clone_create } , +#endif + { "destroy", 0, 0, clone_destroy } , + { "link0", IFF_LINK0, 0, setifflags } , + { "-link0", -IFF_LINK0, 0, setifflags } , + { "link1", IFF_LINK1, 0, setifflags } , + { "-link1", -IFF_LINK1, 0, setifflags } , + { "link2", IFF_LINK2, 0, setifflags } , + { "-link2", -IFF_LINK2, 0, setifflags } , + { "media", NEXTARG0, A_MEDIA, setmedia }, + { "mediaopt", NEXTARG, A_MEDIAOPTSET, setmediaopt }, + { "-mediaopt", NEXTARG, A_MEDIAOPTCLR, unsetmediaopt }, + { "mode", NEXTARG, A_MEDIAMODE, setmediamode }, + { "instance", NEXTARG, A_MEDIAINST, setmediainst }, + { "inst", NEXTARG, A_MEDIAINST, setmediainst }, + { "lladdr", NEXTARG, 0, setiflladdr }, + { NULL, /*src*/ 0, 0, setifaddr }, + { NULL, /*dst*/ 0, 0, setifdstaddr }, + { NULL, /*illegal*/0, 0, NULL }, +}; + +int getinfo(struct ifreq *, int); +void getsock(int); +void printgroupattribs(char *); +void printif(char *, int); +void printb_status(unsigned short, char *); +const char *get_linkstate(int, int); +void status(int, struct sockaddr_dl *, int); +const char *get_string(const char *, const char *, u_int8_t *, int *); +void print_string(const u_int8_t *, int); +char *sec2str(time_t); + +const char *get_media_type_string(int); +const char *get_media_subtype_string(int); +int get_media_mode(int, const char *); +int get_media_subtype(int, const char *); +int get_media_options(int, const char *); +int lookup_media_word(const struct ifmedia_description *, int, + const char *); +void print_media_word(int, int, int); +void process_media_commands(void); +void init_current_media(void); + +unsigned long get_ts_map(int, int, int); + +void in_status(int); +void in_getaddr(const char *, int); +void in_getprefix(const char *, int); +#ifdef INET6 +void in6_fillscopeid(struct sockaddr_in6 *sin6); +void in6_alias(struct in6_ifreq *); +void in6_status(int); +void in6_getaddr(const char *, int); +void in6_getprefix(const char *, int); +#endif /* INET6 */ +void at_status(int); +void at_getaddr(const char *, int); +void ieee80211_status(void); +void ieee80211_listchans(void); +void ieee80211_listnodes(void); +void ieee80211_printnode(struct ieee80211_nodereq *); + +/* Known address families */ +const struct afswtch { + char *af_name; + short af_af; + void (*af_status)(int); + void (*af_getaddr)(const char *, int); + void (*af_getprefix)(const char *, int); + u_long af_difaddr; + u_long af_aifaddr; + caddr_t af_ridreq; + caddr_t af_addreq; +} afs[] = { +#define C(x) ((caddr_t) &x) + { "inet", AF_INET, in_status, in_getaddr, in_getprefix, + SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(in_addreq) }, +#ifdef INET6 + { "inet6", AF_INET6, in6_status, in6_getaddr, in6_getprefix, + SIOCDIFADDR_IN6, SIOCAIFADDR_IN6, C(in6_ridreq), C(in6_addreq) }, +#endif /* INET6 */ +#ifndef SMALL + { "atalk", AF_APPLETALK, at_status, at_getaddr, NULL, + SIOCDIFADDR, SIOCAIFADDR, C(addreq), C(addreq) }, +#endif + { 0, 0, 0, 0 } +}; + +COnst struct afswtch *afp; /*the address family being set or asked about*/ +#endif /* _IFCONFIG_H_ */ -- http://www.sizeofvoid.org - raf...@sizeofvoid.org XMPP: z...@jabber.ccc.de Key fingerprint: BDDD 91E9 28CB 3A52 3E99 61B0 C359 2691 BAC6 A3B1