natm_pcb.c revision 157979
1/* $NetBSD: natm_pcb.c,v 1.4 1996/11/09 03:26:27 chuck Exp $ */ 2/*- 3 * 4 * Copyright (c) 1996 Charles D. Cranor and Washington University. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed by Charles D. Cranor and 18 * Washington University. 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 THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34/* 35 * atm_pcb.c: manage atm protocol control blocks and keep IP and NATM 36 * from trying to use each other's VCs. 37 */ 38 39#include "opt_ddb.h" 40 41#include <sys/cdefs.h> 42__FBSDID("$FreeBSD: head/sys/netnatm/natm_pcb.c 157979 2006-04-23 15:23:31Z rwatson $"); 43 44#include <sys/param.h> 45#include <sys/kernel.h> 46#include <sys/malloc.h> 47#include <sys/systm.h> 48#include <sys/socket.h> 49#include <sys/socketvar.h> 50 51#include <net/if.h> 52 53#include <netinet/in.h> 54 55#include <netnatm/natm.h> 56 57#include <ddb/ddb.h> 58 59struct npcblist natm_pcbs; 60 61/* 62 * npcb_alloc: allocate a npcb [in the free state] 63 */ 64struct natmpcb * 65npcb_alloc(int wait) 66 67{ 68 struct natmpcb *npcb; 69 70 npcb = malloc(sizeof(*npcb), M_PCB, wait | M_ZERO); 71 if (npcb != NULL) 72 npcb->npcb_flags = NPCB_FREE; 73 return (npcb); 74} 75 76 77/* 78 * npcb_free: free a npcb 79 */ 80void 81npcb_free(struct natmpcb *npcb, int op) 82{ 83 84 NATM_LOCK_ASSERT(); 85 86 if ((npcb->npcb_flags & NPCB_FREE) == 0) { 87 LIST_REMOVE(npcb, pcblist); 88 npcb->npcb_flags = NPCB_FREE; 89 } 90 if (op == NPCB_DESTROY) { 91 if (npcb->npcb_inq) { 92 npcb->npcb_flags = NPCB_DRAIN; /* flag for distruct. */ 93 } else { 94 FREE(npcb, M_PCB); /* kill it! */ 95 } 96 } 97} 98 99 100/* 101 * npcb_add: add or remove npcb from main list 102 * returns npcb if ok 103 */ 104struct natmpcb * 105npcb_add(struct natmpcb *npcb, struct ifnet *ifp, u_int16_t vci, u_int8_t vpi) 106{ 107 struct natmpcb *cpcb = NULL; /* current pcb */ 108 109 NATM_LOCK_ASSERT(); 110 111 /* 112 * lookup required 113 */ 114 LIST_FOREACH(cpcb, &natm_pcbs, pcblist) 115 if (ifp == cpcb->npcb_ifp && vci == cpcb->npcb_vci && 116 vpi == cpcb->npcb_vpi) 117 break; 118 119 /* 120 * add & something already there? 121 */ 122 if (cpcb) { 123 cpcb = NULL; 124 goto done; /* fail */ 125 } 126 127 /* 128 * need to allocate a pcb? 129 */ 130 if (npcb == NULL) { 131 /* could be called from lower half */ 132 cpcb = npcb_alloc(M_NOWAIT); 133 if (cpcb == NULL) 134 goto done; /* fail */ 135 } else { 136 cpcb = npcb; 137 } 138 139 cpcb->npcb_ifp = ifp; 140 cpcb->ipaddr.s_addr = 0; 141 cpcb->npcb_vci = vci; 142 cpcb->npcb_vpi = vpi; 143 cpcb->npcb_flags = NPCB_CONNECTED; 144 145 LIST_INSERT_HEAD(&natm_pcbs, cpcb, pcblist); 146 147done: 148 return (cpcb); 149} 150 151#ifdef DDB 152DB_SHOW_COMMAND(natm, db_show_natm) 153{ 154 struct natmpcb *cpcb; 155 156 db_printf("npcb dump:\n"); 157 LIST_FOREACH(cpcb, &natm_pcbs, pcblist) { 158 db_printf("if=%s, vci=%d, vpi=%d, IP=0x%x, sock=%p, " 159 "flags=0x%x, inq=%d\n", cpcb->npcb_ifp->if_xname, 160 cpcb->npcb_vci, cpcb->npcb_vpi, cpcb->ipaddr.s_addr, 161 cpcb->npcb_socket, cpcb->npcb_flags, cpcb->npcb_inq); 162 } 163} 164#endif 165