[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]

FreeBSD/Linux Kernel Cross Reference
sys/netnatm/natm_pcb.c

Version: -  FREEBSD  -  FREEBSD7  -  FREEBSD70  -  FREEBSD6  -  FREEBSD63  -  FREEBSD62  -  FREEBSD61  -  FREEBSD60  -  FREEBSD5  -  FREEBSD55  -  FREEBSD54  -  FREEBSD53  -  FREEBSD52  -  FREEBSD51  -  FREEBSD50  -  FREEBSD4  -  FREEBSD3  -  FREEBSD22  -  linux-2.6  -  linux-2.4.22  -  MK83  -  MK84  -  PLAN9  -  DFBSD  -  NETBSD  -  NETBSD4  -  NETBSD3  -  NETBSD20  -  OPENBSD  -  xnu-517  -  xnu-792  -  xnu-792.6.70  -  xnu-1228  -  OPENSOLARIS  -  minix-3-1-1  -  TRUSTEDBSD-SEBSD  -  FREEBSD-LIBC  -  FREEBSD7-LIBC  -  FREEBSD6-LIBC  -  GLIBC27 
SearchContext: -  none  -  excerpts  -  bigexcerpts 

  1 /*-
  2  * Copyright (c) 1996 Charles D. Cranor and Washington University.
  3  * All rights reserved.
  4  *
  5  * Redistribution and use in source and binary forms, with or without
  6  * modification, are permitted provided that the following conditions
  7  * are met:
  8  * 1. Redistributions of source code must retain the above copyright
  9  *    notice, this list of conditions and the following disclaimer.
 10  * 2. Redistributions in binary form must reproduce the above copyright
 11  *    notice, this list of conditions and the following disclaimer in the
 12  *    documentation and/or other materials provided with the distribution.
 13  * 3. All advertising materials mentioning features or use of this software
 14  *    must display the following acknowledgement:
 15  *      This product includes software developed by Charles D. Cranor and
 16  *      Washington University.
 17  * 4. The name of the author may not be used to endorse or promote products
 18  *    derived from this software without specific prior written permission.
 19  *
 20  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 21  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 22  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 23  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 24  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 25  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 29  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 30  *
 31  * $NetBSD: natm_pcb.c,v 1.4 1996/11/09 03:26:27 chuck Exp $
 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: src/sys/netnatm/natm_pcb.c,v 1.19 2008/10/23 15:53:51 des Exp $");
 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 
 59 struct npcblist natm_pcbs;
 60 
 61 /*
 62  * npcb_alloc: allocate a npcb [in the free state]
 63  */
 64 struct natmpcb *
 65 npcb_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  */
 80 void
 81 npcb_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  */
104 struct natmpcb *
105 npcb_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 
147 done:
148         return (cpcb);
149 }
150 
151 #ifdef DDB
152 DB_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 

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.