最初の段階はアセンブリです。 私のマシンでビルド環境を上げる方法は、 openwrt Webサイト自体とさまざまな記事によく書かれているので、この記事は舞台裏に置いておきます。 ツールチェーンが組み込まれた環境があり、標準のopenwrtパッケージをビルドできるとします。
パッケージをビルドするには、 ここで取得できるhanstunnelソースと、パッケージの説明を含むMakefile、configファイル、initスクリプトファイルが必要です。 パッチの説明としてここで最後の3つを偶然見つけました。 誰かが直接リンクを見つけるかもしれませんが、とにかく私に合っていました。 パッケージをビルドするには、カスタムなどの何らかの種類のフォルダーを作成し、将来のパッケージのフォルダーをその中に入れ、そこにパッケージ/フィード/パッケージからのリンクを入れます。 パッケージのMakefileをわずかにファイルし、その横にあるsrcフォルダーのソースコードを収集し、
  それが起こったことです 
        
        
        
      
    
      
 #著作権(C)2006 OpenWrt.org
 #
 #これは、GNU General Public License v2の下でライセンスされたフリーソフトウェアです。
 #詳細については、/ライセンスを参照してください。
 #
 #$ Id:Makefile 6008 2007-01-06 18:39:10Z nbd $
 include $(TOPDIR)/rules.mk
 PKG_NAME:= hanstunnel
 PKG_VERSION:= 0.4.3
 PKG_RELEASE:= 1
 PKG_BUILD_DIR:= $(BUILD_DIR)/ $(PKG_NAME)-$(PKG_VERSION)
 include $(INCLUDE_DIR)/package.mk
パッケージ/ hanstunnelを定義する
        セクション:= net
        カテゴリー:=ネットワーク
        サブメニュー:=ファイアウォールトンネル
        依存:= + libstdcpp + kmod-tun
        タイトル:= Hans IP over ICMP
         URL:= http://code.gerade.org/hans/
エンデフ
パッケージ/ hanstunnel /説明の定義
         Hansは、ICMPエコーパケットを介してIPv4をトンネリングすることを可能にし、
        したがって、pingトンネルと呼ぶことができます。 これは次の場合に便利です。
        インターネットにアクセスできる状況にいる
        ファイアウォールで保護されていますが、pingは許可されています。 エンデフ
