1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2017 Cumulus Networks Inc.
* Donald Sharp
*
* This file is part of FRR
*/
#include <zebra.h>
#include "qobj.h"
#include "vty.h"
#include "stream.h"
#include "privs.h"
#include "memory.h"
#include "queue.h"
#include "filter.h"
#include "bgpd/bgpd.h"
#include "bgpd/bgp_open.h"
#include "bgpd/bgp_debug.h"
#include "bgpd/bgp_packet.h"
#include "bgpd/bgp_aspath.h"
#include "bgpd/bgp_network.h"
/* need these to link in libbgp */
struct zebra_privs_t bgpd_privs = {};
struct event_loop *master = NULL;
static struct bgp *bgp;
static as_t asn = 100;
extern int bgp_read_packet(struct peer *peer);
/*
* This file is intended to be used as input for some sort of
* fuzzer. Specifically I had afl in mind when I wrote
* this code.
*/
int main(int argc, char *argv[])
{
struct peer *peer;
int i, j;
struct event t;
qobj_init();
bgp_attr_init();
master = event_master_create(NULL);
bgp_master_init(master, BGP_SOCKET_SNDBUF_SIZE, list_new());
vrf_init(NULL, NULL, NULL, NULL);
bgp_option_set(BGP_OPT_NO_LISTEN);
if (bgp_get(&bgp, &asn, NULL, BGP_INSTANCE_TYPE_DEFAULT, NULL,
ASNOTATION_PLAIN) < 0)
return -1;
peer = peer_create_accept(bgp);
peer->host = (char *)"foo";
for (i = AFI_IP; i < AFI_MAX; i++)
for (j = SAFI_UNICAST; j < SAFI_MAX; j++) {
peer->afc[i][j] = 1;
peer->afc_adv[i][j] = 1;
}
SET_FLAG(peer->cap, PEER_CAP_DYNAMIC_ADV);
peer->connection = bgp_peer_connection_new(peer);
peer->connection->status = Established;
peer->connection->fd = open(argv[1], O_RDONLY | O_NONBLOCK);
t.arg = peer;
peer->connection->t_read = &t;
// printf("bgp_read_packet returns: %d\n", bgp_read(&t));
}
|