Annotation of embedaddon/libnet/src/libnet_build_ospf.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  *  $Id: libnet_build_ospf.c,v 1.10 2004/03/01 20:26:12 mike Exp $
                      3:  *
                      4:  *  libnet
                      5:  *  libnet_build_ospf.c - OSPF packet assembler
                      6:  *
                      7:  *  Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
                      8:  *  All rights reserved.
                      9:  *
                     10:  *  Copyright (c) 1999, 2000 Andrew Reiter <areiter@bindview.com>
                     11:  *  Bindview Development
                     12:  *
                     13:  * Redistribution and use in source and binary forms, with or without
                     14:  * modification, are permitted provided that the following conditions
                     15:  * are met:
                     16:  * 1. Redistributions of source code must retain the above copyright
                     17:  *    notice, this list of conditions and the following disclaimer.
                     18:  * 2. Redistributions in binary form must reproduce the above copyright
                     19:  *    notice, this list of conditions and the following disclaimer in the
                     20:  *    documentation and/or other materials provided with the distribution.
                     21:  *
                     22:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
                     23:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     24:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     25:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
                     26:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     27:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     28:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     29:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     30:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     31:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     32:  * SUCH DAMAGE.
                     33:  *
                     34:  */
                     35: 
                     36: #if (HAVE_CONFIG_H)
                     37: #include "../include/config.h"
                     38: #endif
                     39: #if (!(_WIN32) || (__CYGWIN__)) 
                     40: #include "../include/libnet.h"
                     41: #else
                     42: #include "../include/win32/libnet.h"
                     43: #endif
                     44: 
                     45: libnet_ptag_t
                     46: libnet_build_ospfv2(u_int16_t len, u_int8_t type, u_int32_t rtr_id, 
                     47: u_int32_t area_id, u_int16_t sum, u_int16_t autype, u_int8_t *payload, 
                     48: u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
                     49: {
                     50:     u_int32_t n, h;
                     51:     libnet_pblock_t *p;
                     52:     struct libnet_ospf_hdr ospf_hdr;
                     53: 
                     54:     if (l == NULL)
                     55:     { 
                     56:         return (-1);
                     57:     } 
                     58:  
                     59:     n = LIBNET_OSPF_H + payload_s;
                     60:     h = LIBNET_OSPF_H + payload_s + len;
                     61: 
                     62:     /*
                     63:      *  Find the existing protocol block if a ptag is specified, or create
                     64:      *  a new one.
                     65:      */
                     66:     p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_OSPF_H);
                     67:     if (p == NULL)
                     68:     {
                     69:         return (-1);
                     70:     }
                     71:     
                     72:     memset(&ospf_hdr, 0, sizeof(ospf_hdr));
                     73:     ospf_hdr.ospf_v               = 2;              /* OSPF version 2 */
                     74:     ospf_hdr.ospf_type            = type;           /* Type of pkt */
                     75:     ospf_hdr.ospf_len             = htons(h);       /* Pkt len */
                     76:     ospf_hdr.ospf_rtr_id.s_addr   = htonl(rtr_id);  /* Router ID */
                     77:     ospf_hdr.ospf_area_id.s_addr  = htonl(area_id); /* Area ID */
                     78:     ospf_hdr.ospf_sum             = (sum ? htons(sum) : 0);
                     79:     ospf_hdr.ospf_auth_type       = htons(autype);  /* Type of auth */
                     80: 
                     81:     n = libnet_pblock_append(l, p, (u_int8_t *)&ospf_hdr, LIBNET_OSPF_H);
                     82:     if (n == -1)
                     83:     {
                     84:         goto bad;
                     85:     }
                     86: 
                     87:     if ((payload && !payload_s) || (!payload && payload_s))
                     88:     {
                     89:          snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
                     90:                             "%s(): payload inconsistency\n", __func__);
                     91:         goto bad;
                     92:     }
                     93:  
                     94:     if (payload && payload_s)
                     95:     {
                     96:         n = libnet_pblock_append(l, p, payload, payload_s);
                     97:         if (n == -1)
                     98:         {
                     99:             goto bad;
                    100:         }
                    101:     }
                    102: 
                    103:     if (sum == 0)
                    104:     {
                    105:         /*
                    106:          *  If checksum is zero, by default libnet will compute a checksum
                    107:          *  for the user.  The programmer can override this by calling
                    108:          *  libnet_toggle_checksum(l, ptag, 1);
                    109:          */
                    110:         libnet_pblock_setflags(p, LIBNET_PBLOCK_DO_CHECKSUM);
                    111:     }
                    112:     return (ptag ? ptag : libnet_pblock_update(l, p, h, LIBNET_PBLOCK_OSPF_H));
                    113: bad:
                    114:     libnet_pblock_delete(l, p);
                    115:     return (-1);
                    116: }
                    117: 
                    118: 
                    119: libnet_ptag_t
                    120: libnet_build_ospfv2_hello(u_int32_t netmask, u_int16_t interval, u_int8_t opts, 
                    121: u_int8_t priority, u_int32_t dead_int, u_int32_t des_rtr, u_int32_t bkup_rtr,
                    122: u_int32_t neighbor, u_int8_t *payload, u_int32_t payload_s, libnet_t *l,
                    123: libnet_ptag_t ptag)
                    124: {
                    125:     u_int32_t n, h;
                    126:     libnet_pblock_t *p;
                    127:     struct libnet_ospf_hello_hdr hello_hdr;
                    128: 
                    129:     if (l == NULL)
                    130:     { 
                    131:         return (-1);
                    132:     } 
                    133: 
                    134:     n = LIBNET_OSPF_HELLO_H + payload_s;
                    135:     h = 0;
                    136: 
                    137:     /*
                    138:      *  Find the existing protocol block if a ptag is specified, or create
                    139:      *  a new one.
                    140:      */
                    141:     p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_OSPF_HELLO_H);
                    142:     if (p == NULL)
                    143:     {
                    144:         return (-1);
                    145:     }
                    146:     
                    147:     memset(&hello_hdr, 0, sizeof(hello_hdr));
                    148:     hello_hdr.hello_nmask.s_addr    = htonl(netmask);  /* Netmask */
                    149:     hello_hdr.hello_intrvl          = htons(interval); /* # seconds since last packet sent */
                    150:     hello_hdr.hello_opts            = opts;     /* OSPF_* options */
                    151:     hello_hdr.hello_rtr_pri         = priority; /* If 0, can't be backup */
                    152:     hello_hdr.hello_dead_intvl      = htonl(dead_int); /* Time til router is deemed down */
                    153:     hello_hdr.hello_des_rtr.s_addr  = htonl(des_rtr);  /* Networks designated router */
                    154:     hello_hdr.hello_bkup_rtr.s_addr = htonl(bkup_rtr); /* Networks backup router */
                    155:     hello_hdr.hello_nbr.s_addr      = htonl(neighbor);
                    156: 
                    157:     n = libnet_pblock_append(l, p, (u_int8_t *)&hello_hdr, LIBNET_OSPF_HELLO_H);
                    158:     if (n == -1)
                    159:     {
                    160:         goto bad;
                    161:     }
                    162: 
                    163:     if ((payload && !payload_s) || (!payload && payload_s))
                    164:     {
                    165:          snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
                    166:                             "%s(): payload inconsistency\n", __func__);
                    167:         goto bad;
                    168:     }
                    169:  
                    170:     if (payload && payload_s)
                    171:     {
                    172:         n = libnet_pblock_append(l, p, payload, payload_s);
                    173:         if (n == -1)
                    174:         {
                    175:             goto bad;
                    176:         }
                    177:     }
                    178:  
                    179:     return (ptag ? ptag : libnet_pblock_update(l, p, h, 
                    180:             LIBNET_PBLOCK_OSPF_HELLO_H));
                    181: bad:
                    182:     libnet_pblock_delete(l, p);
                    183:     return (-1);
                    184: }
                    185: 
                    186: 
                    187: libnet_ptag_t
                    188: libnet_build_ospfv2_dbd(u_int16_t dgram_len, u_int8_t opts, u_int8_t type,
                    189: u_int32_t seqnum, u_int8_t *payload, u_int32_t payload_s, libnet_t *l,
                    190: libnet_ptag_t ptag)
                    191: {
                    192:     u_int32_t n, h;
                    193:     libnet_pblock_t *p;
                    194:     struct libnet_dbd_hdr dbd_hdr;
                    195: 
                    196:     if (l == NULL)
                    197:     { 
                    198:         return (-1);
                    199:     } 
                    200: 
                    201:     n = LIBNET_OSPF_DBD_H + payload_s;
                    202:     h = 0;
                    203: 
                    204:     /*
                    205:      *  Find the existing protocol block if a ptag is specified, or create
                    206:      *  a new one.
                    207:      */
                    208:     p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_OSPF_DBD_H);
                    209:     if (p == NULL)
                    210:     {
                    211:         return (-1);
                    212:     }
                    213:     
                    214:     memset(&dbd_hdr, 0, sizeof(dbd_hdr));
                    215:     dbd_hdr.dbd_mtu_len        = htons(dgram_len); /* Max length of IP packet IF can use */
                    216:     dbd_hdr.dbd_opts    = opts;                    /* OSPF_* options */
                    217:     dbd_hdr.dbd_type    = type;                    /* Type of exchange occuring */
                    218:     dbd_hdr.dbd_seq     = htonl(seqnum);    /* DBD sequence number */
                    219: 
                    220:     n = libnet_pblock_append(l, p, (u_int8_t *)&dbd_hdr, LIBNET_OSPF_DBD_H);
                    221:     if (n == -1)
                    222:     {
                    223:         goto bad;
                    224:     }
                    225: 
                    226:     if ((payload && !payload_s) || (!payload && payload_s))
                    227:     {
                    228:          snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
                    229:                             "%s(): payload inconsistency\n", __func__);
                    230:         goto bad;
                    231:     }
                    232:  
                    233:     if (payload && payload_s)
                    234:     {
                    235:         n = libnet_pblock_append(l, p, payload, payload_s);
                    236:         if (n == -1)
                    237:         {
                    238:             goto bad; 
                    239:         }
                    240:     }
                    241: 
                    242:     return (ptag ? ptag : libnet_pblock_update(l, p, h, 
                    243:             LIBNET_PBLOCK_OSPF_DBD_H));
                    244: bad:
                    245:     libnet_pblock_delete(l, p);
                    246:     return (-1);
                    247: }
                    248: 
                    249: 
                    250: libnet_ptag_t
                    251: libnet_build_ospfv2_lsr(u_int32_t type, u_int lsid, u_int32_t advrtr, 
                    252: u_int8_t *payload, u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
                    253: {
                    254:     u_int32_t n, h;
                    255:     libnet_pblock_t *p;
                    256:     struct libnet_lsr_hdr lsr_hdr;
                    257: 
                    258:     if (l == NULL)
                    259:     { 
                    260:         return (-1);
                    261:     } 
                    262: 
                    263:     n = LIBNET_OSPF_LSR_H + payload_s;
                    264:     h = 0;
                    265: 
                    266:     /*
                    267:      *  Find the existing protocol block if a ptag is specified, or create
                    268:      *  a new one.
                    269:      */
                    270:     p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_OSPF_LSR_H);
                    271:     if (p == NULL)
                    272:     {
                    273:         return (-1);
                    274:     }
                    275: 
                    276:     memset(&lsr_hdr, 0, sizeof(lsr_hdr));
                    277:     lsr_hdr.lsr_type         = htonl(type);     /* Type of LS being requested */
                    278:     lsr_hdr.lsr_lsid        = htonl(lsid);     /* Link State ID */
                    279:     lsr_hdr.lsr_adrtr.s_addr = htonl(advrtr);   /* Advertising router */
                    280: 
                    281:     n = libnet_pblock_append(l, p, (u_int8_t *)&lsr_hdr, LIBNET_OSPF_LSR_H);
                    282:     if (n == -1)
                    283:     {
                    284:         goto bad;
                    285:     }
                    286: 
                    287:     if ((payload && !payload_s) || (!payload && payload_s))
                    288:     {
                    289:          snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
                    290:                             "%s(): payload inconsistency\n", __func__);
                    291:         goto bad;
                    292:     }
                    293:  
                    294:     if (payload && payload_s)
                    295:     {
                    296:         n = libnet_pblock_append(l, p, payload, payload_s);
                    297:         if (n == -1)
                    298:         {
                    299:             goto bad;
                    300:         }
                    301:     }
                    302: 
                    303:     return (ptag ? ptag : libnet_pblock_update(l, p, h, 
                    304:             LIBNET_PBLOCK_OSPF_LSR_H));
                    305: bad:
                    306:     libnet_pblock_delete(l, p);
                    307:     return (-1);
                    308: }
                    309: 
                    310: 
                    311: libnet_ptag_t
                    312: libnet_build_ospfv2_lsu(u_int32_t num, u_int8_t *payload, u_int32_t payload_s,
                    313: libnet_t *l, libnet_ptag_t ptag)
                    314: {
                    315:     u_int32_t n, h;
                    316:     libnet_pblock_t *p;
                    317:     struct libnet_lsu_hdr lh_hdr;
                    318: 
                    319:     if (l == NULL)
                    320:     { 
                    321:         return (-1);
                    322:     } 
                    323: 
                    324:     n = LIBNET_OSPF_LSU_H + payload_s;
                    325:     h = 0;
                    326: 
                    327:     /*
                    328:      *  Find the existing protocol block if a ptag is specified, or create
                    329:      *  a new one.
                    330:      */
                    331:     p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_OSPF_LSU_H);
                    332:     if (p == NULL)
                    333:     {
                    334:         return (-1);
                    335:     }
                    336: 
                    337:     memset(&lh_hdr, 0, sizeof(lh_hdr));
                    338:     lh_hdr.lsu_num = htonl(num);   /* Number of LSAs that will be bcasted */
                    339: 
                    340:     n = libnet_pblock_append(l, p, (u_int8_t *)&lh_hdr, LIBNET_OSPF_LSU_H);
                    341:     if (n == -1)
                    342:     {
                    343:         goto bad;
                    344:     }
                    345: 
                    346:     if ((payload && !payload_s) || (!payload && payload_s))
                    347:     {
                    348:          snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
                    349:                  "%s(): payload inconsistency\n", __func__);
                    350:         goto bad;
                    351:     }
                    352:  
                    353:     if (payload && payload_s)
                    354:     {
                    355:         n = libnet_pblock_append(l, p, payload, payload_s);
                    356:         if (n == -1)
                    357:         {
                    358:             goto bad;
                    359:         }
                    360:     }
                    361: 
                    362:     return (ptag ? ptag : libnet_pblock_update(l, p, h, 
                    363:             LIBNET_PBLOCK_OSPF_LSU_H));
                    364: bad:
                    365:     libnet_pblock_delete(l, p);
                    366:     return (-1);
                    367: }
                    368: 
                    369: 
                    370: libnet_ptag_t
                    371: libnet_build_ospfv2_lsa(u_int16_t age, u_int8_t opts, u_int8_t type, u_int lsid,
                    372: u_int32_t advrtr, u_int32_t seqnum, u_int16_t sum, u_int16_t len,
                    373: u_int8_t *payload, u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
                    374: {
                    375:     u_int32_t n, h;
                    376:     libnet_pblock_t *p;
                    377:     struct libnet_lsa_hdr lsa_hdr;
                    378: 
                    379:     if (l == NULL)
                    380:     { 
                    381:         return (-1);
                    382:     } 
                    383: 
                    384:     n = LIBNET_OSPF_LSA_H + payload_s;
                    385:     h = len + payload_s;
                    386: 
                    387:     /*
                    388:      *  Find the existing protocol block if a ptag is specified, or create
                    389:      *  a new one.
                    390:      */
                    391:     p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_OSPF_LSA_H);
                    392:     if (p == NULL)
                    393:     {
                    394:         return (-1);
                    395:     }
                    396: 
                    397:     memset(&lsa_hdr, 0, sizeof(lsa_hdr));
                    398:     lsa_hdr.lsa_age         = htons(age);
                    399:     lsa_hdr.lsa_opts        = opts;
                    400:     lsa_hdr.lsa_type        = type;
                    401:     lsa_hdr.lsa_id          = htonl(lsid);
                    402:     lsa_hdr.lsa_adv.s_addr  = htonl(advrtr);
                    403:     lsa_hdr.lsa_seq         = htonl(seqnum);
                    404:     lsa_hdr.lsa_sum         = (sum ? htons(sum) : 0);
                    405:     lsa_hdr.lsa_len         = htons(h);
                    406: 
                    407:     n = libnet_pblock_append(l, p, (u_int8_t *)&lsa_hdr, LIBNET_OSPF_LSA_H);
                    408:     if (n == -1)
                    409:     {
                    410:         goto bad;
                    411:     }
                    412: 
                    413:     if ((payload && !payload_s) || (!payload && payload_s))
                    414:     {
                    415:          snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
                    416:                             "%s(): payload inconsistency\n", __func__);
                    417:         goto bad;
                    418:     }
                    419:  
                    420:     if (payload && payload_s)
                    421:     {
                    422:         n = libnet_pblock_append(l, p, payload, payload_s);
                    423:         if (n == -1)
                    424:         {
                    425:             goto bad;
                    426:         }
                    427:     }
                    428: 
                    429:     if (sum == 0)
                    430:     {
                    431:         /*
                    432:          *  If checksum is zero, by default libnet will compute a checksum
                    433:          *  for the user.  The programmer can override this by calling
                    434:          *  libnet_toggle_checksum(l, ptag, 1);
                    435:          */
                    436:         libnet_pblock_setflags(p, LIBNET_PBLOCK_DO_CHECKSUM);
                    437:     }
                    438:     return (ptag ? ptag : libnet_pblock_update(l, p, h, 
                    439:             LIBNET_PBLOCK_OSPF_LSA_H));
                    440: bad:
                    441:     libnet_pblock_delete(l, p);
                    442:     return (-1);
                    443: }
                    444: 
                    445: 
                    446: libnet_ptag_t
                    447: libnet_build_ospfv2_lsa_rtr(u_int16_t flags, u_int16_t num, u_int32_t id,
                    448: u_int32_t data, u_int8_t type, u_int8_t tos, u_int16_t metric,
                    449: u_int8_t *payload, u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
                    450: {
                    451:     u_int32_t n, h;
                    452:     libnet_pblock_t *p;
                    453:     struct libnet_rtr_lsa_hdr rtr_lsa_hdr;
                    454: 
                    455:     if (l == NULL)
                    456:     { 
                    457:         return (-1);
                    458:     } 
                    459: 
                    460:     n = LIBNET_OSPF_LS_RTR_H + payload_s;
                    461:     h = 0;
                    462: 
                    463:     /*
                    464:      *  Find the existing protocol block if a ptag is specified, or create
                    465:      *  a new one.
                    466:      */
                    467:     p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_LS_RTR_H);
                    468:     if (p == NULL)
                    469:     {
                    470:         return (-1);
                    471:     }
                    472: 
                    473:     memset(&rtr_lsa_hdr, 0, sizeof(rtr_lsa_hdr));
                    474:     rtr_lsa_hdr.rtr_flags       = htons(flags);
                    475:     rtr_lsa_hdr.rtr_num         = htons(num);
                    476:     rtr_lsa_hdr.rtr_link_id     = htonl(id);
                    477:     rtr_lsa_hdr.rtr_link_data   = htonl(data);
                    478:     rtr_lsa_hdr.rtr_type        = type;
                    479:     rtr_lsa_hdr.rtr_tos_num     = tos;
                    480:     rtr_lsa_hdr.rtr_metric      = htons(metric);
                    481: 
                    482:     n = libnet_pblock_append(l, p, (u_int8_t *)&rtr_lsa_hdr,
                    483:             LIBNET_OSPF_LS_RTR_H);
                    484:     if (n == -1)
                    485:     {
                    486:         goto bad;
                    487:     }
                    488: 
                    489:     if ((payload && !payload_s) || (!payload && payload_s))
                    490:     {
                    491:         snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
                    492:                 "%s(): payload inconsistency\n", __func__);
                    493:         goto bad;
                    494:     }
                    495:  
                    496:     if (payload && payload_s)
                    497:     {
                    498:         n = libnet_pblock_append(l, p, payload, payload_s);
                    499:         if (n == -1)
                    500:         {
                    501:             goto bad;
                    502:         }
                    503:     }
                    504: 
                    505:     return (ptag ? ptag : libnet_pblock_update(l, p, h, 
                    506:             LIBNET_PBLOCK_LS_RTR_H));
                    507: bad:
                    508:     libnet_pblock_delete(l, p);
                    509:     return (-1);
                    510: }
                    511: 
                    512: 
                    513: libnet_ptag_t
                    514: libnet_build_ospfv2_lsa_net(u_int32_t nmask, u_int32_t rtrid,
                    515: u_int8_t *payload, u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
                    516: {
                    517:     u_int32_t n, h;
                    518:     libnet_pblock_t *p;
                    519:     struct libnet_net_lsa_hdr net_lsa_hdr;
                    520: 
                    521:     if (l == NULL)
                    522:     { 
                    523:         return (-1);
                    524:     } 
                    525: 
                    526:     n = LIBNET_OSPF_LS_NET_H + payload_s;
                    527:     h = 0;
                    528: 
                    529:     /*
                    530:      *  Find the existing protocol block if a ptag is specified, or create
                    531:      *  a new one.
                    532:      */
                    533:     p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_LS_NET_H);
                    534:     if (p == NULL)
                    535:     {
                    536:         return (-1);
                    537:     }
                    538: 
                    539:     memset(&net_lsa_hdr, 0, sizeof(net_lsa_hdr));
                    540:     net_lsa_hdr.net_nmask.s_addr    = htonl(nmask);
                    541:     net_lsa_hdr.net_rtr_id          = htonl(rtrid);
                    542: 
                    543:     n = libnet_pblock_append(l, p, (u_int8_t *)&net_lsa_hdr,
                    544:             LIBNET_OSPF_LS_NET_H);
                    545:     if (n == -1)
                    546:     {
                    547:         goto bad;
                    548:     }
                    549: 
                    550:     if ((payload && !payload_s) || (!payload && payload_s))
                    551:     {
                    552:          snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
                    553:                             "%s(): payload inconsistency\n", __func__);
                    554:         goto bad;
                    555:     }
                    556:  
                    557:     if (payload && payload_s)
                    558:     {
                    559:         n = libnet_pblock_append(l, p, payload, payload_s);
                    560:         if (n == -1)
                    561:         {
                    562:             goto bad;
                    563:         }
                    564:     }
                    565: 
                    566:     return (ptag ? ptag : libnet_pblock_update(l, p, h, 
                    567:             LIBNET_PBLOCK_LS_NET_H));
                    568: bad:
                    569:     libnet_pblock_delete(l, p);
                    570:     return (-1);
                    571: }
                    572: 
                    573: 
                    574: libnet_ptag_t
                    575: libnet_build_ospfv2_lsa_sum(u_int32_t nmask, u_int32_t metric, u_int tos, 
                    576: u_int8_t *payload, u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
                    577: {
                    578:     u_int32_t n, h;
                    579:     libnet_pblock_t *p;
                    580:     struct libnet_sum_lsa_hdr sum_lsa_hdr;
                    581: 
                    582:     if (l == NULL)
                    583:     { 
                    584:         return (-1);
                    585:     } 
                    586: 
                    587:     n = LIBNET_OSPF_LS_SUM_H + payload_s;
                    588:     h = 0;
                    589: 
                    590:     /*
                    591:      *  Find the existing protocol block if a ptag is specified, or create
                    592:      *  a new one.
                    593:      */
                    594:     p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_LS_SUM_H);
                    595:     if (p == NULL)
                    596:     {
                    597:         return (-1);
                    598:     }
                    599: 
                    600:     memset(&sum_lsa_hdr, 0, sizeof(sum_lsa_hdr));
                    601:     sum_lsa_hdr.sum_nmask.s_addr    = htonl(nmask);
                    602:     sum_lsa_hdr.sum_metric          = htonl(metric);
                    603:     sum_lsa_hdr.sum_tos_metric      = htonl(tos);
                    604: 
                    605:     n = libnet_pblock_append(l, p, (u_int8_t *)&sum_lsa_hdr,
                    606:             LIBNET_OSPF_LS_SUM_H);
                    607:     if (n == -1)
                    608:     {
                    609:         goto bad;
                    610:     }
                    611: 
                    612:     if ((payload && !payload_s) || (!payload && payload_s))
                    613:     {
                    614:         snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
                    615:                 "%s(): payload inconsistency\n", __func__);
                    616:         goto bad;
                    617:     }
                    618:  
                    619:     if (payload && payload_s)
                    620:     {
                    621:         n = libnet_pblock_append(l, p, payload, payload_s);
                    622:         if (n == -1)
                    623:         {
                    624:            goto bad;
                    625:         }
                    626:     }
                    627: 
                    628:     return (ptag ? ptag : libnet_pblock_update(l, p, h, 
                    629:             LIBNET_PBLOCK_LS_SUM_H));
                    630: bad:
                    631:     libnet_pblock_delete(l, p);
                    632:     return (-1);
                    633: }
                    634: 
                    635: 
                    636: libnet_ptag_t
                    637: libnet_build_ospfv2_lsa_as(u_int32_t nmask, u_int metric, u_int32_t fwdaddr,
                    638: u_int32_t tag, u_int8_t *payload, u_int32_t payload_s, libnet_t *l,
                    639: libnet_ptag_t ptag)
                    640: {
                    641:     u_int32_t n, h;
                    642:     libnet_pblock_t *p;
                    643:     struct libnet_as_lsa_hdr as_lsa_hdr;
                    644: 
                    645:     if (l == NULL)
                    646:     { 
                    647:         return (-1);
                    648:     } 
                    649:    
                    650:     n = LIBNET_OSPF_LS_AS_EXT_H + payload_s;
                    651:     h = 0;
                    652: 
                    653:     /*
                    654:      *  Find the existing protocol block if a ptag is specified, or create
                    655:      *  a new one.
                    656:      */
                    657:     p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_LS_AS_EXT_H);
                    658:     if (p == NULL)
                    659:     {
                    660:         return (-1);
                    661:     }
                    662: 
                    663:     memset(&as_lsa_hdr, 0, sizeof(as_lsa_hdr));
                    664:     as_lsa_hdr.as_nmask.s_addr      = htonl(nmask);
                    665:     as_lsa_hdr.as_metric            = htonl(metric);
                    666:     as_lsa_hdr.as_fwd_addr.s_addr   = htonl(fwdaddr);
                    667:     as_lsa_hdr.as_rte_tag           = htonl(tag);
                    668: 
                    669:     n = libnet_pblock_append(l, p, (u_int8_t *)&as_lsa_hdr,
                    670:             LIBNET_OSPF_LS_AS_EXT_H);
                    671:     if (n == -1)
                    672:     {
                    673:         goto bad;
                    674:     }
                    675: 
                    676:     if ((payload && !payload_s) || (!payload && payload_s))
                    677:     {
                    678:         snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
                    679:                 "%s(): payload inconsistency\n", __func__);
                    680:         goto bad;
                    681:     }
                    682:  
                    683:     if (payload && payload_s)
                    684:     {
                    685:         n = libnet_pblock_append(l, p, payload, payload_s);
                    686:         if (n == -1)
                    687:         {
                    688:             goto bad;
                    689:         }
                    690:     }
                    691: 
                    692:     return (ptag ? ptag : libnet_pblock_update(l, p, h, 
                    693:             LIBNET_PBLOCK_LS_AS_EXT_H));
                    694: bad:
                    695:     libnet_pblock_delete(l, p);
                    696:     return (-1);
                    697: }
                    698: 
                    699: /* EOF */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>