mirror_frr/tests/bgpd/test_packet.c
Donald Sharp 3e5a31b24e bgpd: Convert struct peer_connection to dynamically allocated
As part of the conversion to a `struct peer_connection` it will
be desirable to have 2 pointers one for when we open a connection
and one for when we receive a connection.  Start this actual
conversion over to this in `struct peer`.  If this sounds confusing
take a look at the bgp state machine for connections and how
it resolves the processing of this router opening -vs- this
router receiving an open.  At some point in time the state
machine decides that we are keeping one of the two connections.

Future commits will allow us to untangle the peer/doppelganger
duality with this abstraction.

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
2023-08-18 09:29:04 -04:00

76 lines
1.7 KiB
C

// 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));
}