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