Annotation of kernel/bsd/netat/aurp_zi.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
        !             7:  * Reserved.  This file contains Original Code and/or Modifications of
        !             8:  * Original Code as defined in and that are subject to the Apple Public
        !             9:  * Source License Version 1.1 (the "License").  You may not use this file
        !            10:  * except in compliance with the License.  Please obtain a copy of the
        !            11:  * License at http://www.apple.com/publicsource and read it before using
        !            12:  * this file.
        !            13:  * 
        !            14:  * The Original Code and all software distributed under the License are
        !            15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            19:  * License for the specific language governing rights and limitations
        !            20:  * under the License.
        !            21:  * 
        !            22:  * @APPLE_LICENSE_HEADER_END@
        !            23:  */
        !            24: 
        !            25: /*
        !            26:  *     Copyright (c) 1996 Apple Computer, Inc. 
        !            27:  *
        !            28:  *     The information contained herein is subject to change without
        !            29:  *     notice and  should not be  construed as a commitment by Apple
        !            30:  *     Computer, Inc. Apple Computer, Inc. assumes no responsibility
        !            31:  *     for any errors that may appear.
        !            32:  *
        !            33:  *     Confidential and Proprietary to Apple Computer, Inc.
        !            34:  *
        !            35:  *     File: zi.c
        !            36:  */
        !            37: #include <sysglue.h>
        !            38: #include <at/appletalk.h>
        !            39: #include <lap.h>
        !            40: #include <routing_tables.h>
        !            41: #define _AURP
        !            42: #include <at_aurp.h>
        !            43: #include <at/aurp.h>
        !            44: 
        !            45: /* */
        !            46: void AURPsndZReq(state)
        !            47:        aurp_state_t *state;
        !            48: {
        !            49:        gbuf_t *m;
        !            50:        int msize;
        !            51:        aurp_hdr_t *hdrp;
        !            52:        short *net, nets_cnt, net_sent=0, entry_num=0;
        !            53:        RT_entry *entry = RT_table;
        !            54: 
        !            55:        if (!state->get_zi || (state->rcv_state == AURPSTATE_Unconnected))
        !            56:                return;
        !            57: 
        !            58: l_more:
        !            59:        msize = sizeof(aurp_hdr_t);
        !            60:        if ((m = (gbuf_t *)gbuf_alloc(msize+AURP_MaxPktSize, PRI_MED)) == 0) {
        !            61:                dPrintf(D_M_AURP, D_L_WARNING, ("AURPsndZReq: node=%d, out of mblk\n",
        !            62:                        state->rem_node));
        !            63:                return;
        !            64:        }
        !            65:        gbuf_wset(m,msize);
        !            66: 
        !            67:        /* construct the ZI request packet */
        !            68:        hdrp = (aurp_hdr_t *)gbuf_rptr(m);
        !            69:        hdrp->connection_id = state->rcv_connection_id;
        !            70:        hdrp->sequence_number = 0;
        !            71:        hdrp->command_code = AURPCMD_ZReq;
        !            72:        hdrp->flags = 0;
        !            73:        *(short *)(hdrp+1) = AURPSUBCODE_ZoneInfo1;
        !            74:        gbuf_winc(m,sizeof(short));
        !            75: 
        !            76:        net = (short *)gbuf_wptr(m);
        !            77:        nets_cnt = 0;
        !            78: 
        !            79:        while (entry_num < RT_maxentry) {
        !            80:                /*
        !            81:                 * scan the router table, and build the ZI request packet
        !            82:                 * with the right entries, i.e.,
        !            83:                 *  - entry in use and not of the net_port
        !            84:                 *  - with no zones and in an active state
        !            85:                 *  - talking to the right router
        !            86:                 */
        !            87:                if ( (entry->NetPort == net_port) && entry->NetStop &&
        !            88:                        ((entry->EntryState & 0x0F) >= RTE_STATE_SUSPECT) &&
        !            89:                                (!RT_ALL_ZONES_KNOWN(entry)) ) {
        !            90:                        *net++ = (entry->NetStart) ? entry->NetStart : entry->NetStop;
        !            91:                        nets_cnt++;
        !            92:                }
        !            93: 
        !            94:                if (nets_cnt >= 640) {
        !            95:                        /* query only 640 networks per packet */
        !            96:                        dPrintf(D_M_AURP, D_L_INFO, ("AURPsndZReq: node=%d\n",
        !            97:                                state->rem_node));
        !            98:                        gbuf_winc(m,(nets_cnt * sizeof(short)));
        !            99:                        AURPsend(m, AUD_AURP, state->rem_node);
        !           100:                        net_sent = 1;
        !           101:                        goto l_more;
        !           102:                }
        !           103: 
        !           104:                entry_num++;
        !           105:                entry++;
        !           106:        }
        !           107: 
        !           108:        if (nets_cnt) {
        !           109:                dPrintf(D_M_AURP, D_L_INFO, ("AURPsndZReq: node=%d\n",
        !           110:                        state->rem_node));
        !           111:                gbuf_winc(m,(nets_cnt * sizeof(short)));
        !           112:                AURPsend(m, AUD_AURP, state->rem_node);
        !           113:                net_sent = 1;
        !           114:        } else
        !           115:                gbuf_freeb(m);
        !           116: 
        !           117:        if (!net_sent)
        !           118:                state->get_zi = 0;
        !           119: }
        !           120: 
        !           121: /* */
        !           122: void AURPsndZRsp(state, dat_m, flag)
        !           123:        aurp_state_t *state;
        !           124:        gbuf_t *dat_m;
        !           125:        int flag;
        !           126: {
        !           127:        short len;
        !           128:        int msize, next_entry = 0;
        !           129:        gbuf_t *m;
        !           130:        aurp_hdr_t *hdrp;
        !           131: 
        !           132:        if ((state->snd_state == AURPSTATE_Unconnected) || (dat_m == 0))
        !           133:                return;
        !           134:        msize = sizeof(aurp_hdr_t);
        !           135: 
        !           136:   do {
        !           137:        if ((m = (gbuf_t *)gbuf_alloc(msize+AURP_MaxPktSize, PRI_MED)) == 0) {
        !           138:                dPrintf(D_M_AURP, D_L_WARNING, ("AURPsndZRsp: node=%d, out of mblk\n",
        !           139:                        state->rem_node));
        !           140:                return;
        !           141:        }
        !           142:        gbuf_wset(m,msize);
        !           143: 
        !           144:        /* construct the ZI response packet */
        !           145:        hdrp = (aurp_hdr_t *)gbuf_rptr(m);
        !           146:        hdrp->connection_id = state->snd_connection_id;
        !           147:        hdrp->sequence_number = 0;
        !           148:        hdrp->command_code = AURPCMD_ZRsp;
        !           149:        hdrp->flags = 0;
        !           150: 
        !           151:        /* get zone info of the local networks */
        !           152:        next_entry = AURPgetzi(next_entry, gbuf_wptr(m), &len, dat_m, flag);
        !           153:        gbuf_winc(m,len);
        !           154: 
        !           155:        /* send the packet */
        !           156:        dPrintf(D_M_AURP, D_L_INFO, ("AURPsndZRsp: len=%d\n", len));
        !           157:        AURPsend(m, AUD_AURP, state->rem_node);
        !           158: 
        !           159:   } while (next_entry);
        !           160: 
        !           161:        gbuf_freem(dat_m);
        !           162: }
        !           163: 
        !           164: /* */
        !           165: void AURPsndGZN(state, dat_m)
        !           166:        aurp_state_t *state;
        !           167:        gbuf_t *dat_m;
        !           168: {
        !           169:        short zname_len;
        !           170:        int msize;
        !           171:        gbuf_t *m;
        !           172:        aurp_hdr_t *hdrp;
        !           173: 
        !           174:        if (state->snd_state == AURPSTATE_Unconnected)
        !           175:                return;
        !           176: 
        !           177:        msize = sizeof(aurp_hdr_t);
        !           178:        if ((m = (gbuf_t *)gbuf_alloc(msize+AURP_MaxPktSize, PRI_MED)) == 0) {
        !           179:                dPrintf(D_M_AURP, D_L_WARNING, ("AURPsndGZN: node=%d, out of mblk\n",
        !           180:                        state->rem_node));
        !           181:                return;
        !           182:        }
        !           183:        gbuf_wset(m,msize);
        !           184: 
        !           185:        /* construct the GZN response packet */
        !           186:        hdrp = (aurp_hdr_t *)gbuf_rptr(m);
        !           187:        hdrp->connection_id = state->snd_connection_id;
        !           188:        hdrp->sequence_number = 0;
        !           189:        hdrp->command_code = AURPCMD_ZRsp;
        !           190:        hdrp->flags = 0;
        !           191:        *(short *)(gbuf_wptr(m)) = AURPSUBCODE_GetZoneNets;
        !           192:        gbuf_winc(m,sizeof(short));
        !           193:        zname_len = gbuf_len(dat_m);
        !           194:        bcopy(gbuf_rptr(dat_m), gbuf_wptr(m), zname_len);
        !           195:        gbuf_winc(m,zname_len);
        !           196:        *(short *)(gbuf_wptr(m)) = -1; /* number of tuples - proto not supported */
        !           197:        gbuf_winc(m,sizeof(short));
        !           198: 
        !           199:        /* send the packet */
        !           200:        dPrintf(D_M_AURP, D_L_INFO, ("AURPsndGZN: count=%d\n", -1));
        !           201:        AURPsend(m, AUD_AURP, state->rem_node);
        !           202: }
        !           203: 
        !           204: /* */
        !           205: void AURPsndGDZL(state, dat_m)
        !           206:        aurp_state_t *state;
        !           207:        gbuf_t *dat_m;
        !           208: {
        !           209:        int msize;
        !           210:        gbuf_t *m;
        !           211:        aurp_hdr_t *hdrp;
        !           212: 
        !           213:        if (state->snd_state == AURPSTATE_Unconnected)
        !           214:                return;
        !           215: 
        !           216:        msize = sizeof(aurp_hdr_t);
        !           217:        if ((m = (gbuf_t *)gbuf_alloc(msize+AURP_MaxPktSize, PRI_MED)) == 0) {
        !           218:                dPrintf(D_M_AURP, D_L_WARNING, ("AURPsndGDZL: node=%d, out of mblk\n",
        !           219:                        state->rem_node));
        !           220:                return;
        !           221:        }
        !           222:        gbuf_wset(m,msize);
        !           223: 
        !           224:        /* construct the GDZL response packet */
        !           225:        hdrp = (aurp_hdr_t *)gbuf_rptr(m);
        !           226:        hdrp->connection_id = state->snd_connection_id;
        !           227:        hdrp->sequence_number = 0;
        !           228:        hdrp->command_code = AURPCMD_ZRsp;
        !           229:        hdrp->flags = 0;
        !           230:        *(short *)(gbuf_wptr(m)) = AURPSUBCODE_GetDomainZoneList;
        !           231:        gbuf_winc(m,sizeof(short));
        !           232:        *(short *)(gbuf_wptr(m)) = -1; /* start index - proto not supported */
        !           233:        gbuf_winc(m,sizeof(short));
        !           234: 
        !           235:        /* send the packet */
        !           236:        dPrintf(D_M_AURP, D_L_INFO, ("AURPsndGDZL: index=%d\n", -1));
        !           237:        AURPsend(m, AUD_AURP, state->rem_node);
        !           238: }
        !           239: 
        !           240: /* */
        !           241: void AURPrcvZReq(state, m)
        !           242:        aurp_state_t *state;
        !           243:        gbuf_t *m;
        !           244: {
        !           245:        short sub_code;
        !           246:        aurp_hdr_t *hdrp = (aurp_hdr_t *)gbuf_rptr(m);
        !           247: 
        !           248:        /* make sure we're in a valid state to accept it */
        !           249:        if (state->snd_state == AURPSTATE_Unconnected) {
        !           250:                dPrintf(D_M_AURP, D_L_WARNING, ("AURPrcvZReq: unexpected response\n"));
        !           251:                gbuf_freem(m);
        !           252:                return;
        !           253:        }
        !           254: 
        !           255:        /* check for the correct connection id */
        !           256:        if (hdrp->connection_id != state->snd_connection_id) {
        !           257:                dPrintf(D_M_AURP, D_L_WARNING,
        !           258:                        ("AURPrcvZReq: invalid connection id, r=%d, m=%d\n",
        !           259:                        hdrp->connection_id, state->snd_connection_id));
        !           260:                gbuf_freem(m);
        !           261:                return;
        !           262:        }
        !           263: 
        !           264:        gbuf_rinc(m,sizeof(*hdrp));
        !           265:        sub_code = *(short *)gbuf_rptr(m);
        !           266:        gbuf_rinc(m,sizeof(short));
        !           267: 
        !           268:        dPrintf(D_M_AURP, D_L_INFO, ("AURPrcvZReq: len=%d\n", gbuf_len(m)));
        !           269: 
        !           270:        switch (sub_code) {
        !           271:        case AURPSUBCODE_ZoneInfo1:
        !           272:                AURPsndZRsp(state, m, 0);
        !           273:                return;
        !           274: 
        !           275:        case AURPSUBCODE_GetZoneNets:
        !           276:                AURPsndGZN(state, m);
        !           277:                break;
        !           278: 
        !           279:        case AURPSUBCODE_GetDomainZoneList:
        !           280:                AURPsndGDZL(state, m);
        !           281:                break;
        !           282:        }
        !           283: 
        !           284:        gbuf_freem(m);
        !           285: }
        !           286: 
        !           287: /* */
        !           288: void AURPrcvZRsp(state, m)
        !           289:        aurp_state_t *state;
        !           290:        gbuf_t *m;
        !           291: {
        !           292:        short sub_code, tuples_cnt;
        !           293:        aurp_hdr_t *hdrp = (aurp_hdr_t *)gbuf_rptr(m);
        !           294: 
        !           295:        /* make sure we're in a valid state to accept it */
        !           296:        if (state->rcv_state == AURPSTATE_Unconnected) {
        !           297:                dPrintf(D_M_AURP, D_L_WARNING, ("AURPrcvZRsp: unexpected response\n"));
        !           298:                gbuf_freem(m);
        !           299:                return;
        !           300:        }
        !           301: 
        !           302:        /* check for the correct connection id */
        !           303:        if (hdrp->connection_id != state->rcv_connection_id) {
        !           304:                dPrintf(D_M_AURP, D_L_WARNING,
        !           305:                        ("AURPrcvZRsp: invalid connection id, r=%d, m=%d\n",
        !           306:                        hdrp->connection_id, state->rcv_connection_id));
        !           307:                gbuf_freem(m);
        !           308:                return;
        !           309:        }
        !           310: 
        !           311:        gbuf_rinc(m,sizeof(*hdrp));
        !           312:        sub_code = *(short *)gbuf_rptr(m);
        !           313:        gbuf_rinc(m,sizeof(short));
        !           314: 
        !           315:        dPrintf(D_M_AURP, D_L_INFO, ("AURPrcvZRsp: len=%d\n", gbuf_len(m)));
        !           316: 
        !           317:        switch (sub_code) {
        !           318:        case AURPSUBCODE_ZoneInfo1:
        !           319:        case AURPSUBCODE_ZoneInfo2:
        !           320:                tuples_cnt = *(short *)gbuf_rptr(m);
        !           321:                gbuf_rinc(m,sizeof(short));
        !           322:                if (AURPsetzi(state->rem_node, m, sub_code, tuples_cnt)) {
        !           323:                        dPrintf(D_M_AURP, D_L_ERROR,
        !           324:                                ("AURPrcvZRsp: AURPsetzi() error\n"));
        !           325:                }
        !           326:                break;
        !           327: 
        !           328:        case AURPSUBCODE_GetZoneNets:
        !           329:                break;
        !           330: 
        !           331:        case AURPSUBCODE_GetDomainZoneList:
        !           332:                break;
        !           333:        }
        !           334: 
        !           335:        gbuf_freem(m);
        !           336: }
        !           337: 
        !           338: /* */
        !           339: int AURPgetzi(next_entry, buf, len, dat_m, flag)
        !           340:        int next_entry;
        !           341:        unsigned char *buf;
        !           342:        short *len;
        !           343:        gbuf_t *dat_m;
        !           344:        int flag;
        !           345: {
        !           346:        static int i_sav=ZT_BYTES-1, j_sav=0, idx_sav=-1;
        !           347:        unsigned char ev, zname_len, *zmap, *zname_base, *zname_sav, *tuples_ptr;
        !           348:        unsigned short net_num, *net, zname_offset;
        !           349:        short *sub_codep, *tuples_cntp, tuples_cnt, dat_len;
        !           350:        int i, j, idx, nets_cnt;
        !           351:        RT_entry *entry;
        !           352: 
        !           353:        sub_codep = (short *)buf;
        !           354:        buf += sizeof(short);
        !           355:        tuples_cntp = (short *)buf;
        !           356:        buf += sizeof(short);
        !           357:        *len = sizeof(short) + sizeof(short);
        !           358:        zname_base = buf + sizeof(short);
        !           359:        dat_len = 0;
        !           360: 
        !           361:        /* set the subcode in the ZI response packet */
        !           362:        *sub_codep = next_entry ? AURPSUBCODE_ZoneInfo2 : AURPSUBCODE_ZoneInfo1;
        !           363: 
        !           364:        switch (flag) {
        !           365:        case 0: /* zone info in response to ZI request */
        !           366:                net = (unsigned short *)gbuf_rptr(dat_m);
        !           367:                nets_cnt = (gbuf_len(dat_m))/2;
        !           368:                break;
        !           369:        case 1: /* zone info in response to Ack of RI response */
        !           370:                tuples_ptr = gbuf_rptr(dat_m);
        !           371:                nets_cnt = (gbuf_len(dat_m))/3;
        !           372:                next_entry = 0;
        !           373:                break;
        !           374:        case 2: /* zone info in response to Ack of RI update */
        !           375:                tuples_ptr = gbuf_rptr(dat_m);
        !           376:                nets_cnt = (gbuf_len(dat_m))/4;
        !           377:                next_entry = 0;
        !           378:                break;
        !           379:        }
        !           380: 
        !           381:        /*
        !           382:         * for each network, find all the zones that it belongs to
        !           383:         */
        !           384:        for (tuples_cnt=0; next_entry < nets_cnt; next_entry++) {
        !           385:                switch(flag) {
        !           386:                case 0:
        !           387:                        net_num = net[next_entry];
        !           388:                        break;
        !           389:                case 1:
        !           390:                        net_num = *(unsigned short *)tuples_ptr; 
        !           391:                        tuples_ptr += 3;
        !           392:                        gbuf_rinc(dat_m,3);
        !           393:                        if (tuples_ptr[-1] & 0x80) {
        !           394:                                tuples_ptr += 3;
        !           395:                                gbuf_rinc(dat_m,3);
        !           396:                                next_entry++;
        !           397:                        }
        !           398:                        break;
        !           399:                case 2:
        !           400:                        if (gbuf_len(dat_m) <= 0) {
        !           401:                                next_entry = nets_cnt;
        !           402:                                goto l_done;
        !           403:                        }
        !           404:                        ev = *tuples_ptr++;
        !           405:                        net_num = *(unsigned short *)tuples_ptr; 
        !           406:                        tuples_ptr += 3;
        !           407:                        gbuf_rinc(dat_m,4);
        !           408:                        if (tuples_ptr[-1] & 0x80) {
        !           409:                                tuples_ptr += 2;
        !           410:                                gbuf_rinc(dat_m,2);
        !           411:                        }
        !           412:                        if (ev != AURPEV_NetAdded)
        !           413:                                continue;
        !           414:                        break;
        !           415:                }
        !           416: 
        !           417:                /*
        !           418:                 * find the RT entry associated with the network
        !           419:                 */
        !           420:                if ((entry = RT_lookup(net_num)) == 0) {
        !           421:                        dPrintf(D_M_AURP, D_L_WARNING, ("AURPgetzi: invalid net, %d\n",
        !           422:                                net_num));
        !           423:                        continue;
        !           424:                }
        !           425:                if ( ((entry->EntryState & 0x0F) < RTE_STATE_SUSPECT) ||
        !           426:                                !RT_ALL_ZONES_KNOWN(entry) ||
        !           427:                                (entry->AURPFlag & AURP_NetHiden) ) {
        !           428:                        dPrintf(D_M_AURP_LOW, D_L_INFO, ("AURPgetzi: zombie net, net=%d\n",
        !           429:                                net_num));
        !           430:                        continue;
        !           431:                }
        !           432: 
        !           433:          if (entry->NetStart == 0) {
        !           434:                if ((idx = ZT_get_zindex(entry->ZoneBitMap)) == 0)
        !           435:                        continue;
        !           436:                idx--; /* index in the zone table */
        !           437:                zname_len = ZT_table[idx].Zone.len;
        !           438:                if (zname_len) {
        !           439:                        *(unsigned short *)buf = net_num;
        !           440:                        buf += sizeof(short);
        !           441:                  if (idx == idx_sav) {
        !           442:                        /* use the optimized format */
        !           443:                        zname_offset = zname_sav - zname_base;
        !           444:                        *(unsigned short *)buf = (0x8000 | zname_offset);
        !           445:                        buf += sizeof(short);
        !           446:                        dat_len += 4;
        !           447:                  } else {
        !           448:                        /* use the long format */
        !           449:                        zname_sav = buf; 
        !           450:                        *buf++ = zname_len;
        !           451:                        bcopy(ZT_table[idx].Zone.str, buf, zname_len);
        !           452:                        buf += zname_len;
        !           453:                        dat_len += (3 + zname_len);
        !           454:                  }
        !           455:                        tuples_cnt++;
        !           456:                        idx_sav = idx;
        !           457:                }
        !           458: 
        !           459:          } else {
        !           460:                zmap = entry->ZoneBitMap;
        !           461:                for (i=i_sav; i >=0; i--) {
        !           462:                        if (!zmap[i])
        !           463:                                continue;
        !           464: 
        !           465:                        for (j=j_sav; j < 8; j++) {
        !           466:                                if (!((zmap[i] << j) & 0x80))
        !           467:                                        continue;
        !           468: 
        !           469:                                idx = i*8 + j; /* index in the zone table */
        !           470:                                zname_len = ZT_table[idx].Zone.len;
        !           471:                                if (zname_len) {
        !           472:                                        if ((dat_len+3+zname_len) > AURP_MaxPktSize) {
        !           473:                                                i_sav = i;
        !           474:                                                j_sav = j;
        !           475:                                                goto l_done;
        !           476:                                        }
        !           477: 
        !           478:                                        *(unsigned short *)buf = net_num;
        !           479:                                        buf += sizeof(short);
        !           480:                                  if (idx == idx_sav) {
        !           481:                                        /* use the optimized format */
        !           482:                                        zname_offset = zname_sav - zname_base;
        !           483:                                        *(unsigned short *)buf = (0x8000 | zname_offset);
        !           484:                                        buf += sizeof(short);
        !           485:                                        dat_len += 4;
        !           486:                                  } else {
        !           487:                                        /* use the long format */
        !           488:                                        zname_sav = buf; 
        !           489:                                        *buf++ = zname_len;
        !           490:                                        bcopy(ZT_table[idx].Zone.str, buf, zname_len);
        !           491:                                        buf += zname_len;
        !           492:                                        dat_len += (3 + zname_len);
        !           493:                                  }
        !           494:                                        tuples_cnt++;
        !           495:                                        idx_sav = idx;
        !           496:                                }
        !           497:                        }
        !           498:                }
        !           499:          }
        !           500:                if ((dat_len+3+32) > AURP_MaxPktSize) {
        !           501:                        next_entry++;
        !           502:                        break;
        !           503:                }
        !           504:        }
        !           505:        i_sav = ZT_BYTES-1;
        !           506:        j_sav = 0;
        !           507: 
        !           508: l_done:
        !           509:        *len += dat_len;
        !           510:        if (next_entry == nets_cnt)
        !           511:                next_entry = 0;
        !           512: 
        !           513:        /* set the subcode in the ZI response packet */
        !           514:        if (next_entry)
        !           515:                *sub_codep = AURPSUBCODE_ZoneInfo2;
        !           516: 
        !           517:        /* set the tuples count in the ZI response packet */
        !           518:        *tuples_cntp = tuples_cnt;
        !           519: 
        !           520:        idx_sav = -1;
        !           521:        return next_entry;
        !           522: }
        !           523: 
        !           524: /* */
        !           525: int AURPsetzi(node, m, sub_code, tuples_cnt)
        !           526:        unsigned char node;
        !           527:        gbuf_t *m;
        !           528:        short sub_code;
        !           529:        short tuples_cnt;
        !           530: {
        !           531:        int rc, tuple_fmt;
        !           532:        unsigned short net_num, zname_offset;
        !           533:        unsigned char *buf = gbuf_rptr(m), *zname_base;
        !           534:        RT_entry *entry;
        !           535:        at_nvestr_t *zname;
        !           536: 
        !           537:        /* compute the base of the zone names of the optimized tuples */
        !           538:        zname_base = buf + sizeof(short);
        !           539: 
        !           540:        /* process all tuples */
        !           541:        while (tuples_cnt-- > 0) {
        !           542:                net_num = *(unsigned short *)buf;
        !           543:                buf += sizeof(short);
        !           544:                if (*buf & 0x80) {
        !           545:                        /* optimized-format tuple */
        !           546:                        zname_offset = (*(unsigned short *)buf) & 0x7fff;
        !           547:                        buf += sizeof(short);
        !           548:                        zname = (at_nvestr_t *)(zname_base + zname_offset);
        !           549:                        tuple_fmt = 0;
        !           550:                        dPrintf(D_M_AURP_LOW, D_L_INFO,
        !           551:                                ("AURPsetzi: optimized fmt, net=%d. zlen=%d, zoffset=%d\n ",
        !           552:                                        net_num, zname->len, zname_offset));
        !           553:                } else {
        !           554:                        /* long-format tuple */
        !           555:                        zname = (at_nvestr_t *)buf;
        !           556:                        tuple_fmt = 1;
        !           557:                        dPrintf(D_M_AURP_LOW, D_L_INFO,
        !           558:                                ("AURPsetzi: long fmt, net=%d, zlen=%d\n ",
        !           559:                                        net_num, zname->len));
        !           560:                }
        !           561: 
        !           562:                /*
        !           563:                 * find the RT entry associated with the specified network
        !           564:                 */
        !           565:                if ((entry = RT_lookup(net_num)) == 0) {
        !           566:                        dPrintf(D_M_AURP, D_L_WARNING,
        !           567:                                ("AURPsetzi: invalid net, net=%d\n", net_num));
        !           568:                } else { /* entry found */
        !           569:                        if (entry->EntryState >= RTE_STATE_SUSPECT)  {
        !           570:                                if ((rc = ZT_add_zname(zname)) == ZT_MAXEDOUT) {
        !           571:                                        dPrintf(D_M_AURP, D_L_WARNING,
        !           572:                                                ("AURPsetzi: ZT_table full\n"));
        !           573:                                } else {
        !           574:                                        ZT_set_zmap(rc, entry->ZoneBitMap);
        !           575:                                        RT_SET_ZONE_KNOWN(entry);
        !           576:                                }
        !           577:                        }
        !           578:                }
        !           579:                if (tuple_fmt)
        !           580:                        buf += zname->len+1;
        !           581:        }
        !           582: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.