Annotation of embedaddon/libnet/src/libnet_build_bgp.c, revision 1.1.1.2

1.1       misho       1: /*
1.1.1.2 ! misho       2:  *  $Id: libnet_build_bgp.c,v 1.8 2004/04/13 17:32:28 mike Exp $
1.1       misho       3:  *
                      4:  *  libnet
                      5:  *  libnet_build_bgp.c - BGP packet assembler (RFC 1771)
                      6:  *
                      7:  *  Copyright (c) 2003 Frederic Raynal <pappy@security-labs.org>
                      8:  *  All rights reserved.
                      9:  *
                     10:  * Redistribution and use in source and binary forms, with or without
                     11:  * modification, are permitted provided that the following conditions
                     12:  * are met:
                     13:  * 1. Redistributions of source code must retain the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer.
                     15:  * 2. Redistributions in binary form must reproduce the above copyright
                     16:  *    notice, this list of conditions and the following disclaimer in the
                     17:  *    documentation and/or other materials provided with the distribution.
                     18:  *
                     19:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
                     20:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     21:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     22:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
                     23:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     24:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     25:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     26:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     27:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     28:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     29:  * SUCH DAMAGE.
                     30:  *
                     31:  */
                     32: 
                     33: #if (HAVE_CONFIG_H)
                     34: #include "../include/config.h"
                     35: #endif
                     36: #if (!(_WIN32) || (__CYGWIN__)) 
                     37: #include "../include/libnet.h"
                     38: #else
                     39: #include "../include/win32/libnet.h"
                     40: #endif
                     41: 
                     42: libnet_ptag_t
1.1.1.2 ! misho      43: libnet_build_bgp4_header(uint8_t marker[LIBNET_BGP4_MARKER_SIZE],
        !            44: uint16_t len, uint8_t type, const uint8_t *payload, uint32_t payload_s,
        !            45: libnet_t *l, libnet_ptag_t ptag)
1.1       misho      46: {
1.1.1.2 ! misho      47:     uint32_t n, h;
1.1       misho      48:     libnet_pblock_t *p;
                     49:     struct libnet_bgp4_header_hdr bgp4_hdr;
                     50: 
                     51:     if (l == NULL)
                     52:     { 
                     53:         return (-1);
                     54:     } 
                     55: 
                     56:     n = LIBNET_BGP4_HEADER_H + payload_s;   /* size of memory block */
                     57:     h = 0;                                  /* BGP headers have no checksum */
                     58: 
                     59:     /*
                     60:      *  Find the existing protocol block if a ptag is specified, or create
                     61:      *  a new one.
                     62:      */
                     63:     p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_BGP4_HEADER_H);
                     64:     if (p == NULL)
                     65:     {
                     66:         return (-1);
                     67:     }
                     68: 
1.1.1.2 ! misho      69:     memset(&bgp4_hdr, 0, sizeof(bgp4_hdr));
        !            70:     memcpy(bgp4_hdr.marker, marker, LIBNET_BGP4_MARKER_SIZE * sizeof(uint8_t));
1.1       misho      71:     bgp4_hdr.len = htons(len);
                     72:     bgp4_hdr.type = type;
                     73: 
1.1.1.2 ! misho      74:     n = libnet_pblock_append(l, p, (uint8_t *)&bgp4_hdr, LIBNET_BGP4_HEADER_H);
1.1       misho      75:     if (n == -1)
                     76:     {
                     77:         goto bad;
                     78:     }
                     79: 
1.1.1.2 ! misho      80:     /* boilerplate payload sanity check / append macro */
        !            81:     LIBNET_DO_PAYLOAD(l, p);
        !            82:  
1.1       misho      83:     return (ptag ? ptag : libnet_pblock_update(l, p, h,
                     84:             LIBNET_PBLOCK_BGP4_HEADER_H));
                     85: bad:
                     86:     libnet_pblock_delete(l, p);
                     87:     return (-1);
                     88: }
                     89: 
                     90: libnet_ptag_t
1.1.1.2 ! misho      91: libnet_build_bgp4_open(uint8_t version, uint16_t src_as, uint16_t hold_time,
        !            92: uint32_t bgp_id, uint8_t opt_len, const uint8_t *payload, uint32_t payload_s,
        !            93: libnet_t *l, libnet_ptag_t ptag)
