]> git.proxmox.com Git - mirror_frr.git/blob - bgpd/bgp_packet.h
Merge pull request #13183 from Pdoijode/pdoijode/pim-json-changes
[mirror_frr.git] / bgpd / bgp_packet.h
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* BGP packet management header.
3 * Copyright (C) 1999 Kunihiro Ishiguro
4 */
5
6 #ifndef _QUAGGA_BGP_PACKET_H
7 #define _QUAGGA_BGP_PACKET_H
8
9 #include "hook.h"
10
11 DECLARE_HOOK(bgp_packet_dump,
12 (struct peer *peer, uint8_t type, bgp_size_t size,
13 struct stream *s),
14 (peer, type, size, s));
15
16 DECLARE_HOOK(bgp_packet_send,
17 (struct peer *peer, uint8_t type, bgp_size_t size,
18 struct stream *s),
19 (peer, type, size, s));
20
21 #define BGP_NLRI_LENGTH 1U
22 #define BGP_TOTAL_ATTR_LEN 2U
23 #define BGP_UNFEASIBLE_LEN 2U
24
25 /* When to refresh */
26 #define REFRESH_IMMEDIATE 1
27 #define REFRESH_DEFER 2
28
29 /* ORF Common part flag */
30 #define ORF_COMMON_PART_ADD 0x00
31 #define ORF_COMMON_PART_REMOVE 0x80
32 #define ORF_COMMON_PART_REMOVE_ALL 0xC0
33 #define ORF_COMMON_PART_PERMIT 0x00
34 #define ORF_COMMON_PART_DENY 0x20
35
36 #define BGP_UPDATE_EOR_PKT(_peer, _afi, _safi, _s) \
37 do { \
38 _s = bgp_update_packet_eor(_peer, _afi, _safi); \
39 if (_s) { \
40 bgp_packet_add(_peer, _s); \
41 } \
42 } while (0)
43
44 /* Packet send and receive function prototypes. */
45 extern void bgp_keepalive_send(struct peer *peer);
46 extern void bgp_open_send(struct peer *peer);
47 extern void bgp_notify_send(struct peer *peer, uint8_t code, uint8_t sub_code);
48 extern void bgp_notify_send_with_data(struct peer *peer, uint8_t code,
49 uint8_t sub_code, uint8_t *data,
50 size_t datalen);
51 void bgp_notify_io_invalid(struct peer *peer, uint8_t code, uint8_t sub_code,
52 uint8_t *data, size_t datalen);
53 extern void bgp_route_refresh_send(struct peer *peer, afi_t afi, safi_t safi,
54 uint8_t orf_type, uint8_t when_to_refresh,
55 int remove, uint8_t subtype);
56 extern void bgp_capability_send(struct peer *peer, afi_t afi, safi_t safi,
57 int capabilty_code, int action);
58
59 extern int bgp_capability_receive(struct peer *peer, bgp_size_t length);
60
61 extern int bgp_nlri_parse(struct peer *peer, struct attr *attr,
62 struct bgp_nlri *nlri, bool mp_withdraw);
63
64 extern void bgp_update_restarted_peers(struct peer *peer);
65 extern void bgp_update_implicit_eors(struct peer *peer);
66 extern void bgp_check_update_delay(struct bgp *peer);
67
68 extern int bgp_packet_set_marker(struct stream *s, uint8_t type);
69 extern void bgp_packet_set_size(struct stream *s);
70
71 extern void bgp_generate_updgrp_packets(struct event *event);
72 extern void bgp_process_packet(struct event *event);
73
74 extern void bgp_send_delayed_eor(struct bgp *bgp);
75
76 /* Task callback to handle socket error encountered in the io pthread */
77 void bgp_packet_process_error(struct event *thread);
78 extern struct bgp_notify
79 bgp_notify_decapsulate_hard_reset(struct bgp_notify *notify);
80 extern bool bgp_has_graceful_restart_notification(struct peer *peer);
81 extern bool bgp_notify_send_hard_reset(struct peer *peer, uint8_t code,
82 uint8_t subcode);
83 extern bool bgp_notify_received_hard_reset(struct peer *peer, uint8_t code,
84 uint8_t subcode);
85
86 #endif /* _QUAGGA_BGP_PACKET_H */