1ca74a0a2SSepherosa Ziehau /* 2ca74a0a2SSepherosa Ziehau * Copyright (c) 1983, 1993 3ca74a0a2SSepherosa Ziehau * The Regents of the University of California. All rights reserved. 4ca74a0a2SSepherosa Ziehau * 5ca74a0a2SSepherosa Ziehau * Redistribution and use in source and binary forms, with or without 6ca74a0a2SSepherosa Ziehau * modification, are permitted provided that the following conditions 7ca74a0a2SSepherosa Ziehau * are met: 8ca74a0a2SSepherosa Ziehau * 1. Redistributions of source code must retain the above copyright 9ca74a0a2SSepherosa Ziehau * notice, this list of conditions and the following disclaimer. 10ca74a0a2SSepherosa Ziehau * 2. Redistributions in binary form must reproduce the above copyright 11ca74a0a2SSepherosa Ziehau * notice, this list of conditions and the following disclaimer in the 12ca74a0a2SSepherosa Ziehau * documentation and/or other materials provided with the distribution. 13ca74a0a2SSepherosa Ziehau * 4. Neither the name of the University nor the names of its contributors 14ca74a0a2SSepherosa Ziehau * may be used to endorse or promote products derived from this software 15ca74a0a2SSepherosa Ziehau * without specific prior written permission. 16ca74a0a2SSepherosa Ziehau * 17ca74a0a2SSepherosa Ziehau * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18ca74a0a2SSepherosa Ziehau * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19ca74a0a2SSepherosa Ziehau * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20ca74a0a2SSepherosa Ziehau * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21ca74a0a2SSepherosa Ziehau * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22ca74a0a2SSepherosa Ziehau * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23ca74a0a2SSepherosa Ziehau * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24ca74a0a2SSepherosa Ziehau * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25ca74a0a2SSepherosa Ziehau * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26ca74a0a2SSepherosa Ziehau * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27ca74a0a2SSepherosa Ziehau * SUCH DAMAGE. 28ca74a0a2SSepherosa Ziehau * 29ca74a0a2SSepherosa Ziehau * $FreeBSD: src/sbin/ifconfig/af_inet.c,v 1.2 2005/06/16 19:37:09 ume Exp $ 30ca74a0a2SSepherosa Ziehau */ 31ca74a0a2SSepherosa Ziehau 32ca74a0a2SSepherosa Ziehau #include <sys/types.h> 33ca74a0a2SSepherosa Ziehau #include <sys/ioctl.h> 34ca74a0a2SSepherosa Ziehau #include <sys/socket.h> 35ca74a0a2SSepherosa Ziehau #include <net/if.h> 36ca74a0a2SSepherosa Ziehau #include <net/route.h> /* for RTX_IFA */ 37ca74a0a2SSepherosa Ziehau 38ca74a0a2SSepherosa Ziehau #include <err.h> 39ca74a0a2SSepherosa Ziehau #include <stdio.h> 40ca74a0a2SSepherosa Ziehau #include <stdlib.h> 41ca74a0a2SSepherosa Ziehau #include <string.h> 42ca74a0a2SSepherosa Ziehau #include <unistd.h> 43ca74a0a2SSepherosa Ziehau 44ca74a0a2SSepherosa Ziehau #include <netinet/in.h> 45ca74a0a2SSepherosa Ziehau #include <net/if_var.h> /* for struct ifaddr */ 46ca74a0a2SSepherosa Ziehau #include <netinet/in_var.h> 47ca74a0a2SSepherosa Ziehau #include <arpa/inet.h> 48ca74a0a2SSepherosa Ziehau #include <netdb.h> 49ca74a0a2SSepherosa Ziehau 50ca74a0a2SSepherosa Ziehau #include "ifconfig.h" 51ca74a0a2SSepherosa Ziehau 52ca74a0a2SSepherosa Ziehau static struct ifaliasreq in_addreq; 53ca74a0a2SSepherosa Ziehau static struct ifreq in_ridreq; 54ca74a0a2SSepherosa Ziehau 55ca74a0a2SSepherosa Ziehau static void 56ca74a0a2SSepherosa Ziehau in_status(int s __unused, const struct rt_addrinfo * info) 57ca74a0a2SSepherosa Ziehau { 58ca74a0a2SSepherosa Ziehau struct sockaddr_in *sin, null_sin; 59ca74a0a2SSepherosa Ziehau 60ca74a0a2SSepherosa Ziehau memset(&null_sin, 0, sizeof(null_sin)); 61ca74a0a2SSepherosa Ziehau 62ca74a0a2SSepherosa Ziehau sin = (struct sockaddr_in *)info->rti_info[RTAX_IFA]; 63ca74a0a2SSepherosa Ziehau if (sin == NULL) 64ca74a0a2SSepherosa Ziehau return; 65ca74a0a2SSepherosa Ziehau 66ca74a0a2SSepherosa Ziehau printf("\tinet %s ", inet_ntoa(sin->sin_addr)); 67ca74a0a2SSepherosa Ziehau 68ca74a0a2SSepherosa Ziehau if (flags & IFF_POINTOPOINT) { 69ca74a0a2SSepherosa Ziehau /* note RTAX_BRD overlap with IFF_BROADCAST */ 70ca74a0a2SSepherosa Ziehau sin = (struct sockaddr_in *)info->rti_info[RTAX_BRD]; 71ca74a0a2SSepherosa Ziehau if (!sin) 72ca74a0a2SSepherosa Ziehau sin = &null_sin; 73ca74a0a2SSepherosa Ziehau printf("--> %s ", inet_ntoa(sin->sin_addr)); 74ca74a0a2SSepherosa Ziehau } 75ca74a0a2SSepherosa Ziehau 76ca74a0a2SSepherosa Ziehau sin = (struct sockaddr_in *)info->rti_info[RTAX_NETMASK]; 77ca74a0a2SSepherosa Ziehau if (!sin) 78ca74a0a2SSepherosa Ziehau sin = &null_sin; 79ca74a0a2SSepherosa Ziehau printf("netmask 0x%lx ", (unsigned long)ntohl(sin->sin_addr.s_addr)); 80ca74a0a2SSepherosa Ziehau 81ca74a0a2SSepherosa Ziehau if (flags & IFF_BROADCAST) { 82ca74a0a2SSepherosa Ziehau /* note RTAX_BRD overlap with IFF_POINTOPOINT */ 83ca74a0a2SSepherosa Ziehau sin = (struct sockaddr_in *)info->rti_info[RTAX_BRD]; 84ca74a0a2SSepherosa Ziehau if (sin && sin->sin_addr.s_addr != 0) 85ca74a0a2SSepherosa Ziehau printf("broadcast %s", inet_ntoa(sin->sin_addr)); 86ca74a0a2SSepherosa Ziehau } 87ca74a0a2SSepherosa Ziehau putchar('\n'); 88ca74a0a2SSepherosa Ziehau } 89ca74a0a2SSepherosa Ziehau 90ca74a0a2SSepherosa Ziehau #define SIN(x) ((struct sockaddr_in *) &(x)) 91ca74a0a2SSepherosa Ziehau static struct sockaddr_in *sintab[] = { 92ca74a0a2SSepherosa Ziehau SIN(in_ridreq.ifr_addr), SIN(in_addreq.ifra_addr), 93ca74a0a2SSepherosa Ziehau SIN(in_addreq.ifra_mask), SIN(in_addreq.ifra_broadaddr) 94ca74a0a2SSepherosa Ziehau }; 95ca74a0a2SSepherosa Ziehau 96ca74a0a2SSepherosa Ziehau static void 97ca74a0a2SSepherosa Ziehau in_getaddr(const char *s, int which) 98ca74a0a2SSepherosa Ziehau { 99ca74a0a2SSepherosa Ziehau struct sockaddr_in *sin = sintab[which]; 100ca74a0a2SSepherosa Ziehau struct hostent *hp; 101ca74a0a2SSepherosa Ziehau struct netent *np; 102ca74a0a2SSepherosa Ziehau 103ca74a0a2SSepherosa Ziehau sin->sin_len = sizeof(*sin); 104ca74a0a2SSepherosa Ziehau if (which != MASK) 105ca74a0a2SSepherosa Ziehau sin->sin_family = AF_INET; 106ca74a0a2SSepherosa Ziehau 107ca74a0a2SSepherosa Ziehau if (which == ADDR) { 108ca74a0a2SSepherosa Ziehau char *p = NULL; 109ca74a0a2SSepherosa Ziehau 110ca74a0a2SSepherosa Ziehau if((p = strrchr(s, '/')) != NULL) { 111ca74a0a2SSepherosa Ziehau /* address is `name/masklen' */ 112ca74a0a2SSepherosa Ziehau int masklen; 113ca74a0a2SSepherosa Ziehau int ret; 114ca74a0a2SSepherosa Ziehau struct sockaddr_in *min = sintab[MASK]; 115ca74a0a2SSepherosa Ziehau *p = '\0'; 116ca74a0a2SSepherosa Ziehau ret = sscanf(p+1, "%u", &masklen); 117ca74a0a2SSepherosa Ziehau if(ret != 1 || (masklen < 0 || masklen > 32)) { 118ca74a0a2SSepherosa Ziehau *p = '/'; 119ca74a0a2SSepherosa Ziehau errx(1, "%s: bad value", s); 120ca74a0a2SSepherosa Ziehau } 121ca74a0a2SSepherosa Ziehau min->sin_len = sizeof(*min); 122ca74a0a2SSepherosa Ziehau min->sin_addr.s_addr = htonl(~((1LL << (32 - masklen)) - 1) & 123ca74a0a2SSepherosa Ziehau 0xffffffff); 124ca74a0a2SSepherosa Ziehau } 125ca74a0a2SSepherosa Ziehau } 126ca74a0a2SSepherosa Ziehau 127ca74a0a2SSepherosa Ziehau if (inet_aton(s, &sin->sin_addr)) 128ca74a0a2SSepherosa Ziehau return; 129*678e8cc6SSascha Wildner if ((hp = gethostbyname(s)) != NULL) 130ca74a0a2SSepherosa Ziehau bcopy(hp->h_addr, (char *)&sin->sin_addr, 131ca74a0a2SSepherosa Ziehau MIN(hp->h_length, sizeof(sin->sin_addr))); 132*678e8cc6SSascha Wildner else if ((np = getnetbyname(s)) != NULL) 133ca74a0a2SSepherosa Ziehau sin->sin_addr = inet_makeaddr(np->n_net, INADDR_ANY); 134ca74a0a2SSepherosa Ziehau else 135ca74a0a2SSepherosa Ziehau errx(1, "%s: bad value", s); 136ca74a0a2SSepherosa Ziehau } 137ca74a0a2SSepherosa Ziehau 138ca74a0a2SSepherosa Ziehau static void 139ca74a0a2SSepherosa Ziehau in_status_tunnel(int s) 140ca74a0a2SSepherosa Ziehau { 141ca74a0a2SSepherosa Ziehau char src[NI_MAXHOST]; 142ca74a0a2SSepherosa Ziehau char dst[NI_MAXHOST]; 143ca74a0a2SSepherosa Ziehau struct ifreq ifr; 144ca74a0a2SSepherosa Ziehau const struct sockaddr *sa = (const struct sockaddr *) &ifr.ifr_addr; 145ca74a0a2SSepherosa Ziehau 146ca74a0a2SSepherosa Ziehau memset(&ifr, 0, sizeof(ifr)); 147ca74a0a2SSepherosa Ziehau strncpy(ifr.ifr_name, name, IFNAMSIZ); 148ca74a0a2SSepherosa Ziehau 149ca74a0a2SSepherosa Ziehau if (ioctl(s, SIOCGIFPSRCADDR, (caddr_t)&ifr) < 0) 150ca74a0a2SSepherosa Ziehau return; 151ca74a0a2SSepherosa Ziehau if (sa->sa_family != AF_INET) 152ca74a0a2SSepherosa Ziehau return; 153ca74a0a2SSepherosa Ziehau if (getnameinfo(sa, sa->sa_len, src, sizeof(src), 0, 0, NI_NUMERICHOST) != 0) 154ca74a0a2SSepherosa Ziehau src[0] = '\0'; 155ca74a0a2SSepherosa Ziehau 156ca74a0a2SSepherosa Ziehau if (ioctl(s, SIOCGIFPDSTADDR, (caddr_t)&ifr) < 0) 157ca74a0a2SSepherosa Ziehau return; 158ca74a0a2SSepherosa Ziehau if (sa->sa_family != AF_INET) 159ca74a0a2SSepherosa Ziehau return; 160ca74a0a2SSepherosa Ziehau if (getnameinfo(sa, sa->sa_len, dst, sizeof(dst), 0, 0, NI_NUMERICHOST) != 0) 161ca74a0a2SSepherosa Ziehau dst[0] = '\0'; 162ca74a0a2SSepherosa Ziehau 163ca74a0a2SSepherosa Ziehau printf("\ttunnel inet %s --> %s\n", src, dst); 164ca74a0a2SSepherosa Ziehau } 165ca74a0a2SSepherosa Ziehau 166ca74a0a2SSepherosa Ziehau static void 167ca74a0a2SSepherosa Ziehau in_set_tunnel(int s, struct addrinfo *srcres, struct addrinfo *dstres) 168ca74a0a2SSepherosa Ziehau { 169ca74a0a2SSepherosa Ziehau struct ifaliasreq addreq; 170ca74a0a2SSepherosa Ziehau 171ca74a0a2SSepherosa Ziehau memset(&addreq, 0, sizeof(addreq)); 172ca74a0a2SSepherosa Ziehau strncpy(addreq.ifra_name, name, IFNAMSIZ); 173ca74a0a2SSepherosa Ziehau memcpy(&addreq.ifra_addr, srcres->ai_addr, srcres->ai_addr->sa_len); 174ca74a0a2SSepherosa Ziehau memcpy(&addreq.ifra_dstaddr, dstres->ai_addr, dstres->ai_addr->sa_len); 175ca74a0a2SSepherosa Ziehau 176ca74a0a2SSepherosa Ziehau if (ioctl(s, SIOCSIFPHYADDR, &addreq) < 0) 177ca74a0a2SSepherosa Ziehau warn("SIOCSIFPHYADDR"); 178ca74a0a2SSepherosa Ziehau } 179ca74a0a2SSepherosa Ziehau 180ca74a0a2SSepherosa Ziehau static struct afswtch af_inet = { 181ca74a0a2SSepherosa Ziehau .af_name = "inet", 182ca74a0a2SSepherosa Ziehau .af_af = AF_INET, 183ca74a0a2SSepherosa Ziehau .af_status = in_status, 184ca74a0a2SSepherosa Ziehau .af_getaddr = in_getaddr, 185ca74a0a2SSepherosa Ziehau .af_status_tunnel = in_status_tunnel, 186ca74a0a2SSepherosa Ziehau .af_settunnel = in_set_tunnel, 187ca74a0a2SSepherosa Ziehau .af_difaddr = SIOCDIFADDR, 188ca74a0a2SSepherosa Ziehau .af_aifaddr = SIOCAIFADDR, 189ca74a0a2SSepherosa Ziehau .af_ridreq = &in_ridreq, 190ca74a0a2SSepherosa Ziehau .af_addreq = &in_addreq, 191ca74a0a2SSepherosa Ziehau }; 192ca74a0a2SSepherosa Ziehau 193d44b223aSSascha Wildner static __constructor(101) void 194ca74a0a2SSepherosa Ziehau inet_ctor(void) 195ca74a0a2SSepherosa Ziehau { 196ca74a0a2SSepherosa Ziehau af_register(&af_inet); 197ca74a0a2SSepherosa Ziehau } 198