エンデフ
ビルドの定義/準備
         echo PREPARE PREPARE
         mkdir -p $(PKG_BUILD_DIR)
         cp -r ./src/* $(PKG_BUILD_DIR)/
エンデフ
ビルドの定義/コンパイル 
         $(メイク)-C $(PKG_BUILD_DIR)GCC = $(TARGET_CC)GPP = $(TARGET_CXX)
エンデフ 
 
パッケージ/ hanstunnel / installを定義します
         $(INSTALL_DIR)$(1)/ usr / sbin
         $(INSTALL_BIN)$(PKG_BUILD_DIR)/ hans $(1)/ usr / sbin /
         $(INSTALL_DIR)$(1)/etc/init.d
         $(INSTALL_BIN)./files/hans.init $(1)/etc/init.d/hans
         $(INSTALL_DIR)$(1)/ etc / config
         $(INSTALL_CONF)./files/hans.config $(1)/ etc / config / hans
エンデフ
 $(eval $(BuildPackage、hanstunnelを呼び出す))
      ビルドファイルの頭も少しファイルする必要がありました
  Makefileアセンブリ 
        
        
        
      
    
      #LDFLAGS + = `sh osflags ld $(MODE)` CFLAGS + = -c -g -DLINUX -DHAVE_LINUX_IF_TUN_H TUN_DEV_FILE = src / tun_dev_linux.c #GCC = gcc #GPP = g ++ .PHONY:ディレクトリ すべて:ハンス ディレクトリ:build_dir build_dir: mkdir -pビルド tunemu.o:ディレクトリbuild / tunemu.o hans:ディレクトリbuild / tun.o build / sha1.o build / main.o build / client.o build / server.o build / auth.o build / worker.o build / time.o build / tun_dev.o build / echo.o build / exception.o build / utility.o $(GPP)-o hans build / tun.o build / sha1.o build / main.o build / client.o build / server.o build / auth.o build / worker.o build / time.o build / tun_dev .o build / echo.o build / exception.o build / utility.o $(LDFLAGS) build / utility.o:src / utility.cpp src / utility.h $(GPP)-c src / utility.cpp -o $ @ -o $ @ $(CFLAGS) build / exception.o:src / exception.cpp src / exception.h $(GPP)-c src / exception.cpp -o $ @ $(CFLAGS) build / echo.o:src / echo.cpp src / echo.h src / exception.h $(GPP)-c src / echo.cpp -o $ @ $(CFLAGS) build / tun.o:src / tun.cpp src / tun.h src / exception.h src / utility.h src / tun_dev.h $(GPP)-c src / tun.cpp -o $ @ $(CFLAGS) build / tun_dev.o: $(GCC)-c $(TUN_DEV_FILE)-o build / tun_dev.o -o $ @ $(CFLAGS) build / sha1.o:src / sha1.cpp src / sha1.h $(GPP)-c src / sha1.cpp -o $ @ $(CFLAGS) build / main.o:src / main.cpp src / client.h src / server.h src / exception.h src / worker.h src / auth.h src / time.h src / echo.h src / tun。 h src / tun_dev.h $(GPP)-c src / main.cpp -o $ @ $(CFLAGS) build / client.o:src / client.cpp src / client.h src / server.h src / exception.h src / config.h src / worker.h src / auth.h src / time.h src / echo h src / tun.h src / tun_dev.h $(GPP)-c src / client.cpp -o $ @ $(CFLAGS) build / server.o:src / server.cpp src / server.h src / client.h src / utility.h src / config.h src / worker.h src / auth.h src / time.h src / echo h src / tun.h src / tun_dev.h $(GPP)-c src / server.cpp -o $ @ $(CFLAGS) ビルド/ auth.o:src / auth.cpp src / auth.h src / sha1.h src / utility.h $(GPP)-c src / auth.cpp -o $ @ $(CFLAGS) build / worker.o:src / worker.cpp src / worker.h src / tun.h src / exception.h src / time.h src / echo.h src / tun_dev.h src / config.h $(GPP)-c src / worker.cpp -o $ @ $(CFLAGS) build / time.o:src / time.cpp src / time.h $(GPP)-c src / time.cpp -o $ @ $(CFLAGS) きれいな: rm -f build / tun.o build / sha1.o build / main.o build / client.o build / server.o build / auth.o build / worker.o build / time.o build / tun_dev.o build / echo.oビルド/ exception.oビルド/ utility.oビルド/ tunemu.o hans rm -dfビルド build / tunemu.o:src / tunemu.h src / tunemu.c $(GCC)-c src / tunemu.c -o build / tunemu.o
ファイルを所定の場所に配置すると、次のようになります。
$ ls -Rカスタム カスタム: ハンストンネル カスタム/ハンストン: ファイルMakefile src custom / hanstunnel / files: hans.config hans.init custom / hanstunnel / src: Makefile osflags src custom / hanstunnel / src / src: auth.cpp client.h echo.h main.cpp sha1.cpp time.cpp tun_dev_darwin_emu.c tun_dev.h tun_dev_svr4.c tun.h worker.cpp auth.h config.h exception.cpp server.cpp sha1.h time.h tun_dev_freebsd.c tun_dev_linux.c tunemu.c utility.cpp worker.h client.cpp echo.cpp exception.h server.h sha1_license.txt tun.cpp tun_dev_generic.c tun_dev_openbsd.c tunemu.h utility.h
次に、buildrootのルートに移動して、楽しく入力します
$ make package / feeds / packages / hanstunnel / compile -j5 make [1]パッケージ/フィード/パッケージ/ hanstunnel /コンパイル make [2] -Cパッケージ/カーネル/ linuxコンパイル make [2] -C package / libs / toolchain compile make [2] -C custom / hanstunnel compile
パッケージの準備はすべて整いました。残りの隣のbinフォルダーにあります。
確認する必要があります。 ここで私を待っていたのは残念です。 私のコンピューターが自宅のLANにあるため、トンネルは問題なくすぐに上がりました。 喜んで外部から接続を確認しに行ったのは私だけでしたが、上記のように、openwrtを含むパッケージは残っていましたが、受信者はそれらを見ませんでした。 クライアントモードのルーターでhansを実行しているときにも同じ状況が発生しました。 よく考えた結果、ICMPダンプを削除して、ルーターとコンピューターからの接続の違いを探すことにしました。 問題はICMPチェックサムにあり、wiresharkは私に喜んで知らせてくれました。 私は正直に計算機を取り、私自身はecho.cppで規定されているアルゴリズムに従って量を手動で計算しました。これは公式のものと非常に似ています。 何でも判明しましたが、必要なものではありませんでした。 その結果、問題は奇数のパケット長とMIPSアーキテクチャにあることが判明しました。 RFCの良い人は、合計に最後のバイトを追加するだけでよいと書いていますが、実際はそうではありません。 最後のバイトではなく、2バイトを追加する必要があります。2番目のバイトは0です。ビッグエンディアンアーキテクチャでは、バイトを256倍した値になります。
icmpChecksum関数の結果は次のとおりです。
 uint16_t Echo :: icmpChecksum(const char * data、int length)
 {
     uint16_t * data16 =(uint16_t *)データ;
     uint32_t sum = 0;
     for(合計= 0;長さ> 1;長さ-= 2)
         sum + = * data16 ++;
     if(長さ== 1)
     {
         unsigned char tail [2] = {*(unsigned char *)data16、0};
         sum + = *(uint16_t *)テール;
     }
     while(合計>> 16)
         sum =(sum >> 16)+(sum&0xffff);
     return〜sum;
 }
      彼女と一緒に、最終的にすべてが正常に機能しました。 ハッピーエンド。
UPD : jcmvbkbcのより美しいバージョンのテールを修正