0

PPPoE のように動作する Ubuntu GNU/Linux マシンでソフトウェア シミュレーションを作成しようとしています。このシミュレーターで発信パケットを取得し、イーサネット ヘッダーを取り除き、PPP フラグ (7E、FF、03、00、および 21) を挿入し、IP 層情報を PPP パケットに配置するようにします。データの後に続く FCS に問題があります。私が知る限り、私が使用しているセル モデムには、CRC16-CCITT メソッドを使用する 2 バイトの FCS があります。このチェックサムを計算するソフトウェアをいくつか見つけましたが、シリアル回線から出力されるものを生成するものはありません (シリアル回線の「スニファー」を使用して、モデムが送信されているものをすべて表示します)。

pppd のソースと Linux カーネル自体を調べたところ、どちらにもデータに FCS を追加する方法があることがわかりました。カーネルハッキングの経験がないので、実装するのはかなり難しいようです。カーネルが生成する FCS と一致する FCS を計算する簡単な方法 (できれば Python) を誰かが思いつくことができますか?

ありがとう。

PS誰かが望むなら、シリアルモデムに得ているデータ出力のサンプルを追加できます。

4

3 に答える 3

0

私は最近、コードをテストして ppp 接続を強制終了するときに次のようなことを行いました..これは私にとってはうまくいきました:

# RFC 1662 Appendix C

def mkfcstab():
    P = 0x8408

    def valiter():
        for b in range(256):
            v = b
            i = 8
            while i:
                v = (v >> 1) ^ P if v & 1 else v >> 1
                i -= 1

            yield v & 0xFFFF

    return tuple(valiter())

fcstab = mkfcstab()

PPPINITFCS16 = 0xffff  # Initial FCS value
PPPGOODFCS16 = 0xf0b8  # Good final FCS value

def pppfcs16(fcs, bytelist):
    for b in bytelist:
        fcs = (fcs >> 8) ^ fcstab[(fcs ^ b) & 0xff]
    return fcs

値を取得するには:

fcs = pppfcs16(PPPINITFCS16, (ord(c) for c in frame)) ^ 0xFFFF

そしてバイトを交換します(私は chr((fcs & 0xFF00) >> 8), chr(fcs & 0x00FF) を使用しました)

于 2011-01-12T17:16:20.897 に答える