a7d7383a44
Type: fix
Fixes: 39e9428b90
When a VRRP advertisement is received by a worker thread, the worker
calls vl_api_rpc_call_main_thread() so the main thread will process the
packet and make adjustments to VR state if necessary.
The data being passed to the main thread included a pointer to the VRRP
header in the received packet buffer. Since the main thread processes
the RPC request asynchronously from the worker thread, it's possible for
the worker to drop the packet and for the buffer to be overwritten before
the main thread can process it.
Copy the fields which may be needed by the main thread into a struct
instead of passing a pointer to a packet buffer.
Change-Id: I4e899e967df5a54776b521825a80e9cce1a94f5f
Signed-off-by: Matthew Smith <mgsmith@netgate.com>
68 lines
1.7 KiB
C
68 lines
1.7 KiB
C
|
|
/*
|
|
* vrrp_packet.h - vrrp protocol/packet definitions
|
|
*
|
|
* Copyright 2019-2020 Rubicon Communications, LLC (Netgate)
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
*/
|
|
#ifndef __included_vrrp_packet_h__
|
|
#define __included_vrrp_packet_h__
|
|
|
|
#include <vnet/vnet.h>
|
|
|
|
typedef CLIB_PACKED (struct
|
|
{
|
|
/* 4 bits for version (always 2 or 3), 4 bits for type (always 1) */
|
|
u8 vrrp_version_and_type;
|
|
/* VR ID */
|
|
u8 vr_id;
|
|
/* priority of sender on this VR. value of 0 means a master is abdicating */
|
|
u8 priority;
|
|
/* count of addresses being backed up by the VR */
|
|
u8 n_addrs;
|
|
/* max advertisement interval - first 4 bits are reserved and must be 0 */
|
|
u16 rsvd_and_max_adv_int;
|
|
/* checksum */
|
|
u16 checksum;
|
|
}) vrrp_header_t;
|
|
|
|
typedef CLIB_PACKED (struct
|
|
{
|
|
ip4_header_t ip4; vrrp_header_t vrrp;
|
|
}) ip4_and_vrrp_header_t;
|
|
|
|
typedef CLIB_PACKED (struct
|
|
{
|
|
ip6_header_t ip6; vrrp_header_t vrrp;
|
|
}) ip6_and_vrrp_header_t;
|
|
|
|
/* the high 4 bits of the advertisement interval are "reserved" and
|
|
* should be ignored on reception. swap byte order and mask out those bits.
|
|
*/
|
|
always_inline u16
|
|
vrrp_adv_int_from_packet (vrrp_header_t * pkt)
|
|
{
|
|
return clib_net_to_host_u16 (pkt->rsvd_and_max_adv_int) & ((u16) 0x0fff);
|
|
}
|
|
|
|
/* Fields from VRRP advertisement packets needed by main thread */
|
|
typedef struct vrrp_input_process_args
|
|
{
|
|
u32 vr_index;
|
|
ip46_address_t src_addr;
|
|
u8 priority;
|
|
u8 max_adv_int;
|
|
} vrrp_input_process_args_t;
|
|
|
|
#endif /* __included_vrrp_packet_h__ */
|
|
|
|
/*
|
|
* fd.io coding-style-patch-verification: ON
|
|
*
|
|
* Local Variables:
|
|
* eval: (c-set-style "gnu")
|
|
* End:
|
|
*/
|