ICMP Echo応答

■ENC28J60を使ったイーサネット接続デバイスは受信がうまく行くことは確認できて、そろそろやりとりを始めたい。ただ、いきなりTCPだと3回握手しなければならいのとシーケンスやらセッション管理やらが必要で敷居が高いのでそれはやめておいて、まずはpingに応答を返すところから。pingのパケット受信は前回できていたしね。

 たいていのまっとうなネットワーク技術説明系のウェブサイトでは説明がレイヤに分かれているのが普通なんですが、そういうところから入ると実際にネットワーク上を流れるパケット全体のイメージというのは却って掴みづらいものですね。歳は取りたくないものです。
 pingはICMPに乗っかってネットワークを流れるわけですが、じゃあICMPはどのようにカプセル化されているかというとちょっとうろ覚え。
 MACフレームの中のIPパケットの中にICMPパケットが乗っているというのが正解。MACフレームヘッダにもIPパケットヘッダにもあて先、差出元のアドレスが書き込まれていて、応答時はあて先、差出元をひっくり返して転記して、IMCPパケットのコードを応答コード(0)に書き換え、ICMPパケット全体のチェックサムを計算して設定して、後は送信。MACフレームのチェックサムはENC28J60側にお任せなのでそちらは放っておく。
 イーサネット上でのチェックサムは「1の補数」形式という解ったような解らないような方式なんですが、実装レベルではパケット全体を2バイト単位で区切って、2バイトごとにキャリー付加算するということをやります。
 アセンブラだとコードは簡単に思いつくんですが、Cだとちょっとめんどい。2バイトだからunsigned shortを使えば簡単かなと思わないでもないんですが、計算はビックエンディアンで行う必要があり、実際の計算ライブラリはリトルエンディアンですからストレートにはいかない。何を言っているかといえば、ICMPのデータはunsigned charの連続体によって確保されるデータ領域に存在していて、そこから2バイトずつ読み取り、ただしエンディアンを変換してunsigned shortに見立てなければならないわけです。
 コードを出せば全て解決なんですが、テクニック的には単純なのでキモだけ。
 unsigned char2バイトとunsigned shortの共用体を使いました。

typedef union {
	unsigned char	c[2];
	unsigned short	s;
} transShort;

 バッファを2バイト単位で読み取り、ただし、配列cには逆順に格納すれば、リトルエンディアンに変換されたshortが手に入るわけです。キャリーを取るので、実際の加算器にはunsigned longを使っています。こちらも同様にunsigned long1つとunsigned short2つの共用体を使い、オーバーフロー分を簡単に取り出せるようにしています(上位2バイトに相当するshortがそのままキャリー回数となる)。

 ICMPのECHO応答を返して、PC側で受信を確認。ここで欲が出てARP応答も返すように実装する。今はPC側でarpコマンドでIPテーブルとMACアドレスの変換テーブルを強制的に置いている(ルータはENC28J60のデバイスを知らないので、arpテーブルを用意しないとPCとは通信できない)のだけど、これをARP応答を返すようにすれば、arpコマンドで事前準備する手間は省ける。
 ARPはIPに並ぶレイヤのプロトコルですが、やりとりの内容はICMP echo要求/応答に似ています。送信元のアドレス(MACとIPアドレス)を送信先に転記し、送信元のアドレスに自分自身のアドレスを埋め込む。
 送信先、送信元の入れ替えをしないのは、ARPの要求は誰に送ればわからない状態で行われるので、ブロードパケットとして送られ、送信先のアドレスは匿名状態だからです。まあ、理屈を考えれば当然ですな。

 これであたかもpingに自然に応答するデバイスが出来上がったわけですが、1点気になることが。
 pingを延々と送り続けていると、1分くらいたつと送信が閉塞してしまう。受信はできて、応答動作はしているのだけど、送られていないっぽい。さらにその状態で送り続けると受信パケットが壊れ出す。アナログっぽい異常動作なのでブレッドボード上で動くように作ったことが原因なのか、電源にスイッチングを使っていることなのか、配線がむやみに長いことが原因なのか。アナログ系の不備なんじゃないかなあと思うのだけど、短い間でも動くことは動くのでプログラムのテストはできる。
 とりあえずプログラムの方を進めていきたい。

