Annotation of sys/lib/libsa/netif.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: netif.c,v 1.8 2003/08/11 06:23:09 deraadt Exp $ */
! 2: /* $NetBSD: netif.c,v 1.7 1996/10/13 02:29:03 christos Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 1993 Adam Glass
! 6: * All rights reserved.
! 7: *
! 8: * Redistribution and use in source and binary forms, with or without
! 9: * modification, are permitted provided that the following conditions
! 10: * are met:
! 11: * 1. Redistributions of source code must retain the above copyright
! 12: * notice, this list of conditions and the following disclaimer.
! 13: * 2. Redistributions in binary form must reproduce the above copyright
! 14: * notice, this list of conditions and the following disclaimer in the
! 15: * documentation and/or other materials provided with the distribution.
! 16: * 3. All advertising materials mentioning features or use of this software
! 17: * must display the following acknowledgement:
! 18: * This product includes software developed by Adam Glass.
! 19: * 4. The name of the Author may not be used to endorse or promote products
! 20: * derived from this software without specific prior written permission.
! 21: *
! 22: * THIS SOFTWARE IS PROVIDED BY Adam Glass ``AS IS'' AND
! 23: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 24: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 25: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
! 26: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 27: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 28: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 29: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 30: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 31: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 32: * SUCH DAMAGE.
! 33: */
! 34:
! 35: #include <sys/param.h>
! 36: #include <sys/types.h>
! 37: #include <sys/cdefs.h>
! 38: #include <sys/mount.h>
! 39:
! 40: #include <netinet/in.h>
! 41: #include <netinet/in_systm.h>
! 42:
! 43: #include "stand.h"
! 44: #include "net.h"
! 45: #include "netif.h"
! 46:
! 47: struct iodesc sockets[SOPEN_MAX];
! 48: #ifdef NETIF_DEBUG
! 49: int netif_debug = 0;
! 50: #endif
! 51:
! 52: /*
! 53: * netif_init:
! 54: *
! 55: * initialize the generic network interface layer
! 56: */
! 57:
! 58: void
! 59: netif_init(void)
! 60: {
! 61: struct netif_driver *drv;
! 62: int d, i;
! 63:
! 64: #ifdef NETIF_DEBUG
! 65: if (netif_debug)
! 66: printf("netif_init: called\n");
! 67: #endif
! 68: for (d = 0; d < n_netif_drivers; d++) {
! 69: drv = netif_drivers[d];
! 70: for (i = 0; i < drv->netif_nifs; i++)
! 71: drv->netif_ifs[i].dif_used = 0;
! 72: }
! 73: }
! 74:
! 75: static int
! 76: netif_match(struct netif *nif, void *machdep_hint)
! 77: {
! 78: struct netif_driver *drv = nif->nif_driver;
! 79:
! 80: #if 0
! 81: if (netif_debug)
! 82: printf("%s%d: netif_match (%d)\n", drv->netif_bname,
! 83: nif->nif_unit, nif->nif_sel);
! 84: #endif
! 85: return drv->netif_match(nif, machdep_hint);
! 86: }
! 87:
! 88: struct netif *
! 89: netif_select(void *machdep_hint)
! 90: {
! 91: int d, u, unit_done, s;
! 92: struct netif_driver *drv;
! 93: struct netif cur_if;
! 94: static struct netif best_if;
! 95: int best_val;
! 96: int val;
! 97:
! 98: best_val = 0;
! 99: best_if.nif_driver = NULL;
! 100:
! 101: #ifdef NETIF_DEBUG
! 102: if (netif_debug)
! 103: printf("netif_select: %d interfaces\n", n_netif_drivers);
! 104: #endif
! 105:
! 106: for (d = 0; d < n_netif_drivers; d++) {
! 107: cur_if.nif_driver = netif_drivers[d];
! 108: drv = cur_if.nif_driver;
! 109:
! 110: for (u = 0; u < drv->netif_nifs; u++) {
! 111: cur_if.nif_unit = u;
! 112: unit_done = 0;
! 113:
! 114: #ifdef NETIF_DEBUG
! 115: if (netif_debug)
! 116: printf("\t%s%d:", drv->netif_bname,
! 117: cur_if.nif_unit);
! 118: #endif
! 119:
! 120: for (s = 0; s < drv->netif_ifs[u].dif_nsel; s++) {
! 121: cur_if.nif_sel = s;
! 122:
! 123: if (drv->netif_ifs[u].dif_used & (1 << s)) {
! 124: #ifdef NETIF_DEBUG
! 125: if (netif_debug)
! 126: printf(" [%d used]", s);
! 127: #endif
! 128: continue;
! 129: }
! 130:
! 131: val = netif_match(&cur_if, machdep_hint);
! 132: #ifdef NETIF_DEBUG
! 133: if (netif_debug)
! 134: printf(" [%d -> %d]", s, val);
! 135: #endif
! 136: if (val > best_val) {
! 137: best_val = val;
! 138: best_if = cur_if;
! 139: }
! 140: }
! 141: #ifdef NETIF_DEBUG
! 142: if (netif_debug)
! 143: printf("\n");
! 144: #endif
! 145: }
! 146: }
! 147:
! 148: if (best_if.nif_driver == NULL)
! 149: return NULL;
! 150:
! 151: best_if.nif_driver->netif_ifs[best_if.nif_unit].dif_used |=
! 152: (1 << best_if.nif_sel);
! 153:
! 154: #ifdef NETIF_DEBUG
! 155: if (netif_debug)
! 156: printf("netif_select: %s%d(%d) wins\n",
! 157: best_if.nif_driver->netif_bname,
! 158: best_if.nif_unit, best_if.nif_sel);
! 159: #endif
! 160: return &best_if;
! 161: }
! 162:
! 163: int
! 164: netif_probe(struct netif *nif, void *machdep_hint)
! 165: {
! 166: struct netif_driver *drv = nif->nif_driver;
! 167:
! 168: #ifdef NETIF_DEBUG
! 169: if (netif_debug)
! 170: printf("%s%d: netif_probe\n", drv->netif_bname, nif->nif_unit);
! 171: #endif
! 172: return drv->netif_probe(nif, machdep_hint);
! 173: }
! 174:
! 175: void
! 176: netif_attach(struct netif *nif, struct iodesc *desc, void *machdep_hint)
! 177: {
! 178: struct netif_driver *drv = nif->nif_driver;
! 179:
! 180: #ifdef NETIF_DEBUG
! 181: if (netif_debug)
! 182: printf("%s%d: netif_attach\n", drv->netif_bname, nif->nif_unit);
! 183: #endif
! 184: desc->io_netif = nif;
! 185: #ifdef PARANOID
! 186: if (drv->netif_init == NULL)
! 187: panic("%s%d: no netif_init support", drv->netif_bname,
! 188: nif->nif_unit);
! 189: #endif
! 190: drv->netif_init(desc, machdep_hint);
! 191: bzero(drv->netif_ifs[nif->nif_unit].dif_stats,
! 192: sizeof(struct netif_stats));
! 193: }
! 194:
! 195: void
! 196: netif_detach(struct netif *nif)
! 197: {
! 198: struct netif_driver *drv = nif->nif_driver;
! 199:
! 200: #ifdef NETIF_DEBUG
! 201: if (netif_debug)
! 202: printf("%s%d: netif_detach\n", drv->netif_bname, nif->nif_unit);
! 203: #endif
! 204: #ifdef PARANOID
! 205: if (drv->netif_end == NULL)
! 206: panic("%s%d: no netif_end support", drv->netif_bname,
! 207: nif->nif_unit);
! 208: #endif
! 209: drv->netif_end(nif);
! 210: }
! 211:
! 212: ssize_t
! 213: netif_get(struct iodesc *desc, void *pkt, size_t len, time_t timo)
! 214: {
! 215: #ifdef NETIF_DEBUG
! 216: struct netif *nif = desc->io_netif;
! 217: #endif
! 218: struct netif_driver *drv = desc->io_netif->nif_driver;
! 219: ssize_t rv;
! 220:
! 221: #ifdef NETIF_DEBUG
! 222: if (netif_debug)
! 223: printf("%s%d: netif_get\n", drv->netif_bname, nif->nif_unit);
! 224: #endif
! 225: #ifdef PARANOID
! 226: if (drv->netif_get == NULL)
! 227: panic("%s%d: no netif_get support", drv->netif_bname,
! 228: nif->nif_unit);
! 229: #endif
! 230: rv = drv->netif_get(desc, pkt, len, timo);
! 231: #ifdef NETIF_DEBUG
! 232: if (netif_debug)
! 233: printf("%s%d: netif_get returning %d\n", drv->netif_bname,
! 234: nif->nif_unit, rv);
! 235: #endif
! 236: return rv;
! 237: }
! 238:
! 239: ssize_t
! 240: netif_put(struct iodesc *desc, void *pkt, size_t len)
! 241: {
! 242: #ifdef NETIF_DEBUG
! 243: struct netif *nif = desc->io_netif;
! 244: #endif
! 245: struct netif_driver *drv = desc->io_netif->nif_driver;
! 246: ssize_t rv;
! 247:
! 248: #ifdef NETIF_DEBUG
! 249: if (netif_debug)
! 250: printf("%s%d: netif_put\n", drv->netif_bname, nif->nif_unit);
! 251: #endif
! 252: #ifdef PARANOID
! 253: if (drv->netif_put == NULL)
! 254: panic("%s%d: no netif_put support", drv->netif_bname,
! 255: nif->nif_unit);
! 256: #endif
! 257: rv = drv->netif_put(desc, pkt, len);
! 258: #ifdef NETIF_DEBUG
! 259: if (netif_debug)
! 260: printf("%s%d: netif_put returning %d\n", drv->netif_bname,
! 261: nif->nif_unit, rv);
! 262: #endif
! 263: return rv;
! 264: }
! 265:
! 266: struct iodesc *
! 267: socktodesc(sock)
! 268: int sock;
! 269: {
! 270: if (sock >= SOPEN_MAX) {
! 271: errno = EBADF;
! 272: return (NULL);
! 273: }
! 274: return (&sockets[sock]);
! 275: }
! 276:
! 277: int
! 278: netif_open(void *machdep_hint)
! 279: {
! 280: int fd;
! 281: struct iodesc *s;
! 282: struct netif *nif;
! 283:
! 284: /* find a free socket */
! 285: for (fd = 0, s = sockets; fd < SOPEN_MAX; fd++, s++)
! 286: if (s->io_netif == (struct netif *)0)
! 287: goto fnd;
! 288: errno = EMFILE;
! 289: return (-1);
! 290:
! 291: fnd:
! 292: bzero(s, sizeof(*s));
! 293: netif_init();
! 294: nif = netif_select(machdep_hint);
! 295: if (!nif)
! 296: panic("netboot: no interfaces left untried");
! 297: if (netif_probe(nif, machdep_hint)) {
! 298: printf("netboot: couldn't probe %s%d\n",
! 299: nif->nif_driver->netif_bname, nif->nif_unit);
! 300: errno = EINVAL;
! 301: return(-1);
! 302: }
! 303: netif_attach(nif, s, machdep_hint);
! 304:
! 305: return(fd);
! 306: }
! 307:
! 308: int
! 309: netif_close(int sock)
! 310: {
! 311: if (sock >= SOPEN_MAX) {
! 312: errno = EBADF;
! 313: return(-1);
! 314: }
! 315: netif_detach(sockets[sock].io_netif);
! 316: sockets[sock].io_netif = (struct netif *)0;
! 317:
! 318: return(0);
! 319: }
CVSweb