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