mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-07 03:53:38 +00:00
zebra: Fix route deletion on *BSD
Fix for not handling RTM_CHANGE correctly. This patch change it to delete/add instead. Using RTM_CHANGE on kernels where it works is better, but is left as an exercise for developer who has access and will to fix it on *BSD. [ed note: collaboration with Martin Winter]
This commit is contained in:
parent
be717a0af8
commit
62ccf1e5a3
@ -73,7 +73,7 @@ sin_masklen (struct in_addr mask)
|
|||||||
|
|
||||||
/* Interface between zebra message and rtm message. */
|
/* Interface between zebra message and rtm message. */
|
||||||
static int
|
static int
|
||||||
kernel_rtm_ipv4 (int cmd, struct prefix *p, struct rib *rib, int family)
|
kernel_rtm_ipv4 (int cmd, struct prefix *p, struct rib *rib)
|
||||||
|
|
||||||
{
|
{
|
||||||
struct sockaddr_in *mask = NULL;
|
struct sockaddr_in *mask = NULL;
|
||||||
@ -264,7 +264,7 @@ sin6_masklen (struct in6_addr mask)
|
|||||||
|
|
||||||
/* Interface between zebra message and rtm message. */
|
/* Interface between zebra message and rtm message. */
|
||||||
static int
|
static int
|
||||||
kernel_rtm_ipv6 (int cmd, struct prefix *p, struct rib *rib, int family)
|
kernel_rtm_ipv6 (int cmd, struct prefix *p, struct rib *rib)
|
||||||
{
|
{
|
||||||
struct sockaddr_in6 *mask;
|
struct sockaddr_in6 *mask;
|
||||||
struct sockaddr_in6 sin_dest, sin_mask, sin_gate;
|
struct sockaddr_in6 sin_dest, sin_mask, sin_gate;
|
||||||
@ -378,33 +378,32 @@ kernel_rtm_ipv6 (int cmd, struct prefix *p, struct rib *rib, int family)
|
|||||||
return 0; /*XXX*/
|
return 0; /*XXX*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
kernel_rtm (int cmd, struct prefix *p, struct rib *rib)
|
||||||
|
{
|
||||||
|
switch (PREFIX_FAMILY(p))
|
||||||
|
{
|
||||||
|
case AF_INET:
|
||||||
|
return kernel_rtm_ipv4 (cmd, p, rib);
|
||||||
|
case AF_INET6:
|
||||||
|
return kernel_rtm_ipv6 (cmd, p, rib);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
kernel_route_rib (struct prefix *p, struct rib *old, struct rib *new)
|
kernel_route_rib (struct prefix *p, struct rib *old, struct rib *new)
|
||||||
{
|
{
|
||||||
struct rib *rib;
|
int route = 0;
|
||||||
int route = 0, cmd;
|
|
||||||
|
|
||||||
if (!old && new)
|
|
||||||
cmd = RTM_ADD;
|
|
||||||
else if (old && !new)
|
|
||||||
cmd = RTM_DELETE;
|
|
||||||
else
|
|
||||||
cmd = RTM_CHANGE;
|
|
||||||
|
|
||||||
rib = new ? new : old;
|
|
||||||
|
|
||||||
if (zserv_privs.change(ZPRIVS_RAISE))
|
if (zserv_privs.change(ZPRIVS_RAISE))
|
||||||
zlog (NULL, LOG_ERR, "Can't raise privileges");
|
zlog (NULL, LOG_ERR, "Can't raise privileges");
|
||||||
|
|
||||||
switch (PREFIX_FAMILY(p))
|
if (old)
|
||||||
{
|
route |= kernel_rtm (RTM_DELETE, p, old);
|
||||||
case AF_INET:
|
|
||||||
route = kernel_rtm_ipv4 (cmd, p, rib, AF_INET);
|
if (new)
|
||||||
break;
|
route |= kernel_rtm (RTM_ADD, p, new);
|
||||||
case AF_INET6:
|
|
||||||
route = kernel_rtm_ipv6 (cmd, p, rib, AF_INET6);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (zserv_privs.change(ZPRIVS_LOWER))
|
if (zserv_privs.change(ZPRIVS_LOWER))
|
||||||
zlog (NULL, LOG_ERR, "Can't lower privileges");
|
zlog (NULL, LOG_ERR, "Can't lower privileges");
|
||||||
|
Loading…
Reference in New Issue
Block a user