マルチキャストメッセージを使用すると、サブネット上で Logical Domains Manager を検出できます。ldmd デーモンは、ネットワーク上で特定のマルチキャストパケットを待機できます。そのマルチキャストメッセージが特定のタイプの場合、ldmd は呼び出し元に対して応答します。これにより、Logical Domains を実行しているシステム上で ldmd を検出できます。
この付録では、サブネット上のシステムで動作している Logical Domains Manager の検出について説明します。
この検出メカニズムは、ldmd デーモンによって使用されるものと同じマルチキャストネットワークを使用して、MAC アドレスを自動的に割り当てるときに衝突を検出します。マルチキャストソケットを構成するには、次の情報を指定する必要があります。
#define MAC_MULTI_PORT 64535 #define MAC_MULTI_GROUP "239.129.9.27" |
デフォルトでは、マシンが接続されているサブネット上ではマルチキャストパケットのみを送信できます。この動作をは、ldmd デーモンに ldmd/hops SMF プロパティーを設定することによって変更できます。
検出メッセージは、他のメッセージと混同しないように明白にマークされている必要があります。次のマルチキャストメッセージ形式により、検出待機プロセスで検出メッセージを識別できます。
#define MAC_MULTI_MAGIC_NO 92792004
#define MAC_MULTI_VERSION 1
enum {
SEND_MSG = 0,
RESPONSE_MSG,
LDMD_DISC_SEND,
LDMD_DISC_RESP,
};
typedef struct {
uint32_t version_no;
uint32_t magic_no;
uint32_t msg_type;
uint32_t resv;
union {
mac_lookup_t Mac_lookup;
ldmd_discovery_t Ldmd_discovery;
} payload;
#define lookup payload.Mac_lookup
#define discovery payload.Ldmd_discovery
} multicast_msg_t;
#define LDMD_VERSION_LEN 32
typedef struct {
char ldmd_version[LDMD_VERSION_LEN];
char hostname[MAXHOSTNAMELEN];
struct in_addr ip_address;
int port_no;
} ldmd_discovery_t;
|
マルチキャストソケットを開きます。
「マルチキャスト通信」 に示すポートおよびグループの情報を使用していることを確認してください。
ソケット経由で multicast_msg_t メッセージを送信します。
メッセージには次の内容を含めるようにしてください。
version_no の有効な値 (MAC_MULTI_VERSION によって定義されている 1)
magic_no の有効な値 (MAC_MULTI_MAGIC_NO によって定義されている 92792004)
LDMD_DISC_SEND の msg_type
マルチキャストソケットで Logical Domains Manager からの応答を待機します。
応答は、次の値が含まれる multicast_msg_t メッセージである必要があります。
version_no の有効な値
magic_no の有効な値
LDMD_DISC_RESP に設定された msg_type
次の情報が含まれる、ldmd_discovery_t 構造で構成されたペイロード
ldmd_version – システム上で動作している Logical Domains Manager のバージョン
hostname – システムのホスト名
ip_address – システムの IP アドレス
port_no – Logical Domains Manager によって通信に使用されているポート番号で、XMPP ポート 6482 にする
Logical Domains Manager からの応答を待機する場合、自動割り当て MAC 衝突検出パケットが破棄されていることを確認してください。