#include "vrrp_arp.h"
#include "vrrp_packet.h"
+#define VRRP_LOGPFX "[CORE] "
+
+const char *vrrp_state_names[3] = {
+ [VRRP_STATE_INITIALIZE] = "Initialize",
+ [VRRP_STATE_MASTER] = "Master",
+ [VRRP_STATE_BACKUP] = "Backup",
+};
+
+const char *vrrp_event_names[2] = {
+ [VRRP_EVENT_STARTUP] = "Startup",
+ [VRRP_EVENT_SHUTDOWN] = "Shutdown",
+};
+
+
/* Utility functions ------------------------------------------------------- */
/*
ssize_t sent = sendto(vr->sock, pkt, (size_t)pktlen, 0, &dest,
sizeof(struct sockaddr_in));
+
+ if (sent < 0) {
+ zlog_warn(VRRP_LOGPFX VRRP_LOGPFX_VRID
+ "Failed to send VRRP Advertisement",
+ vr->vrid);
+ }
}
/* FIXME:
int ret;
struct connected *c;
- errno = 0;
frr_elevate_privs(&vrrp_privs) {
vr->sock = socket(AF_INET, SOCK_RAW, IPPROTO_VRRP);
}
- if (vr->sock < 0)
- perror("Error opening VRRP socket");
+ if (vr->sock < 0) {
+ zlog_warn(VRRP_LOGPFX VRRP_LOGPFX_VRID
+ "Can't create VRRP socket",
+ vr->vrid);
+ return errno;
+ }
/* Join the multicast group.*/
ret = setsockopt(vr->sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&req,
sizeof(struct ip_mreq));
if (ret < 0) {
- // int err = errno;
- /* VRRP_LOG(("cant do IP_ADD_MEMBERSHIP errno=%d\n", err)); */
- return -1;
+ zlog_warn(VRRP_LOGPFX VRRP_LOGPFX_VRID
+ "Can't join VRRP multicast group",
+ vr->vrid);
+ return errno;
}
return 0;
}
/* Call our handlers, then any subscribers */
vrrp_change_state_handlers[to](vr);
hook_call(vrrp_change_state_hook, vr, to);
+ zlog_info(VRRP_LOGPFX VRRP_LOGPFX_VRID "%s -> %s", vr->vrid,
+ vrrp_state_names[vr->fsm.state], vrrp_state_names[to]);
vr->fsm.state = to;
}
{
struct vrrp_vrouter *vr = thread->arg;
+ zlog_info(VRRP_LOGPFX VRRP_LOGPFX_VRID "Adver_Timer expired", vr->vrid);
+
if (vr->fsm.state == VRRP_STATE_BACKUP) {
vrrp_send_advertisement(vr);
/* FIXME: vrrp_send_gratuitous_arp(vr); */
}
/*
- * Called when Master_Down timer expires.
+ * Called when Master_Down_Timer expires.
*/
static int vrrp_master_down_timer_expire(struct thread *thread)
{
- /* struct vrrp_vrouter *vr = thread->arg; */
+ struct vrrp_vrouter *vr = thread->arg;
+
+ zlog_info(VRRP_LOGPFX VRRP_LOGPFX_VRID "Master_Down_Timer expired",
+ vr->vrid);
return 0;
}
/* Create socket */
int ret = vrrp_socket(vr);
- if (ret < 0) {
- zlog_warn("Cannot create VRRP socket\n");
+ if (ret < 0)
return ret;
- }
/* Schedule listener */
/* ... */
*/
int vrrp_event(struct vrrp_vrouter *vr, int event)
{
+ zlog_info(VRRP_LOGPFX VRRP_LOGPFX_VRID "'%s' event", vr->vrid,
+ vrrp_event_names[vr->fsm.state]);
return vrrp_event_handlers[event](vr);
}
#define VRRP_MCAST_GROUP_HEX 0xe0000012
#define IPPROTO_VRRP 112
+#define VRRP_LOGPFX_VRID "[VRID: %u] "
+
/* threadmaster */
extern struct thread_master *master;
/* State machine ----------------------------------------------------------- */
-#define VRRP_STATE_INITIALIZE 1
-#define VRRP_STATE_MASTER 2
-#define VRRP_STATE_BACKUP 3
-#define VRRP_EVENT_STARTUP 1
-#define VRRP_EVENT_SHUTDOWN 2
+#define VRRP_STATE_INITIALIZE 0
+#define VRRP_STATE_MASTER 1
+#define VRRP_STATE_BACKUP 2
+#define VRRP_EVENT_STARTUP 0
+#define VRRP_EVENT_SHUTDOWN 1
+
+extern const char *vrrp_state_names[3];
+extern const char *vrrp_event_names[2];
/*
* This hook called whenever the state of a Virtual Router changes, after the
#include "vrrp.h"
#include "vrrp_arp.h"
+#define VRRP_LOGPFX "[ARP] "
+
/*
* The size of the garp packet buffer should be the large enough to hold the
* largest arp packet to be sent + the size of the link layer header for the
/* If the interface doesn't support ARP, don't try sending */
if (ifp->flags & IFF_NOARP) {
zlog_warn(
+ VRRP_LOGPFX VRRP_LOGPFX_VRID
"Unable to send gratuitous ARP on %s; has IFF_NOARP\n",
- ifp->name);
+ vr->vrid, ifp->name);
return;
}
/* Send garp */
inet_ntop(AF_INET, v4, astr, sizeof(astr));
- zlog_info("Sending gratuitous ARP on %s for %s", ifp->name, astr);
+ zlog_info(VRRP_LOGPFX VRRP_LOGPFX_VRID
+ "Sending gratuitous ARP on %s for %s",
+ vr->vrid, ifp->name, astr);
sent_len = vrrp_send_garp(ifp, garpbuf, garpbuf_len);
if (sent_len < 0)
- zlog_warn("Error sending gratuitous ARP on %s for %s",
- ifp->name, astr);
+ zlog_warn(VRRP_LOGPFX VRRP_LOGPFX_VRID
+ "Error sending gratuitous ARP on %s for %s",
+ vr->vrid, ifp->name, astr);
}
void vrrp_garp_send_all(struct vrrp_vrouter *vr)
/* If the interface doesn't support ARP, don't try sending */
if (ifp->flags & IFF_NOARP) {
zlog_warn(
+ VRRP_LOGPFX VRRP_LOGPFX_VRID
"Unable to send gratuitous ARP on %s; has IFF_NOARP\n",
- ifp->name);
+ vr->vrid, ifp->name);
return;
}
}
if (garp_fd > 0)
- zlog_info("Initialized gratuitous ARP socket");
+ zlog_info(VRRP_LOGPFX "Initialized gratuitous ARP socket");
else {
- perror("Error initializing gratuitous ARP socket");
- zlog_err("Error initializing gratuitous ARP socket");
+ zlog_err(VRRP_LOGPFX
+ "Error initializing gratuitous ARP socket");
return;
}
}
{
char ethstr[ETHER_ADDR_STRLEN];
char ipstr[INET_ADDRSTRLEN];
- const char *stastr;
-
- switch (vr->fsm.state) {
- case VRRP_STATE_INITIALIZE:
- stastr = "Initialize";
- break;
- case VRRP_STATE_MASTER:
- stastr = "Master";
- break;
- case VRRP_STATE_BACKUP:
- stastr = "Backup";
- break;
- }
+ const char *stastr = vrrp_state_names[vr->fsm.state];
struct ttable *tt = ttable_new(&ttable_styles[TTSTYLE_BLANK]);