17

質問:

ケーブル障害検出ソフトウェアのセクションをテストしていますが、cat5 ケーブルでケーブル障害を確実かつ再現可能に生成したいと考えています。

現在、私は 1 メートルの長さのねじれていないケーブルを使用しており、電源の横でケーブルを手動でくねらせていますが、アプリケーションの障害を検出できません (イーサネット ASIC からイーサネット障害カウンターを読み取っています)。これは、エラーが発生していないためか、ソフトウェア/ハードウェアの検出に問題があるためか、わかりません。

ソフトウェアでこれを行う方法はありますか?

Java や Python などの高水準言語で何かを書くことに落ち着いて、最後の手段として C でまとめることもできますが、純粋に問題を修正するためにイーサネット ドライバを書き直すことは避けたいと思っています。可能なバグ。

[編集]:ケーブル障害を作成したい- それらを検出しません。

[編集]: FTP と SCP を介して大きなファイルを転送しましたが、改ざんされたケーブルに問題はありませんでした。wireshark でトラフィックを検査している間、エラーは発生しませんでした。

[編集]: pythonの同様の質問も参照してください。

解決:

さて、C との戦いに 1 日以上費やした後、これが Python のソリューションです。

まず、イーサネット カードの自動チェックサムを無効にします。

sudo ethtool -K eth1 tx off

次に、危険なフレームを python から送信します。

#!/usr/bin/env python

from socket import *

#
# Ethernet Frame:
# [
#   [ Destination address, 6 bytes ]
#   [ Source address, 6 bytes      ]
#   [ Ethertype, 2 bytes           ]
#   [ Payload, 40 to 1500 bytes    ]
#   [ 32 bit CRC chcksum, 4 bytes  ]
# ]
#

s = socket(AF_PACKET, SOCK_RAW)
s.bind(("eth1", 0))
src_addr = "\x01\x02\x03\x04\x05\x06"
dst_addr = "\x01\x02\x03\x04\x05\x06"
payload = ("["*30)+"PAYLOAD"+("]"*30)
checksum = "\x00\x00\x00\x00"
ethertype = "\x08\x01"
s.send(dst_addr+src_addr+ethertype+payload+checksum)

複雑にならないと誰が言った...

PS: Python が大好きです。

4

1 に答える 1

7

C で作業している場合は、 を使用して生のイーサネット フレームを送信し、socket(AF_PACKET, SOCK_RAW, ...)自分で生成した生のバッファへのポインタを渡すことができます (たとえば、wikipediaのフレーム レイアウトに従ってください)。

これを行ってから長い時間が経ったので、代表的なコード スニペットを書くつもりはありません...

于 2011-06-13T11:51:33.317 に答える