見出し画像

TWSNMP開発日誌:モバイル版のDHCPサーバーテスト機能ができた

今朝は5時から開発開始です。
昨日の午後から

の4時間半スペシャルを聞きならばモバイル版TWSNMPにDHCPサーバーテスト機能を作っています。3時間分聞いたところで、なんとなくできました。

DHCPで通信するポートをオープンしてパケットをモニタします。DCHPサーバーポート(UDP67番)をモニタ すればクライアントがブロードキャストで送信するパケットを受信できます。クライアントポート(UDP68番)をモニタすれば、サーバーのブロードキャスト応答を受信できます。
<Send Discover>ボタンをクリックすれば、DHCPのDiscoverパケットを送信できます。このパケットを送信すれば接続しているネットワークにあるDHCPサーバーから応答があるのでDHCPサーバーを発見できます。
この機能は20年前に作ったオリジナルのTWSNMPにもある機能です。
Discoverパケットを送信した時のパケットキャプチャーは、

のような感じです。このパケットを送信するソースコードは、

を真面目に読んで

  void _sendDhcpDiscover() async {
    if (_dhcpUDP == null) {
      return;
    }
    await _dhcpUDP!.send(_makeDHCPPkt(), Endpoint.broadcast(port: const Port(67)));
  }

  List<int> _makeDHCPPkt() {
    List<int> r = [];
    r.add(0x01); // BOOTP Request
    r.add(0x01); // HW Type Ethernet
    r.add(0x06); // HW Addr len 6
    r.add(0x00);
    r.add(0x00); // XID
    r.add(0x01);
    r.add(0x02);
    r.add(0x03);

    r.add(0x00); // Sec
    r.add(0x00);

    r.add(0x80); // Flag Bcast
    r.add(0x00);

    r.add(0x00); // Client IP
    r.add(0x00);
    r.add(0x00);
    r.add(0x00);

    r.add(0x00); // Your IP
    r.add(0x00);
    r.add(0x00);
    r.add(0x00);

    r.add(0x00); // Next IP
    r.add(0x00);
    r.add(0x00);
    r.add(0x00);

    r.add(0x00); // Relay IP
    r.add(0x00);
    r.add(0x00);
    r.add(0x00);

    r.add(0x5d); //MAC Address
    r.add(0x01);
    r.add(0x02);
    r.add(0x03);
    r.add(0x04);
    r.add(0x05);
    // Padding
    for (var i = 0; i < 10; i++) {
      r.add(0x00);
    }
    // Server host name
    for (var i = 0; i < 16 * 4; i++) {
      r.add(0x00);
    }
    // Boot File Name
    for (var i = 0; i < 16 * 8; i++) {
      r.add(0x00);
    }
    // Magic
    r.add(0x63);
    r.add(0x82);
    r.add(0x53);
    r.add(0x63);
    // Discover
    r.add(0x35);
    r.add(0x01);
    r.add(0x01);
    // End
    r.add(0xff);
    return r;
  }

のように作りました。ちゃんと自宅のDHCPサーバーは応答を返します。

しかし、オリジナルのTWSNMPと同じでクライアントのポートは、DHCPでアドレスを取得している環境ではオープンできません。

のようなエラーになります。
いつか、実機を固定IPにして試してみようと思います。

明日に続く

開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。