1.1       misho      94: {
1.1.1.2 ! misho      95:     uint32_t n, h;
1.1       misho      96:     libnet_pblock_t *p;
1.1.1.2 ! misho      97:     uint16_t val;
1.1       misho      98: 
                     99:     if (l == NULL)
                    100:     { 
                    101:         return (-1);
                    102:     } 
                    103: 
                    104:     n = LIBNET_BGP4_OPEN_H + payload_s;     /* size of memory block */
                    105:     h = 0;                                  /* BGP msg have no checksum */
                    106: 
                    107:     /*
                    108:      *  Find the existing protocol block if a ptag is specified, or create
                    109:      *  a new one.
                    110:      */
                    111:     p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_BGP4_OPEN_H);
                    112:     if (p == NULL)
                    113:     {
                    114:         return (-1);
                    115:     }
                    116: 
                    117:     /* for memory alignment reason, we need to append each field separately */
1.1.1.2 ! misho     118:     n = libnet_pblock_append(l, p, (uint8_t *)&version, sizeof (version));
1.1       misho     119:     if (n == -1)
                    120:     {
                    121:         goto bad;
                    122:     }
                    123: 
                    124:     val = htons(src_as);
1.1.1.2 ! misho     125:     n = libnet_pblock_append(l, p, (uint8_t *)&val, sizeof(src_as));
1.1       misho     126:     if (n == -1)
                    127:     {
                    128:         goto bad;
                    129:     }
                    130: 
                    131:     val = htons(hold_time);
1.1.1.2 ! misho     132:     n = libnet_pblock_append(l, p, (uint8_t *)&val, sizeof(hold_time));
1.1       misho     133:     if (n == -1)
                    134:     {
                    135:         goto bad;
                    136:     }
                    137: 
                    138:     n = htonl(bgp_id);
1.1.1.2 ! misho     139:     n = libnet_pblock_append(l, p, (uint8_t *)&n, sizeof(bgp_id));
1.1       misho     140:     if (n == -1)
                    141:     {
                    142:         goto bad;
                    143:     }
                    144: 
1.1.1.2 ! misho     145:     n = libnet_pblock_append(l, p, (uint8_t *)&opt_len, sizeof(opt_len));
1.1       misho     146:     if (n == -1)
                    147:     {
                    148:         goto bad;
                    149:     }
                    150: 
1.1.1.2 ! misho     151:     /* boilerplate payload sanity check / append macro */
        !           152:     LIBNET_DO_PAYLOAD(l, p);
        !           153:  
1.1       misho     154:     return (ptag ? ptag : libnet_pblock_update(l, p, h,
                    155:            LIBNET_PBLOCK_BGP4_OPEN_H));
                    156: bad:
                    157:     libnet_pblock_delete(l, p);
                    158:     return (-1);
                    159: }
                    160: 
                    161: libnet_ptag_t
1.1.1.2 ! misho     162: libnet_build_bgp4_update(uint16_t unfeasible_rt_len, const uint8_t *withdrawn_rt,
        !           163: uint16_t total_path_attr_len, const uint8_t *path_attributes, uint16_t info_len,
        !           164: uint8_t *reachability_info, const uint8_t *payload, uint32_t payload_s,
        !           165: libnet_t *l, libnet_ptag_t ptag)
1.1       misho     166: {
1.1.1.2 ! misho     167:     uint32_t n, h;
1.1       misho     168:     libnet_pblock_t *p;
1.1.1.2 ! misho     169:     uint16_t length;
1.1       misho     170: 
                    171:     if (l == NULL)
                    172:     { 
                    173:         return (-1);
                    174:     } 
                    175: 
                    176:     /* size of memory block */
                    177:     n = LIBNET_BGP4_UPDATE_H + unfeasible_rt_len + total_path_attr_len +
                    178:             info_len + payload_s;
                    179: 
                    180:     /* BGP msg have no checksum */
                    181:     h = 0;                                  
                    182: 
                    183:     /*
                    184:      *  Find the existing protocol block if a ptag is specified, or create
                    185:      *  a new one.
                    186:      */
                    187:     p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_BGP4_UPDATE_H);
                    188:     if (p == NULL)
                    189:     {
                    190:         return (-1);
                    191:     }
                    192: 
                    193:     /* for memory alignment reason, we need to append each field separately */
                    194:     length = htons(unfeasible_rt_len);
