Skip to main content.
Google custom search

FreeBSD のネットワークドライバーを NetBSD に移植するためのメモ


概要 (トップ)

Matthias Drochner は、FreeBSD のネットワークドライバーを NetBSD に 移植する時に見つけた相異点をまとめています。 これが役に立つことを願っています。

基本的なインクルードファイルや定義要素 (トップ)

  • #include ファイル名 / 場所は、思ったより異なっています。

  • パケットフィルター: FreeBSD では "BPF", NetBSD では "BPFILTER" です。 [理由は無い様に見受けられますが、多くの OS 間で異なっている様です。(DEC: "packetfilter")]

  • NetBSD では、"opt_inet.h" と "opt_ns.h" をインクルードする必要が有ります。

  • NetBSD には、グローバル変数 "bootverbose" が存在しません。

  • NetBSD は、集中管理された PCI ID データベースと PCI レジスターの定義を持っています。

  • if_media: FreeBSD: IFM_1000_SX, NetBSD: IFM_1000_FX [1000_FX と言う物は存在しません。- NetBSD が間違っています。]

  • <sys/queue.h> の中の要素の違い (NetBSD には SLIST の様な物は存在しません。 名前の違いに理由は有りません。しかし、SLIST の様な物は(SIMPLEQ よりオーバーヘッドが少ないので) NetBSD にとっても有用です)。

ネットワーク固有でないフレームワーク (トップ)

  • オートコンフィギュレーションのフレームワークが異なります。

  • デバイス名の表示: FreeBSD では name:unit, NetBSD では xname です。 ("struct ifnet" も同様です。)

  • 割り込み用のハンドラーが、FreeBSD では void、NetBSD では int です。 [stray interrupts の検出???]

  • bus.h: マップされた範囲の仮想アドレスへのアクセス (全てのハードウェアがサポートしているわけではないので、 一般的にはリニアーマッピングは避けた方が良いです。しかし、どうしても必要なら BUS_SPACE_MAP_LINEAR がこれを提供すべきです。) [NetBSD の bus_space フレームワークには存在しません。移植性を低下させる原因なので、 可能なら bus_space_xxx を使いましょう。]

  • bus_dma 関係(FreeBSD は、まだ古い機能を使っています。)

ネットワーク関連 (トップ)

  • 外部 mbuf ストレージ処理: FreeBSD では xxxfree() への引数は有りません。 ドライバーがリファレンスカウントを与えます。 NetBSD では xxxfree() への引数がはっきりしません。 リファレンスカウントは自動的におこないます。

  • FreeBSD は汎用の ether_ioctl() を持っています。 [良い - 汎用のコードを削除する。]

  • アドレスバイトのための "struct ether_addr" のメンバー: FreeBSD では "octet" を使い、 NetBSD では "ether_addr_octet" を持っています。 [理由は無い]

  • softc の "ethercom" 対 "arpcom" [技術的には、 NetBSD が正しい。]

  • イーサネットアドレスへのアクセス: FreeBSD: "arpcom" の中でアクセスされる。 NetBSD: ether_ifattach() へ渡され、ifp を経由してアクセスされる。 (LLADDR() - アライメント問題の監視!) [NetBSD では実行中のアドレス変更を扱うことが出来ません。]

  • マルチキャストアドレスのリスト: FreeBSD では ifp->if_multiaddrs の、そのままのリスト、 NetBSD では "struct ethercom" の一部と言う、特別なフレームワークです。

  • "struct ifnet" のメンバーが異っており、 異なる初期化 (if_attach、ether_ifattach) を行う。 xname 対 name:unit、 FreeBSD では xxxinit() が ether_ioctl() によって使われる、 イーサネットアドレス。

  • bpf 関数の引数: FreeBSD では ipf, NetBSD では ifp->if_bpf

  • 受信パケットの上位レイヤーへの引渡し: FreeBSD では ether_input()に、イーサネットヘッダーを分離して渡す。 NetBSD では全てのパケットを、 ifp->ifp_input と間接的に経由して渡す。

  • NetBSD は MII フレームワークを持っており、ドライバーはレジスターへのアクセスを提供するだけです。


Back to NetBSD ドキュメンテーション: カーネル