第 6 章 VRRP デーモンの実装 32
6.2 vrrpd の構造
vrrpdのモジュール相関図を、図6.1示す。また、その動作概要は第6.3節説明する。
!
!
"#
#$%
&
!')(+*,'
-*.*0/1/2#$3
4 5 6
7 8
9
:
図 6.1: vrrpdのモジュール相関図
¶ ³ struct vrrp_interface
{
struct interface *interface; /* IF info from zebra */
struct interface *phy_interface;/* Pointer of physical interface */
struct in6_addr vrrp_lladdr; /* linklocal address to share */
char state; /* -1:Wait, 0:Init, 1:Master, 2:Backup */
unsigned char id; /* Vrid of this interface */
unsigned char priority; /* Priority of this Interface */
unsigned char adv_interval; /* Advertisement Interval */
int preempt; /* 1:TRUE, 0:FALSE */
int from_master; /* 1:Accept Master’s Address, 0:Not */
struct ether_addr ether_addr; /* Virtual Ethernet Address */
struct thread *thread_advertise; /* thread of advertisement */
struct thread *thread_master_down; /* thread of master down timer */
/* Master States */
unsigned char m_priority; /* Master Router’s Priority */
unsigned char m_adv_interval; /* Master Router’s AdvInterval */
struct in6_addr m_phy_lladdr; /* Physical linklocal address */
struct in6_addr m_vrrp_lladdr; /* linklocal address to share */
/* Additional function */
struct interface *up_interface; /* Pointer of upstream interface */
};
µ ´
図 6.2: vrrp interface構造体
6.2.1 vrrp interface モジュール
本システムでは、仮想インターフェイスをKAMEパッケージ上に実装された疑似デバイス(疑 似インターフェイス)の利用によって実現する。vrrp interfaceモジュールは、ルータの疑似イン ターフェイスに関する情報と各VRIDが保持する情報を格納する。また、vrrp eventモジュール から受けた設定の変更に従い、疑似インターフェイスの設定変更を行う。
各疑似インターフェイスが保持するvrrp interface構造体を図6.2に示す。
疑似インターフェイスの設定は、KAMEによって新たに実装されたioctl関数を利用する。
vrrp interface vrrif set関数は、ioctl関数を利用し、疑似インターフェイスの物理インターフェ イスとMACアドレスを設定する。その中身を図6.3に示す。
6.2.2 vrrp packet モジュール
vrrp packetモジュールは、ルータが送受信するパケットに関するデータを格納し、その送受信
を行う。送受信するパケットには、VRRP生存広告パケット、NDP近隣広告パケットの二種類が ある。
¶ ³ int
vrrp_interface_vrrif_set (char *if_name, u_int parent_index, struct ether_addr *lladdr)
{
int sd;
struct ifreq ifr;
struct vrrpreq vrreq;
bzero (&ifr, sizeof (ifr));
bzero (&vrreq, sizeof (vrreq));
sd = socket (AF_INET, SOCK_DGRAM, 0);
if (sd == -1) {
zlog_warn ("cannot open socket for changing "
"ip address of interface %s: %m", if_name);
return -1;
}
strncpy (ifr.ifr_name, if_name, sizeof(ifr.ifr_name));
ifr.ifr_data = (caddr_t)&vrreq;
vrreq.vr_parent_index = parent_index;
vrreq.vr_lladdr.sa_family = AF_LINK;
vrreq.vr_lladdr.sa_len = ETHER_ADDR_LEN;
bcopy (lladdr, vrreq.vr_lladdr.sa_data, ETHER_ADDR_LEN);
if (ioctl (sd, SIOCSETVRRP, (caddr_t) &ifr) == -1) {
zlog_warn ("cannot set vrrp parent interface %s "
"(ioctl): %m", if_name);
close (sd);
return -1;
}
close (sd);
return 0;
}
µ ´
図 6.3: vrrp interface vrrif set()関数
VRRP生存広告パケットの送受信は、Rawソケットによって行われる。マスタールータは、
vrrp stateモジュールより受けとった現在の状態を元にパケットを作成し、送信する。バックアッ
プルータは、マスターから受信したパケットを解析し、受け取るか破棄するかを判断する。受信し たパケットの内容と現在の自分の状態から、状態の変更の判断を行う。変更する場合はvrrp state モジュールへ移行する。
NDP近隣広告パケットの送信は、Rawソケットによって行われる。
6.2.3 vrrp event モジュール
vrrp eventモジュールは、状態の変更に関する動作を行う。
具体的には、初期化状態の動作を行うstate initialize関数、マスター状態への設定変更を行う change to master関数、バックアップ状態への設定変更を行うchange to backup関数がある。
6.2.4 vrrp zebra モジュール
図6.4にvrrp zebraモジュールの概念を示す。
vrrp zebraモジュールは、Zebra独自のプロトコルを用いて、zebraデーモンとシステム情報を 交換する。交換されるシステム情報は、ルータインターフェイス状態、ルータ広告の送受信に関す るもの、そしてvrrpdの持つ経路情報である。
zebraデーモンからルータインターフェイスの状態が渡された場合、適切なvrrp interfaceモ ジュールの状態を更新する。ルータインターフェイスの状態は、vrrp zebraモジュールからzebra デーモンへ渡されることは無い。
vrrp eventモジュールで状態に変更があった場合、vrrp zebraモジュールはzebraデーモンへと ルータ広告の送受信に関する情報を送信する。ルータ広告の送受信に関する情報は次の二種類で ある
• 送信の有無
マスター状態に変更が移行した時に、ルータ広告の送信を始める。それ以外の状態では、ルー タ広告の送信を止める。
• 送信するインターフェイス
ルータ広告を送信するインターフェイスを指定する。指定するインターフェイスは、vrrpd でIPv6アドレスやMACアドレスを設定した疑似インターフェイスである。それによって、
終端ネットワーク内のホストのデフォルトゲートウェイを仮想ルータに向けることが可能に なる。
また、vrrp eventモジュールで状態に変更があった場合、vrrp zebraモジュールはzebraデーモ ンへ経路情報を送信する。マスター状態に移行した場合、予め設定しておいたプレフィックス情報
をzebraデーモンに渡す。逆にマスター以外の状態になった場合、zebraデーモンからプレフィッ
クス情報を消去する。
! #""$%
&(') #""$%
"*+
,-.+
! #""$%
&/$"
'0 "1%2"
3#*,-"
図6.4: vrrp zebraモジュールの概念
6.2.5 vrrp top モジュール
vrrp topモジュールは、VRRPデーモン全体の動作を制御するモジュールである。vrrp interface モジュールなどで行った設定を用いた動作の開始、終了を行う。