File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libnet / src / libnet_build_ospf.c
Revision 1.1.1.3 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Sep 27 11:11:38 2023 UTC (9 months, 1 week ago) by misho
Branches: libnet, MAIN
CVS tags: v1_2p1, HEAD
Version 1.2p1

    1: /*
    2:  *  $Id: libnet_build_ospf.c,v 1.1.1.3 2023/09/27 11:11:38 misho 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: #include "common.h"
   37: 
   38: libnet_ptag_t
   39: libnet_build_ospfv2(uint16_t len, uint8_t type, uint32_t rtr_id, 
   40: uint32_t area_id, uint16_t sum, uint16_t autype, const uint8_t *payload, 
   41: uint32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
   42: {
   43:     uint32_t n, h;
   44:     libnet_pblock_t *p;
   45:     struct libnet_ospf_hdr ospf_hdr;
   46: 
   47:     if (l == NULL)
   48:     { 
   49:         return (-1);
   50:     } 
   51:  
   52:     n = LIBNET_OSPF_H + payload_s;
   53:     h = LIBNET_OSPF_H + payload_s + len;
   54: 
   55:     /*
   56:      *  Find the existing protocol block if a ptag is specified, or create
   57:      *  a new one.
   58:      */
   59:     p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_OSPF_H);
   60:     if (p == NULL)
   61:     {
   62:         return (-1);
   63:     }
   64:     
   65:     memset(&ospf_hdr, 0, sizeof(ospf_hdr));
   66:     ospf_hdr.ospf_v               = 2;              /* OSPF version 2 */
   67:     ospf_hdr.ospf_type            = type;           /* Type of pkt */
   68:     ospf_hdr.ospf_len             = htons(h);       /* Pkt len */
   69:     ospf_hdr.ospf_rtr_id.s_addr   = rtr_id;  /* Router ID */
   70:     ospf_hdr.ospf_area_id.s_addr  = area_id; /* Area ID */
   71:     ospf_hdr.ospf_sum             = sum;
   72:     ospf_hdr.ospf_auth_type       = htons(autype);  /* Type of auth */
   73: 
   74:     n = libnet_pblock_append(l, p, (uint8_t *)&ospf_hdr, LIBNET_OSPF_H);
   75:     if (n == -1)
   76:     {
   77:         goto bad;
   78:     }
   79: 
   80:     /* boilerplate payload sanity check / append macro */
   81:     LIBNET_DO_PAYLOAD(l, p);
   82: 
   83:     if (sum == 0)
   84:     {
   85:         /*
   86:          *  If checksum is zero, by default libnet will compute a checksum
   87:          *  for the user.  The programmer can override this by calling
   88:          *  libnet_toggle_checksum(l, ptag, 1);
   89:          */
   90:         libnet_pblock_setflags(p, LIBNET_PBLOCK_DO_CHECKSUM);
   91:     }
   92:     return (ptag ? ptag : libnet_pblock_update(l, p, h, LIBNET_PBLOCK_OSPF_H));
   93: bad:
   94:     libnet_pblock_delete(l, p);
   95:     return (-1);
   96: }
   97: 
   98: 
   99: libnet_ptag_t
  100: libnet_build_ospfv2_hello(uint32_t netmask, uint16_t interval, uint8_t opts, 
  101: uint8_t priority, uint32_t dead_int, uint32_t des_rtr, uint32_t bkup_rtr,
  102: const uint8_t *payload, uint32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
  103: {
  104: 	return libnet_build_ospfv2_hello_neighbor(netmask, interval, opts,
  105: 		  priority, dead_int, des_rtr, bkup_rtr, 0,
  106: 		  payload, payload_s, l, ptag);
  107: }
  108: 
  109: libnet_ptag_t
  110: libnet_build_ospfv2_hello_neighbor(uint32_t netmask, uint16_t interval, uint8_t opts,
  111: uint8_t priority, uint32_t dead_int, uint32_t des_rtr, uint32_t bkup_rtr, uint32_t neighbor,
  112: const uint8_t *payload, uint32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
  113: {
  114:     uint32_t n, h;
  115:     libnet_pblock_t *p;
  116:     struct libnet_ospf_hello_hdr hello_hdr;
  117: 
  118:     if (l == NULL)
  119:     {
  120:         return (-1);
  121:     }
  122: 
  123:     n = LIBNET_OSPF_HELLO_H + payload_s;
  124:     h = 0;
  125: 
  126:     /*
  127:      *  Find the existing protocol block if a ptag is specified, or create
  128:      *  a new one.
  129:      */
  130:     p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_OSPF_HELLO_H);
  131:     if (p == NULL)
  132:     {
  133:         return (-1);
  134:     }
  135: 
  136:     memset(&hello_hdr, 0, sizeof(hello_hdr));
  137:     hello_hdr.hello_nmask.s_addr    = netmask;  /* Netmask */
  138:     hello_hdr.hello_intrvl          = htons(interval);	/* # seconds since last packet sent */
  139:     hello_hdr.hello_opts            = opts;     /* OSPF_* options */
  140:     hello_hdr.hello_rtr_pri         = priority; /* If 0, can't be backup */
  141:     hello_hdr.hello_dead_intvl      = htonl(dead_int); /* Time til router is deemed down */
  142:     hello_hdr.hello_des_rtr.s_addr  = des_rtr;	/* Networks designated router */
  143:     hello_hdr.hello_bkup_rtr.s_addr = bkup_rtr; /* Networks backup router */
  144:     hello_hdr.hello_nbr.s_addr      = htonl(neighbor);
  145: 
  146:     n = libnet_pblock_append(l, p, (uint8_t *)&hello_hdr, LIBNET_OSPF_HELLO_H);
  147:     if (n == -1)
  148:     {
  149:         goto bad;
  150:     }
  151: 
  152:     /* boilerplate payload sanity check / append macro */
  153:     LIBNET_DO_PAYLOAD(l, p);
  154: 
  155:     return (ptag ? ptag : libnet_pblock_update(l, p, h,
  156:             LIBNET_PBLOCK_OSPF_HELLO_H));
  157: bad:
  158:     libnet_pblock_delete(l, p);
  159:     return (-1);
  160: }
  161: 
  162: libnet_ptag_t
  163: libnet_build_ospfv2_dbd(uint16_t dgram_len, uint8_t opts, uint8_t type,
  164: uint32_t seqnum, const uint8_t *payload, uint32_t payload_s, libnet_t *l,
  165: libnet_ptag_t ptag)
  166: {
  167:     uint32_t n, h;
  168:     libnet_pblock_t *p;
  169:     struct libnet_dbd_hdr dbd_hdr;
  170: 
  171:     if (l == NULL)
  172:     { 
  173:         return (-1);
  174:     } 
  175: 
  176:     n = LIBNET_OSPF_DBD_H + payload_s;
  177:     h = 0;
  178: 
  179:     /*
  180:      *  Find the existing protocol block if a ptag is specified, or create
  181:      *  a new one.
  182:      */
  183:     p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_OSPF_DBD_H);
  184:     if (p == NULL)
  185:     {
  186:         return (-1);
  187:     }
  188:     
  189:     memset(&dbd_hdr, 0, sizeof(dbd_hdr));
  190:     dbd_hdr.dbd_mtu_len	= htons(dgram_len); /* Max length of IP packet IF can use */
  191:     dbd_hdr.dbd_opts    = opts;	            /* OSPF_* options */
  192:     dbd_hdr.dbd_type    = type;	            /* Type of exchange occuring */
  193:     dbd_hdr.dbd_seq     = htonl(seqnum);    /* DBD sequence number */
  194: 
  195:     n = libnet_pblock_append(l, p, (uint8_t *)&dbd_hdr, LIBNET_OSPF_DBD_H);
  196:     if (n == -1)
  197:     {
  198:         goto bad;
  199:     }
  200: 
  201:     /* boilerplate payload sanity check / append macro */
  202:     LIBNET_DO_PAYLOAD(l, p);
  203: 
  204:     return (ptag ? ptag : libnet_pblock_update(l, p, h, 
  205:             LIBNET_PBLOCK_OSPF_DBD_H));
  206: bad:
  207:     libnet_pblock_delete(l, p);
  208:     return (-1);
  209: }
  210: 
  211: 
  212: libnet_ptag_t
  213: libnet_build_ospfv2_lsr(uint32_t type, uint32_t lsid, uint32_t advrtr, 
  214: const uint8_t *payload, uint32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
  215: {
  216:     uint32_t n, h;
  217:     libnet_pblock_t *p;
  218:     struct libnet_lsr_hdr lsr_hdr;
  219: 
  220:     if (l == NULL)
  221:     { 
  222:         return (-1);
  223:     } 
  224: 
  225:     n = LIBNET_OSPF_LSR_H + payload_s;
  226:     h = 0;
  227: 
  228:     /*
  229:      *  Find the existing protocol block if a ptag is specified, or create
  230:      *  a new one.
  231:      */
  232:     p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_OSPF_LSR_H);
  233:     if (p == NULL)
  234:     {
  235:         return (-1);
  236:     }
  237: 
  238:     memset(&lsr_hdr, 0, sizeof(lsr_hdr));
  239:     lsr_hdr.lsr_type         = htonl(type);     /* Type of LS being requested */
  240:     lsr_hdr.lsr_lsid	     = htonl(lsid);     /* Link State ID */
  241:     lsr_hdr.lsr_adrtr.s_addr = htonl(advrtr);   /* Advertising router */
  242: 
  243:     n = libnet_pblock_append(l, p, (uint8_t *)&lsr_hdr, LIBNET_OSPF_LSR_H);
  244:     if (n == -1)
  245:     {
  246:         goto bad;
  247:     }
  248: 
  249:     /* boilerplate payload sanity check / append macro */
  250:     LIBNET_DO_PAYLOAD(l, p);
  251: 
  252:     return (ptag ? ptag : libnet_pblock_update(l, p, h, 
  253:             LIBNET_PBLOCK_OSPF_LSR_H));
  254: bad:
  255:     libnet_pblock_delete(l, p);
  256:     return (-1);
  257: }
  258: 
  259: 
  260: libnet_ptag_t
  261: libnet_build_ospfv2_lsu(uint32_t num, const uint8_t *payload, uint32_t payload_s,
  262: libnet_t *l, libnet_ptag_t ptag)
  263: {
  264:     uint32_t n, h;
  265:     libnet_pblock_t *p;
  266:     struct libnet_lsu_hdr lh_hdr;
  267: 
  268:     if (l == NULL)
  269:     { 
  270:         return (-1);
  271:     } 
  272: 
  273:     n = LIBNET_OSPF_LSU_H + payload_s;
  274:     h = 0;
  275: 
  276:     /*
  277:      *  Find the existing protocol block if a ptag is specified, or create
  278:      *  a new one.
  279:      */
  280:     p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_OSPF_LSU_H);
  281:     if (p == NULL)
  282:     {
  283:         return (-1);
  284:     }
  285: 
  286:     memset(&lh_hdr, 0, sizeof(lh_hdr));
  287:     lh_hdr.lsu_num = htonl(num);   /* Number of LSAs that will be bcasted */
  288: 
  289:     n = libnet_pblock_append(l, p, (uint8_t *)&lh_hdr, LIBNET_OSPF_LSU_H);
  290:     if (n == -1)
  291:     {
  292:         goto bad;
  293:     }
  294: 
  295:     /* boilerplate payload sanity check / append macro */
  296:     LIBNET_DO_PAYLOAD(l, p);
  297: 
  298:     return (ptag ? ptag : libnet_pblock_update(l, p, h, 
  299:             LIBNET_PBLOCK_OSPF_LSU_H));
  300: bad:
  301:     libnet_pblock_delete(l, p);
  302:     return (-1);
  303: }
  304: 
  305: 
  306: libnet_ptag_t
  307: libnet_build_ospfv2_lsa(uint16_t age, uint8_t opts, uint8_t type, uint32_t lsid,
  308: uint32_t advrtr, uint32_t seqnum, uint16_t sum, uint16_t len,
  309: const uint8_t *payload, uint32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
  310: {
  311:     uint32_t n, h;
  312:     libnet_pblock_t *p;
  313:     struct libnet_lsa_hdr lsa_hdr;
  314: 
  315:     if (l == NULL)
  316:     { 
  317:         return (-1);
  318:     } 
  319: 
  320:     n = LIBNET_OSPF_LSA_H + payload_s;
  321:     h = len + payload_s;
  322: 
  323:     /*
  324:      *  Find the existing protocol block if a ptag is specified, or create
  325:      *  a new one.
  326:      */
  327:     p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_OSPF_LSA_H);
  328:     if (p == NULL)
  329:     {
  330:         return (-1);
  331:     }
  332: 
  333:     memset(&lsa_hdr, 0, sizeof(lsa_hdr));
  334:     lsa_hdr.lsa_age         = htons(age);
  335:     lsa_hdr.lsa_opts        = opts;
  336:     lsa_hdr.lsa_type        = type;
  337:     lsa_hdr.lsa_id          = htonl(lsid);
  338:     lsa_hdr.lsa_adv.s_addr  = htonl(advrtr);
  339:     lsa_hdr.lsa_seq         = htonl(seqnum);
  340:     lsa_hdr.lsa_sum         = sum;
  341:     lsa_hdr.lsa_len         = htons(h);
  342: 
  343:     n = libnet_pblock_append(l, p, (uint8_t *)&lsa_hdr, LIBNET_OSPF_LSA_H);
  344:     if (n == -1)
  345:     {
  346:         goto bad;
  347:     }
  348: 
  349:     /* boilerplate payload sanity check / append macro */
  350:     LIBNET_DO_PAYLOAD(l, p);
  351: 
  352:     if (sum == 0)
  353:     {
  354:         /*
  355:          *  If checksum is zero, by default libnet will compute a checksum
  356:          *  for the user.  The programmer can override this by calling
  357:          *  libnet_toggle_checksum(l, ptag, 1);
  358:          */
  359:         libnet_pblock_setflags(p, LIBNET_PBLOCK_DO_CHECKSUM);
  360:     }
  361:     return (ptag ? ptag : libnet_pblock_update(l, p, h, 
  362:             LIBNET_PBLOCK_OSPF_LSA_H));
  363: bad:
  364:     libnet_pblock_delete(l, p);
  365:     return (-1);
  366: }
  367: 
  368: 
  369: libnet_ptag_t
  370: libnet_build_ospfv2_lsa_rtr(uint16_t flags, uint16_t num, uint32_t id,
  371: uint32_t data, uint8_t type, uint8_t tos, uint16_t metric,
  372: const uint8_t *payload, uint32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
  373: {
  374:     uint32_t n, h;
  375:     libnet_pblock_t *p;
  376:     struct libnet_rtr_lsa_hdr rtr_lsa_hdr;
  377: 
  378:     if (l == NULL)
  379:     { 
  380:         return (-1);
  381:     } 
  382: 
  383:     n = LIBNET_OSPF_LS_RTR_H + payload_s;
  384:     h = 0;
  385: 
  386:     /*
  387:      *  Find the existing protocol block if a ptag is specified, or create
  388:      *  a new one.
  389:      */
  390:     p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_LS_RTR_H);
  391:     if (p == NULL)
  392:     {
  393:         return (-1);
  394:     }
  395: 
  396:     memset(&rtr_lsa_hdr, 0, sizeof(rtr_lsa_hdr));
  397:     rtr_lsa_hdr.rtr_flags       = htons(flags);
  398:     rtr_lsa_hdr.rtr_num         = htons(num);
  399:     rtr_lsa_hdr.rtr_link_id     = htonl(id);
  400:     rtr_lsa_hdr.rtr_link_data   = htonl(data);
  401:     rtr_lsa_hdr.rtr_type        = type;
  402:     rtr_lsa_hdr.rtr_tos_num     = tos;
  403:     rtr_lsa_hdr.rtr_metric      = htons(metric);
  404: 
  405:     n = libnet_pblock_append(l, p, (uint8_t *)&rtr_lsa_hdr,
  406:             LIBNET_OSPF_LS_RTR_H);
  407:     if (n == -1)
  408:     {
  409:         goto bad;
  410:     }
  411: 
  412:     /* boilerplate payload sanity check / append macro */
  413:     LIBNET_DO_PAYLOAD(l, p);
  414: 
  415:     return (ptag ? ptag : libnet_pblock_update(l, p, h, 
  416:             LIBNET_PBLOCK_LS_RTR_H));
  417: bad:
  418:     libnet_pblock_delete(l, p);
  419:     return (-1);
  420: }
  421: 
  422: 
  423: libnet_ptag_t
  424: libnet_build_ospfv2_lsa_net(uint32_t nmask, uint32_t rtrid,
  425: const uint8_t *payload, uint32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
  426: {
  427:     uint32_t n, h;
  428:     libnet_pblock_t *p;
  429:     struct libnet_net_lsa_hdr net_lsa_hdr;
  430: 
  431:     if (l == NULL)
  432:     { 
  433:         return (-1);
  434:     } 
  435: 
  436:     n = LIBNET_OSPF_LS_NET_H + payload_s;
  437:     h = 0;
  438: 
  439:     /*
  440:      *  Find the existing protocol block if a ptag is specified, or create
  441:      *  a new one.
  442:      */
  443:     p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_LS_NET_H);
  444:     if (p == NULL)
  445:     {
  446:         return (-1);
  447:     }
  448: 
  449:     memset(&net_lsa_hdr, 0, sizeof(net_lsa_hdr));
  450:     net_lsa_hdr.net_nmask.s_addr    = htonl(nmask);
  451:     net_lsa_hdr.net_rtr_id          = htonl(rtrid);
  452: 
  453:     n = libnet_pblock_append(l, p, (uint8_t *)&net_lsa_hdr,
  454:             LIBNET_OSPF_LS_NET_H);
  455:     if (n == -1)
  456:     {
  457:         goto bad;
  458:     }
  459: 
  460:     /* boilerplate payload sanity check / append macro */
  461:     LIBNET_DO_PAYLOAD(l, p);
  462: 
  463:     return (ptag ? ptag : libnet_pblock_update(l, p, h, 
  464:             LIBNET_PBLOCK_LS_NET_H));
  465: bad:
  466:     libnet_pblock_delete(l, p);
  467:     return (-1);
  468: }
  469: 
  470: 
  471: libnet_ptag_t
  472: libnet_build_ospfv2_lsa_sum(uint32_t nmask, uint32_t metric, uint32_t tos, 
  473: const uint8_t *payload, uint32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
  474: {
  475:     uint32_t n, h;
  476:     libnet_pblock_t *p;
  477:     struct libnet_sum_lsa_hdr sum_lsa_hdr;
  478: 
  479:     if (l == NULL)
  480:     { 
  481:         return (-1);
  482:     } 
  483: 
  484:     n = LIBNET_OSPF_LS_SUM_H + payload_s;
  485:     h = 0;
  486: 
  487:     /*
  488:      *  Find the existing protocol block if a ptag is specified, or create
  489:      *  a new one.
  490:      */
  491:     p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_LS_SUM_H);
  492:     if (p == NULL)
  493:     {
  494:         return (-1);
  495:     }
  496: 
  497:     memset(&sum_lsa_hdr, 0, sizeof(sum_lsa_hdr));
  498:     sum_lsa_hdr.sum_nmask.s_addr    = htonl(nmask);
  499:     sum_lsa_hdr.sum_metric          = htonl(metric);
  500:     sum_lsa_hdr.sum_tos_metric      = htonl(tos);
  501: 
  502:     n = libnet_pblock_append(l, p, (uint8_t *)&sum_lsa_hdr,
  503:             LIBNET_OSPF_LS_SUM_H);
  504:     if (n == -1)
  505:     {
  506:         goto bad;
  507:     }
  508: 
  509:     /* boilerplate payload sanity check / append macro */
  510:     LIBNET_DO_PAYLOAD(l, p);
  511: 
  512:     return (ptag ? ptag : libnet_pblock_update(l, p, h, 
  513:             LIBNET_PBLOCK_LS_SUM_H));
  514: bad:
  515:     libnet_pblock_delete(l, p);
  516:     return (-1);
  517: }
  518: 
  519: 
  520: libnet_ptag_t
  521: libnet_build_ospfv2_lsa_as(uint32_t nmask, uint32_t metric, uint32_t fwdaddr,
  522: uint32_t tag, const uint8_t *payload, uint32_t payload_s, libnet_t *l,
  523: libnet_ptag_t ptag)
  524: {
  525:     uint32_t n, h;
  526:     libnet_pblock_t *p;
  527:     struct libnet_as_lsa_hdr as_lsa_hdr;
  528: 
  529:     if (l == NULL)
  530:     { 
  531:         return (-1);
  532:     } 
  533:    
  534:     n = LIBNET_OSPF_LS_AS_EXT_H + payload_s;
  535:     h = 0;
  536: 
  537:     /*
  538:      *  Find the existing protocol block if a ptag is specified, or create
  539:      *  a new one.
  540:      */
  541:     p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_LS_AS_EXT_H);
  542:     if (p == NULL)
  543:     {
  544:         return (-1);
  545:     }
  546: 
  547:     memset(&as_lsa_hdr, 0, sizeof(as_lsa_hdr));
  548:     as_lsa_hdr.as_nmask.s_addr      = htonl(nmask);
  549:     as_lsa_hdr.as_metric            = htonl(metric);
  550:     as_lsa_hdr.as_fwd_addr.s_addr   = htonl(fwdaddr);
  551:     as_lsa_hdr.as_rte_tag           = htonl(tag);
  552: 
  553:     n = libnet_pblock_append(l, p, (uint8_t *)&as_lsa_hdr,
  554:             LIBNET_OSPF_LS_AS_EXT_H);
  555:     if (n == -1)
  556:     {
  557:         goto bad;
  558:     }
  559: 
  560:     /* boilerplate payload sanity check / append macro */
  561:     LIBNET_DO_PAYLOAD(l, p);
  562: 
  563:     return (ptag ? ptag : libnet_pblock_update(l, p, h, 
  564:             LIBNET_PBLOCK_LS_AS_EXT_H));
  565: bad:
  566:     libnet_pblock_delete(l, p);
  567:     return (-1);
  568: }
  569: 
  570: /**
  571:  * Local Variables:
  572:  *  indent-tabs-mode: nil
  573:  *  c-file-style: "stroustrup"
  574:  * End:
  575:  */

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