Jc-patchの実装 Jc-patch概要 BSDOS2.1→FreeBSD2.2.8 FreeBSD2.2.8→FreeBSD3.3 Jc-patchの概要 BSDOS2.1 RiscomN1を使用 昔、西田さんが書いた 衛星ネットワークで送信者が特定の相手だけに データを送るために利用 衛星ネットワーク PCからはシリアル通信 データリンクプロトコルはHDLC 受信者はすべてのデータを受け取る IPアドレスをデータリンクアドレスに利用 IPパケットをether_headerでカプセリング Mac addressの代わりにIPアドレスをsrc,dst に挿入し、残り2バイトをpadding パケットヘッダ ip header Src Dst データ Src Dst データ 先頭2byteを0でパディング Src Dst type 何故、今JCが必要か UDLRのdraftがmac addressや、src,dstを持 つデータリンクヘッダを前提としている Draft-orientedなUDLRの実験に必要 UDLRで運用されるAIIIに必要 UDLR概要 UDLに送信する パケットを トンネリング ブロードキャストエミュレーション UDL 脱カプセル化し データリンク パケットを ルータ ルータ Receiver Receiver BDL ルータ Receiver UDLに送信 Internet ルータ Feeder BSDOS2.1→FreeBSD2.2.8への移植 Attach,detachルーチンの書き替え RisomN2のデバイスドライバへjcルーチン の呼び出し部分を追加 Bpfで吸い上げるレイヤが違う BSDOSでのPoint-to-point protocol struct p2pcom { struct ifnet p2p_if; /* network-visible interface */ int p2p_oldflags; /* the old flags */ int (*p2p_input) __P((struct p2pcom *, struct mbuf *)); int (*p2p_modem) __P((struct p2pcom *, int)); /* modem event */ int (*p2p_mdmctl) __P((struct p2pcom *, int)); /* modem control */ int (*p2p_hdrinput) __P((struct p2pcom *, u_char *, int)); struct p2pprotosw *p2p_proto; int p2p_type; /* current type */ struct ifqueue p2p_isnd; /* queue for interactive packets */ struct p2pcom *p2p_next; /* next structure in protocol's list */ struct p2pcom **p2p_prevp; /* prev. structure in protocol's list */ struct mbuf *p2p_ibuf; /* input mbuf */ void }; *p2p_private; /* protocol private data */ どのへんが違ったか BSDOS FreeBSD Ip layer p2pcom{ p2p_input() →jc_input() p2p_output() →jc_output() p2p_shutdown() →jc_shutdown() p2p_attach() →jc_attach() p2p_detach() →jc_detach() Device driver Ip layer Ifnet{ if_output()→jc_output if_init() ….. jc_attach() } jc_detach() jc_output() Device driver Bpfへのtap BSDOSはリンクレイヤでtap -リンクレイヤがそれぞれbpfへのtapルーチンを持つ FreeBSDはcardのドライバでtap -tapルーチンはbpf_mtap()1つ -cardのattach時にbpf_attach()を呼び、tapする時にヘッ ダ長など必要な情報を取得 -普通、cardごとにデータリンクプロトコルは1つなので、 Struct bpfの情報はattachされておわり。 -HDLCではppp_header,JCではether_headerを使用する ので、attachされたデータリンクプロトコルごとにstruct bpfの内容を書きかえるルーチンを追加 bpf struct bpf_if { struct bpf_if *bif_next; /* list of all interfaces */ struct bpf_d *bif_dlist; /* descriptor list */ u_int bif_dlt; /* link layer type */ u_int bif_hdrlen; /* length of header (with padding) */ struct ifnet *bif_ifp; /* corresponding interface */ }; FreeBSD2.2.8→FreeBSD3.3への移植 Ifnet{ Struct ifaddr *ifaddrlist FreeBSD2.2.8 Struct ifaddrhead *ifaddrhead FreeBSD3.3 マクロでアドレスを取り出す Optionの追加がちょこっと違った FreeBSD2.2.8→FreeBSD3.3への移植 フロッピー2枚のインストールがめんちゃい Kernelがでかくてmakeが長い Icmp_bmcastechoってなによ! 今後の予定 3.3FreeBSDへUDLRを移植し、JC上で動 作させる JC+UDLRルータをAIIIで運用する Ipv6への対応 3.3がftpサイトから無くなる前に、次の versionに移植する。
© Copyright 2024 ExpyDoc