[BACK]Return to natm_pcb.c CVS log [TXT][DIR] Up to [local] / sys / netnatm

Annotation of sys/netnatm/natm_pcb.c, Revision 1.1.1.1

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

CVSweb