1.1.1.2 ! misho     195:     n = libnet_pblock_append(l, p, (uint8_t *)&length,
        !           196:         sizeof (unfeasible_rt_len));
1.1       misho     197:     if (n == -1)
                    198:     {
                    199:         goto bad;
                    200:     }
                    201: 
                    202:     if (unfeasible_rt_len && withdrawn_rt)
                    203:     {
                    204:        n = libnet_pblock_append(l, p, withdrawn_rt, unfeasible_rt_len);
                    205:        if (n == -1)
                    206:        {
                    207:            goto bad;
                    208:        }
                    209:     }
                    210: 
                    211:     length = htons(total_path_attr_len);
1.1.1.2 ! misho     212:     n = libnet_pblock_append(l, p, (uint8_t *)&length,
1.1       misho     213:             sizeof (total_path_attr_len));
                    214:     if (n == -1)
                    215:     {
                    216:         goto bad;
                    217:     }
                    218: 
                    219:     if (total_path_attr_len && path_attributes)
                    220:     {
                    221:        n = libnet_pblock_append(l, p, path_attributes, total_path_attr_len);
                    222:        if (n == -1)
                    223:        {
                    224:            goto bad;
                    225:        }
                    226:     }
                    227: 
                    228:     if (info_len && reachability_info)
                    229:     {
                    230:        n = libnet_pblock_append(l, p, reachability_info, info_len);
                    231:        if (n == -1)
                    232:        {
                    233:            goto bad;
                    234:        }
                    235:     }
                    236: 
1.1.1.2 ! misho     237:     /* boilerplate payload sanity check / append macro */
        !           238:     LIBNET_DO_PAYLOAD(l, p);
        !           239:  
1.1       misho     240:     return (ptag ? ptag : libnet_pblock_update(l, p, h,
                    241:             LIBNET_PBLOCK_BGP4_UPDATE_H));
                    242: bad:
                    243:     libnet_pblock_delete(l, p);
                    244:     return (-1);
                    245: }
                    246: 
                    247: libnet_ptag_t
1.1.1.2 ! misho     248: libnet_build_bgp4_notification(uint8_t err_code, uint8_t err_subcode,
        !           249: const uint8_t *payload, uint32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
1.1       misho     250: {
1.1.1.2 ! misho     251:     uint32_t n, h;
1.1       misho     252:     libnet_pblock_t *p;
                    253:     struct libnet_bgp4_notification_hdr bgp4_hdr;
                    254: 
                    255:     if (l == NULL)
                    256:     { 
                    257:         return (-1);
                    258:     } 
                    259: 
                    260:     n =  LIBNET_BGP4_NOTIFICATION_H + + payload_s;    /* size of memory block */
                    261:     h = 0; 
                    262: 
                    263:     /*
                    264:      *  Find the existing protocol block if a ptag is specified, or create
                    265:      *  a new one.
                    266:      */
                    267:     p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_BGP4_NOTIFICATION_H);
                    268:     if (p == NULL)
                    269:     {
                    270:         return (-1);
                    271:     }
                    272: 
1.1.1.2 ! misho     273:     memset(&bgp4_hdr, 0, sizeof(bgp4_hdr));
        !           274:     bgp4_hdr.err_code    = err_code;
1.1       misho     275:     bgp4_hdr.err_subcode = err_subcode;
                    276: 
1.1.1.2 ! misho     277:     n = libnet_pblock_append(l, p, (uint8_t *)&bgp4_hdr,
1.1       misho     278:             LIBNET_BGP4_NOTIFICATION_H);
                    279:     if (n == -1)
                    280:     {
                    281:         goto bad;
                    282:     }
                    283: 
1.1.1.2 ! misho     284:     /* boilerplate payload sanity check / append macro */
        !           285:     LIBNET_DO_PAYLOAD(l, p);
1.1       misho     286:     
                    287:     return (ptag ? ptag : libnet_pblock_update(l, p, h,
                    288:             LIBNET_PBLOCK_BGP4_NOTIFICATION_H));
                    289: bad:
                    290:     libnet_pblock_delete(l, p);
                    291:     return (-1);
                    292: }
                    293: 
                    294: /* EOF */

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