1139823Simp/*- 225603Skjc * Copyright (c) 1996 Charles D. Cranor and Washington University. 325603Skjc * All rights reserved. 425603Skjc * 525603Skjc * Redistribution and use in source and binary forms, with or without 625603Skjc * modification, are permitted provided that the following conditions 725603Skjc * are met: 825603Skjc * 1. Redistributions of source code must retain the above copyright 925603Skjc * notice, this list of conditions and the following disclaimer. 1025603Skjc * 2. Redistributions in binary form must reproduce the above copyright 1125603Skjc * notice, this list of conditions and the following disclaimer in the 1225603Skjc * documentation and/or other materials provided with the distribution. 1325603Skjc * 3. All advertising materials mentioning features or use of this software 1425603Skjc * must display the following acknowledgement: 1525603Skjc * This product includes software developed by Charles D. Cranor and 1625603Skjc * Washington University. 1725603Skjc * 4. The name of the author may not be used to endorse or promote products 1825603Skjc * derived from this software without specific prior written permission. 1925603Skjc * 2025603Skjc * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 2125603Skjc * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 2225603Skjc * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2325603Skjc * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2425603Skjc * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2525603Skjc * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2625603Skjc * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2725603Skjc * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2825603Skjc * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2925603Skjc * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30165900Srwatson * 31165900Srwatson * $NetBSD: natm_pcb.c,v 1.4 1996/11/09 03:26:27 chuck Exp $ 3225603Skjc */ 3325603Skjc 3425603Skjc/* 3525603Skjc * atm_pcb.c: manage atm protocol control blocks and keep IP and NATM 3625603Skjc * from trying to use each other's VCs. 3725603Skjc */ 3825603Skjc 39157979Srwatson#include "opt_ddb.h" 40157979Srwatson 41116189Sobrien#include <sys/cdefs.h> 42116189Sobrien__FBSDID("$FreeBSD$"); 43116189Sobrien 4425603Skjc#include <sys/param.h> 45157979Srwatson#include <sys/kernel.h> 46157979Srwatson#include <sys/malloc.h> 4725603Skjc#include <sys/systm.h> 4825603Skjc#include <sys/socket.h> 4931885Sbde#include <sys/socketvar.h> 5025603Skjc 5125603Skjc#include <net/if.h> 5225603Skjc 5325603Skjc#include <netinet/in.h> 5425603Skjc 5525603Skjc#include <netnatm/natm.h> 5625603Skjc 57157979Srwatson#include <ddb/ddb.h> 58157979Srwatson 5931885Sbdestruct npcblist natm_pcbs; 6031885Sbde 6125603Skjc/* 6225603Skjc * npcb_alloc: allocate a npcb [in the free state] 6325603Skjc */ 64118541Shartistruct natmpcb * 65118541Shartinpcb_alloc(int wait) 6625603Skjc 6725603Skjc{ 68118541Sharti struct natmpcb *npcb; 6925603Skjc 70118541Sharti npcb = malloc(sizeof(*npcb), M_PCB, wait | M_ZERO); 71118541Sharti if (npcb != NULL) 72118541Sharti npcb->npcb_flags = NPCB_FREE; 73118541Sharti return (npcb); 7425603Skjc} 7525603Skjc 7625603Skjc 7725603Skjc/* 7825603Skjc * npcb_free: free a npcb 7925603Skjc */ 80118541Shartivoid 81118541Shartinpcb_free(struct natmpcb *npcb, int op) 8225603Skjc{ 8325603Skjc 84148125Srwatson NATM_LOCK_ASSERT(); 85148125Srwatson 86118541Sharti if ((npcb->npcb_flags & NPCB_FREE) == 0) { 87118541Sharti LIST_REMOVE(npcb, pcblist); 88118541Sharti npcb->npcb_flags = NPCB_FREE; 89118541Sharti } 90118541Sharti if (op == NPCB_DESTROY) { 91118541Sharti if (npcb->npcb_inq) { 92118541Sharti npcb->npcb_flags = NPCB_DRAIN; /* flag for distruct. */ 93118541Sharti } else { 94184205Sdes free(npcb, M_PCB); /* kill it! */ 95118541Sharti } 96118541Sharti } 9725603Skjc} 9825603Skjc 9925603Skjc 10025603Skjc/* 10125603Skjc * npcb_add: add or remove npcb from main list 10225603Skjc * returns npcb if ok 10325603Skjc */ 104118541Shartistruct natmpcb * 105118541Shartinpcb_add(struct natmpcb *npcb, struct ifnet *ifp, u_int16_t vci, u_int8_t vpi) 10625603Skjc{ 107118541Sharti struct natmpcb *cpcb = NULL; /* current pcb */ 10825603Skjc 109148125Srwatson NATM_LOCK_ASSERT(); 11025603Skjc 111118541Sharti /* 112118541Sharti * lookup required 113118541Sharti */ 114118541Sharti LIST_FOREACH(cpcb, &natm_pcbs, pcblist) 115118541Sharti if (ifp == cpcb->npcb_ifp && vci == cpcb->npcb_vci && 116118541Sharti vpi == cpcb->npcb_vpi) 117118541Sharti break; 11825603Skjc 119118541Sharti /* 120118541Sharti * add & something already there? 121118541Sharti */ 122118541Sharti if (cpcb) { 123118541Sharti cpcb = NULL; 124118541Sharti goto done; /* fail */ 125118541Sharti } 12625603Skjc 127118541Sharti /* 128118541Sharti * need to allocate a pcb? 129118541Sharti */ 130118541Sharti if (npcb == NULL) { 131118541Sharti /* could be called from lower half */ 132118541Sharti cpcb = npcb_alloc(M_NOWAIT); 133118541Sharti if (cpcb == NULL) 134118541Sharti goto done; /* fail */ 135118541Sharti } else { 136118541Sharti cpcb = npcb; 137118541Sharti } 13825603Skjc 139118541Sharti cpcb->npcb_ifp = ifp; 140118541Sharti cpcb->ipaddr.s_addr = 0; 141118541Sharti cpcb->npcb_vci = vci; 142118541Sharti cpcb->npcb_vpi = vpi; 143118541Sharti cpcb->npcb_flags = NPCB_CONNECTED; 14425603Skjc 145118541Sharti LIST_INSERT_HEAD(&natm_pcbs, cpcb, pcblist); 14625603Skjc 14725603Skjcdone: 148118541Sharti return (cpcb); 14925603Skjc} 15025603Skjc 15125603Skjc#ifdef DDB 152157979SrwatsonDB_SHOW_COMMAND(natm, db_show_natm) 15325603Skjc{ 154118541Sharti struct natmpcb *cpcb; 15525603Skjc 156157979Srwatson db_printf("npcb dump:\n"); 157118541Sharti LIST_FOREACH(cpcb, &natm_pcbs, pcblist) { 158157979Srwatson db_printf("if=%s, vci=%d, vpi=%d, IP=0x%x, sock=%p, " 159157979Srwatson "flags=0x%x, inq=%d\n", cpcb->npcb_ifp->if_xname, 160157979Srwatson cpcb->npcb_vci, cpcb->npcb_vpi, cpcb->ipaddr.s_addr, 161157979Srwatson cpcb->npcb_socket, cpcb->npcb_flags, cpcb->npcb_inq); 162118541Sharti } 16325603Skjc} 16425603Skjc#endif 165