代码版本:
通告处理
VRRP 调度器处理传入的 VRRP 通告,并根据实例的当前状态对其进行处理:

代码流程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| vrrp_read_dispatcher_thread vrrp_dispatcher_read read(fd, vrrp_buffer, VRRP_PACKET_TEMP_LEN);
vrrp = vrrp_index_lookup(hd->vrid, fd);
prev_state = vrrp->state; VRRP_FSM_READ(vrrp, vrrp_buffer, len); vrrp_leave_master vrrp_state_master_rx ret = vrrp_check_packet(vrrp, buf, buflen);
if (Lower priority) { vrrp_send_adv(vrrp, vrrp->priority); vrrp_send_gratuitous_arp(vrrp); return 0; } else { vrrp->ms_down_timer = 3 * vrrp->adver_int + VRRP_TIMER_SKEW(vrrp); vrrp->wantstate = VRRP_STATE_BACK; vrrp->state = VRRP_STATE_BACK; return 1; } vrrp_backup vrrp_state_backup if(Higher priority) vrrp->ms_down_timer = 3 * vrrp->adver_int + VRRP_TIMER_SKEW(vrrp); else vrrp->wantstate = VRRP_STATE_GOTO_MASTER; vrrp_send_adv(vrrp, vrrp->priority);
|
vrrp_send_adv
- VRRP 协议报文封装在 IP 报文中,发送到分配给 VRRP 的 IP 组播地址
- 在IP 报文头中
- 源地址为发送报文接口的主 IP 地址
- 目的地址为 224.0.0.18
- TTL 必须是 255。(VRRP 路由器会丢弃 TTL 不等于 255 的 VRRP 协议报文)
- 协议号是 112
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| vrrp_send_adv vrrp_build_pkt(vrrp, prio) vrrp_build_ip ip->ttl = VRRP_IP_TTL; ip->protocol = (vrrp->auth_type == VRRP_AUTH_AH) ? IPPROTO_IPSEC_AH : IPPROTO_VRRP; ip->saddr = VRRP_PKT_SADDR(vrrp); ip->daddr = htonl(INADDR_VRRP_GROUP); ip->check = in_csum((u_short *) ip, ip->ihl * 4, 0); vrrp_build_vrrp(vrrp, prio, vrrp->send_buffer, vrrp->send_buffer_size)
|
keepalived