Copyright (C) 2008-2015 Satosh Saitou. All rights reserved.
戻る
日記::一覧展開
2016.06
卒検突破 (2016.06.26)
急制動 (2016.06.05)
坂道発進 (2016.06.04)
2016.05
スラローム (2016.05.29)
一本橋 (2016.05.28)
半クラ (2016.05.22)
2015.12
2015.11
2015.08
2015.07
2015.06
2015.05
EF50mm F1.8 STM (2015.05.24)
Private Private (2015.05.17)
NTPを整備する (2015.05.02)
2015.04
2015.03
2015.02
潮つ路 (2015.02.22)
未見の星座展 (2015.02.07)
2015.01
PSYCO-PASS劇場版 (2015.01.18)
2014.12
DOMANI/シェル (2014.12.20)
PHPでDMC (2014.12.13)
jouornald (2014.12.07)
2014.11
五木田智央展 (2014.11.08)
2014.10
山口勝弘展 (2014.10.26)
コンタクト (2014.10.18)
ケース加工 (2014.10.11)
山形旅行で (2014.10.04)
2014.09
聖地巡礼 (2014.09.27)
SIAF 2014(3) (2014.09.20)
SIAF 2014(2) (2014.09.14)
SIAF 2014 (2014.09.13)
RaspberryPi B+ (2014.09.06)
2014.08
ヴァロットン (2014.08.09)
GODZILLA(2014) (2014.08.03)
絵画の在りか (2014.08.02)
2014.07
クロニクル1995 (2014.07.26)
SDHCカード集め (2014.07.20)
SDカード再び (2014.07.05)
2014.06
2014.05
駆動系の整備 (2014.05.25)
無限の可能性 (2014.05.24)
PIOON (2014.05.17)
2014.04
大洗 (2014.04.19)
2014.03
唯美主義 (2014.03.09)
写真の境界 (2014.03.02)
2014.02
星を賣る店 (2014.02.15)
日常/オフレコ (2014.02.01)
2014.01
ISCP (2014.01.11)
DOMANI/シェル賞 (2014.01.04)
2013.12
ターナー展 (2013.12.14)
2013.11
反重力 (2013.11.02)
2013.10
木の器 (2013.10.20)
2013.09
ヒステリシス (2013.09.28)
LOVE展 (2013.09.08)
宙色 (2013.09.07)
2013.08
3/4だった (2013.08.17)
福田美蘭展 (2013.08.11)
2013.07
Fedora19 (2013.07.20)
2013.06
Google Cloud Print (2013.06.30)
未来の記憶 (2013.06.16)
梅佳代展 (2013.06.15)
片岡珠子展 (2013.06.09)
椿会展 (2013.06.08)
空想の建物 (2013.06.02)
wiringPi (2013.06.01)
2013.05
2013.04
箱詰め終わる (2013.04.13)
母-娘、姉-妹 (2013.04.06)
2013.03
卒展めぐり (2013.03.30)
恵比寿映像祭 (2013.03.16)
XBeeで接続する (2013.03.10)
Fedora18 (2013.03.09)
Black (2013.03.03)
2013.02
Backupその後 (2013.02.24)
Backup (2013.02.17)
音と光 (2013.02.03)
実験工房 (2013.02.02)
2013.01
いろはにほう (2013.01.26)
燻製を作る (2013.01.19)
2012.12
外装に収める (2012.12.23)
MU (2012.12.22)
スモーク (2012.12.01)
2012.11
Whirl (2012.11.25)
MOTアニュアル (2012.11.18)
2012.10
MPL1151A1 (2012.10.07)
2012.09
(2012.09.16)
夢の光 (2012.09.08)
光のアート (2012.09.01)
2012.08
東京湾大回り (2012.08.26)
2012.07
.hack//VERSUS (2012.07.22)
具体展 (2012.07.21)
国吉康雄展 (2012.07.15)
2012.06
2012.05
DHT11 (2012.05.12)
2012.04
PHPでIPCを行う (2012.04.22)
DHCPを立てる (2012.04.14)
DNSを立てる (2012.04.08)
2012.03
IPv6を追加する (2012.03.17)
MTUを調整する (2012.03.11)
2012.02
ICO再び (2012.02.26)
Viewpoint (2012.02.25)
恵比寿・2 (2012.02.19)
イ・ブル展 (2012.02.18)
恵比寿・1 (2012.02.11)
2012.01
星霜 (2012.01.01)
2011.12
2011.11
美女採取 (2011.11.27)
アサーション (2011.11.20)
日常/ワケあり (2011.11.12)
XB24-BとXB24-ZB (2011.11.06)
2011.10
家電入れ替え (2011.10.23)
2011.09
湿度センサ (2011.09.25)
銀座線ライン (2011.09.17)
竜宮美術旅館 (2011.09.11)
2011.08
しろきもりへ (2011.08.27)
2011.07
免許更新 (2011.07.31)
2011.06
京橋、新橋 (2011.06.26)
シンセシス (2011.06.18)
撤収の準備 (2011.06.04)
2011.05
風穴 (2011.05.15)
PLATFORM (2011.05.14)
2011.04
水・火・大地 (2011.04.17)
2011.03
パーティクル (2011.03.19)
恵比寿映像祭 (2011.03.12)
カナリア (2011.03.06)
2011.02
『ソルト』 (2011.02.19)
豊島美術館 (2011.02.13)
2011.01
藝大先端2011 (2011.01.23)
幽体の知覚 (2011.01.01)
2010.12
PWMで赤外線 (2010.12.26)
2010.11
『水辺にて』 (2010.11.06)
2010.10
アショカの森 (2010.10.30)
補遺の庭 (2010.10.24)
2010.09
シッケテル展 (2010.09.26)
音を鳴らす (2010.09.12)
2010.08
ハーフ (2010.08.21)
発電所美術館 (2010.08.01)
2010.07
2010.06
『未来医師』 (2010.06.13)
会田誠巡り (2010.06.12)
2010.05
桑原漁港 (2010.05.16)
欲望のコード (2010.05.15)
『第9地区』 (2010.05.02)
2010.04
春の海 (2010.04.18)
春の錦帯橋 (2010.04.17)
『機龍警察』 (2010.04.11)
2010.03
虹ヶ浜 (2010.03.28)
菊川湖再び (2010.03.14)
『虐殺器官』 (2010.03.13)
梶取岬 (2010.03.07)
絵画の庭@NMAO (2010.03.06)
2010.02
湯野温泉 (2010.02.06)
2010.01
2009.12
菅野ダム行 (2009.12.20)
2009.11
neoneo展 part2 (2009.11.29)
2009.10
広島ノ顔@HMOCA (2009.10.18)
末武川ダム (2009.10.10)
2009.09
吉宝丸@広島 (2009.09.20)
2009.08
2009.07
下松 (2009.07.12)
T4 (2009.07.05)
2009.06
仙台 (2009.06.07)
蕪島 (2009.06.06)
2009.05
2009.03
2009.02
2009.01
2008.12
神津佐仮説 (2008.12.21)
AVR HTTPサーバ (2008.12.20)
風景るるる (2008.12.14)
2008.11
南志摩・宿浦 (2008.11.22)
志摩あたり (2008.11.01)
2008.10
『剣の名誉』 (2008.10.18)
2008.09
石内都 (2008.09.06)
2008.08
宮島・厳島 (2008.08.30)
精神の呼吸 (2008.08.24)
西国行き (2008.08.23)
ICMP Echo応答 (2008.08.16)
MACフレーム (2008.08.03)
2008.07
小さな世界 (2008.07.26)
早送り (2008.07.20)
屋上庭園・他 (2008.07.13)
夢みる世界 (2008.07.12)
2008.06
古都の残像 (2008.06.01)
2008.05
北陸行 (2008.05.30)
ないまぜ (2008.05.24)
SDカード再び (2008.05.11)
GPSロケーター (2008.05.04)
2008.04
2008.03
音が小さい (2008.03.30)
STILL/MOTION (2008.03.22)
IAMAS2008 (2008.03.16)
80.7MHz/81.3MHz (2008.03.09)
橋頭堡 (2008.03.01)
2008.02
1998.11
作成:2008.07.09
公開:2008.08.16

Valid XHTML 1.1

loading image reserved place