mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-07 06:03:10 +00:00
eigrpd: Create a socket per vrf for communication
Setup EIGRP to use a socket per vrf for communication amongst it's peers. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
parent
c20fa244a1
commit
128ed7604d
@ -53,7 +53,7 @@ static int eigrp_network_match_iface(const struct prefix *connected_prefix,
|
|||||||
static void eigrp_network_run_interface(struct eigrp *, struct prefix *,
|
static void eigrp_network_run_interface(struct eigrp *, struct prefix *,
|
||||||
struct interface *);
|
struct interface *);
|
||||||
|
|
||||||
int eigrp_sock_init(void)
|
int eigrp_sock_init(struct vrf *vrf)
|
||||||
{
|
{
|
||||||
int eigrp_sock;
|
int eigrp_sock;
|
||||||
int ret;
|
int ret;
|
||||||
@ -62,7 +62,9 @@ int eigrp_sock_init(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
frr_elevate_privs(&eigrpd_privs) {
|
frr_elevate_privs(&eigrpd_privs) {
|
||||||
eigrp_sock = socket(AF_INET, SOCK_RAW, IPPROTO_EIGRPIGP);
|
eigrp_sock = vrf_socket(
|
||||||
|
AF_INET, SOCK_RAW, IPPROTO_EIGRPIGP, vrf->vrf_id,
|
||||||
|
vrf->vrf_id != VRF_DEFAULT ? vrf->name : NULL);
|
||||||
if (eigrp_sock < 0) {
|
if (eigrp_sock < 0) {
|
||||||
zlog_err("eigrp_read_sock_init: socket: %s",
|
zlog_err("eigrp_read_sock_init: socket: %s",
|
||||||
safe_strerror(errno));
|
safe_strerror(errno));
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
/* Prototypes */
|
/* Prototypes */
|
||||||
|
|
||||||
extern int eigrp_sock_init(void);
|
extern int eigrp_sock_init(struct vrf *vrf);
|
||||||
extern int eigrp_if_ipmulticast(struct eigrp *, struct prefix *, unsigned int);
|
extern int eigrp_if_ipmulticast(struct eigrp *, struct prefix *, unsigned int);
|
||||||
extern int eigrp_network_set(struct eigrp *eigrp, struct prefix *p);
|
extern int eigrp_network_set(struct eigrp *eigrp, struct prefix *p);
|
||||||
extern int eigrp_network_unset(struct eigrp *eigrp, struct prefix *p);
|
extern int eigrp_network_unset(struct eigrp *eigrp, struct prefix *p);
|
||||||
|
@ -87,7 +87,7 @@ struct eigrp {
|
|||||||
struct list *eiflist; /* eigrp interfaces */
|
struct list *eiflist; /* eigrp interfaces */
|
||||||
uint8_t passive_interface_default; /* passive-interface default */
|
uint8_t passive_interface_default; /* passive-interface default */
|
||||||
|
|
||||||
unsigned int fd;
|
int fd;
|
||||||
unsigned int maxsndbuflen;
|
unsigned int maxsndbuflen;
|
||||||
|
|
||||||
uint32_t sequence_number; /*Global EIGRP sequence number*/
|
uint32_t sequence_number; /*Global EIGRP sequence number*/
|
||||||
|
@ -137,7 +137,6 @@ void eigrp_master_init(void)
|
|||||||
static struct eigrp *eigrp_new(const char *AS, vrf_id_t vrf_id)
|
static struct eigrp *eigrp_new(const char *AS, vrf_id_t vrf_id)
|
||||||
{
|
{
|
||||||
struct eigrp *eigrp = XCALLOC(MTYPE_EIGRP_TOP, sizeof(struct eigrp));
|
struct eigrp *eigrp = XCALLOC(MTYPE_EIGRP_TOP, sizeof(struct eigrp));
|
||||||
int eigrp_socket;
|
|
||||||
|
|
||||||
/* init information relevant to peers */
|
/* init information relevant to peers */
|
||||||
eigrp->vrf_id = vrf_id;
|
eigrp->vrf_id = vrf_id;
|
||||||
@ -160,14 +159,15 @@ static struct eigrp *eigrp_new(const char *AS, vrf_id_t vrf_id)
|
|||||||
eigrp->passive_interface_default = EIGRP_IF_ACTIVE;
|
eigrp->passive_interface_default = EIGRP_IF_ACTIVE;
|
||||||
eigrp->networks = eigrp_topology_new();
|
eigrp->networks = eigrp_topology_new();
|
||||||
|
|
||||||
if ((eigrp_socket = eigrp_sock_init()) < 0) {
|
eigrp->fd = eigrp_sock_init(vrf_lookup_by_id(vrf_id));
|
||||||
|
|
||||||
|
if (eigrp->fd < 0) {
|
||||||
flog_err_sys(
|
flog_err_sys(
|
||||||
EC_LIB_SOCKET,
|
EC_LIB_SOCKET,
|
||||||
"eigrp_new: fatal error: eigrp_sock_init was unable to open a socket");
|
"eigrp_new: fatal error: eigrp_sock_init was unable to open a socket");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
eigrp->fd = eigrp_socket;
|
|
||||||
eigrp->maxsndbuflen = getsockopt_so_sendbuf(eigrp->fd);
|
eigrp->maxsndbuflen = getsockopt_so_sendbuf(eigrp->fd);
|
||||||
|
|
||||||
eigrp->ibuf = stream_new(EIGRP_PACKET_MAX_LEN + 1);
|
eigrp->ibuf = stream_new(EIGRP_PACKET_MAX_LEN + 1);
|
||||||
|
Loading…
Reference in New Issue
Block a user