Go で書かれた Ethercat マスターに取り組んでいます。基礎となるライブラリはhttp://github.com/distributed/ecatにあり、UDP とマルチキャストを使用する 1 つのリンク レベル ドライバが含まれています。このリンク レベル ドライバーを複数のプラットフォーム (OS X、Windows、Linux) および異なるネットワーク構成で一貫して動作させるのに問題があります。
Ethercat に慣れていない人のために、これがどのように機能するかを説明します。Ethercat は、イーサネットに基づく産業用バス システムです。1 つのバス マスターと、場合によっては多数のスレーブがあり、論理リングに接続されています。マスターは、市販のハードウェア、つまり通常のイーサネット インターフェイス カードを使用して構築できます。マスターはイーサネット インターフェイスでパケットを送信し、スレーブはオンザフライでパケットを変更し、すべてのスレーブを通過した後、マスターはそれを送信したのと同じネットワーク インターフェイスでパケットを受信します。スレーブの数によっては、ネットワーク インターフェイスがまったく同じパケットを送信している間に、パケットの受信を開始する場合があります。Ethercat フレームには 2 つの形式があります。1 つ目は、特殊な ethertype を持つイーサネット パケットです。2 つ目は、ポート 0x88a4 宛ての UDP パケットです。
イーサネット パケットに含まれるコマンドに応じて、スレーブはパケットの Ethercat データを変更する場合と変更しない場合があります。Ethercat データの変更とは別に、変更されるパケットに関する唯一のことは、イーサネット宛先アドレスのビット 1 が 1 に設定されることです。パケットの IP ヘッダーは、Ethercat スレーブによって変更されません。
私のコードは次のように動作します。私は、Ethercat スレーブを接続239.255.65.10
したインターフェイス上などで、マルチキャスト グループに参加します。バスとデータを交換するために、パケットを送信します。このインターフェイスxyz
で に呼び出しましょう。OS は送信元アドレス、たとえばinterface の IP アドレスを入力します。パケットがバスを通過し、変更された可能性があるため、現在は packet になっています。IP ヘッダーには、送信元と送信先がまだあります。ホストのネットワーク設定によっては、このパケットがアプリケーションに到達する場合と到達しない場合があります。私のアプリケーションに到達しない場合、たとえばLinux でパケットが設定されている場合pA
239.255.65.10
192.168.5.2
xyz
pB
192.168.5.2
239.255.65.10
rp_filter
pB
私のマシンから発信されたように見えるため拒否されましたが、ネットワーク経由で自分のパケットを受信するべきではありません。
処理されたパケットを確実に受信するには、どのような手順を実行すればよいpB
ですか? ループバックについて話しているのではないことに注意してください。ループバックはパケットの受信pA
に関するものであり、私の質問は受信に関するものpB
です。