Japan QualNet Community Forums Japan QualNet Community Forums
Welcome Guest 
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
検索
メインメニュー
アクセスカウンター
2024/04/26:8/8
2024/04/25:20/24

2024/02/26より285/1374
人気モジュール
No.1: フォーラム 86
No.2: QualNet概要 6
日曜日からの合計
人気Browser&OS
No.1:巡回ロボット60
No.2:Windows NT2
No.3:Linux1

No.1:どっかの巡回ロボット56
No.2:Safari3
No.3:Google巡回ロボット2

日曜日からの合計
メイン
   Routing Protocols Implementation & Model Development
     APP_UdpSendNewDataWithPriorityについて
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
T.I
投稿日時: 2018/1/16 11:41
半人前
登録日: 2017/10/21
居住地:
投稿: 32
APP_UdpSendNewDataWithPriorityについて
こんにちは。

私は、送信元が送信先を指定してデータパケットをフラッディング、データパケットを受け取ったノードは、自分宛なら受け取り違うなら再度フラッディグを行うという風にCBRを改造したいと考えています。

そこで第一段階としてフラッディングを実装しようと考え、app_cbr.cpp内のAppLayerCbrClientの
--------------------------------------------------------
Message* sentMsg = APP_UdpCreateMessage(
node,
clientPtr->localAddr,
(short) clientPtr->sourcePort,
clientPtr->remoteAddr,
(short) APP_CBR_SERVER,
TRACE_CBR,
clientPtr->tos);
--------------------------------------------------------
の部分をMESSAGE_Free(node, msg);の手前まで消して、
--------------------------------------------------------
APP_UdpSendNewDataWithPriority(
node,
APP_CBR_CLIENT,
clientPtr->localAddr.interfaceAddr.ipv4,
(short) clientPtr->sourcePort,
ANY_DEST,
0,
cbrData,
512,
clientPtr->tos,
0,
TRACE_CBR);
--------------------------------------------------------
に変更したのですが、serverのアプリケーションまでパケットが届きません。
どなたかわかる方がいれば教えていただきたいです。
Sekiguchi
投稿日時: 2018/1/16 13:09
新米
登録日: 2006/4/11
居住地:
投稿: 10
Re: APP_UdpSendNewDataWithPriorityについて
ひとつひとつ丁寧に追うしか無いと
思います。

ちなみに修正方法ですが、"CBRを改造する"なら、
"MESSAGE_Free(node, msg);の手前まで消して、"
としてしまうのはまずいと思いますよ。
何の処理をしているのか理解した上で
不要なら消して良いと思いますが。
「ブロードキャストアドレス」のスレッドで試されていた
方法の方が素直だと私は思います。
# ちなみに、私が試してみた所、
# Assertion: Assertion (sizeof(CbrData) <= CBR_HEADER_SIZE)
# は出なかったです。
# ブロードキャストアドレスもユニキャストアドレスも
# 同じAddress型なら、このようなエラーにはならないと
# 思うのですが、何でしょうね??


で、動作の確認方法ですが、
そもそも作ったアプリパケットは
ちゃんと送信されているでしょうか?
また、送信されている場合、
受信側ではどのレイヤまでそのパケットを
受信出来ているでしょうか?
PHYで受信できているのにアプリまで到達していないなら、
中間のどこかの層で破棄されている筈。


私だったら、
・ノードを2台だけ置く
・ICMP NO
 ROUTING-PROTOCOL-IPv4 NONE
 (必要であればSTATIC-ROUTE YESにして
  静的ルーティングテーブルを作る。)
 にして、アプリを設定していない場合、
 余計なパケットは送受信されないようなシナリオを作成する。
 
・・・というシナリオを作った上で、
broadcastパケットを送信するアプリを
設定した場合と設定しない場合でのstatを比較するところから
始めると思います。人それぞれですが。

T.I
投稿日時: 2018/1/16 16:40
半人前
登録日: 2017/10/21
居住地:
投稿: 32
Re: APP_UdpSendNewDataWithPriorityについて
返事ありがとうございます!

「ブロードキャストアドレス」のスレッドの方法はエラーが出るためあきらめていたのですが、先程試しにいじったソースコードを初期化して改めて改造したところエラーが出ませんでした!

--------------------------------------------------
Address broadcastAddress;
broadcastAddress.networkType=NETWORK_IPV4;
broadcastAddress.interfaceAddr.ipv4=ANY_DEST;
Message* sentMsg = APP_UdpCreateMessage(
node,
clientPtr->localAddr,
(short) clientPtr->sourcePort,
broadcastAddress,
(short) APP_CBR_SERVER,
TRACE_CBR,
clientPtr->tos);
--------------------------------------------------
のように変更しています。
GUIのAnalyzerでデータを確認すると、MCBRでのシミュレーションの結果と似ているようなのですが、1hop内のノードにデータを送るアプリケーションに改造できたという認識でいいのでしょうか?

今後はブロードキャストパケットを受け取ったら自分宛か確認し、自分宛でなければ転送するという制御を加えたいのですが、client側かserver側どちらをいじるほうがやりやすいと思われますか??
T.I
投稿日時: 2018/1/17 11:27
半人前
登録日: 2017/10/21
居住地:
投稿: 32
Re: APP_UdpSendNewDataWithPriorityについて
追記です。

AppLayerCbrServerに転送制御追加のため以下のコードを書きました。

if (data.seqNo >= serverPtr->seqNo || data.isMdpEnabled)
{
/*-----------relay data-------------*/
char addrRly[MAX_STRING_LENGTH];
Address relayadd;
NodeAddress relayid;

sprintf(addrRly,"%d",node->nodeId);

IO_AppParseDestString(
node,
(char *)"CBR 1 255.255.255.255 100 512 1S 1S 25S PRECEDENCE 0",
addrRly,
&relayid,
&relayadd);

APP_UdpSendNewHeaderVirtualDataWithPriority(
node,
APP_CBR_SERVER,
relayadd,
(short) data.sourcePort,
info->destAddr,
(char *) &data,
sizeof(data),
msg->packetSize - sizeof(data),
APP_DEFAULT_TOS,
0,
TRACE_CBR);

シミュレーション実行したところ、以下のような表示が出ました。

Attempting license checkout ... success.
Loading scenario ./mcbr.config
Partition 0, Node 1 (335.03, 557.80, 0.00).
Partition 0, Node 2 (314.64, 857.75, 0.00).
Partition 0, Node 3 (1027.26, 94.12, 0.00).
Partition 0, Node 4 (1412.50, 493.74, 0.00).
Partition 0, Node 5 (731.12, 1284.64, 0.00).
Partition 0, Node 6 (279.70, 281.15, 0.00).
Partition 0, Node 7 (224.37, 717.97, 0.00).
Partition 0, Node 8 (480.63, 1096.54, 0.00).
Partition 0, Node 9 (943.65, 321.92, 0.00).
Partition 0, Node 10 (955.30, 575.27, 0.00).
Partition 0, Node 11 (725.25, 691.76, 0.00).
Partition 0, Node 12 (483.54, 758.74, 0.00).
Partition 0, Node 13 (400.00, 400.00, 0.00).
Partition 0, Node 14 (600.00, 400.00, 0.00).
Partition 0, Node 15 (745.63, 1038.30, 0.00).
Partition 0, Node 16 (996.07, 878.13, 0.00).
Partition 0, Node 17 (823.43, 213.47, 0.00).
Partition 0, Node 19 (400.00, 0.00, 0.00).
Partition 0, Node 20 (1266.90, 1128.57, 0.00).
Initialization completed in 0.503 sec at 2018-01-17 11:25:58.310
Segmentation fault (コアダンプ)

原因がわからず困っています。GUIでも実行してすぐに中止されてしまいます。
APP_UdpSendNewHeaderVirtualDataWithPriorityの部分をコメントアウトすれば中止されないことは確認済みです。
Sekiguchi
投稿日時: 2018/1/22 19:09
新米
登録日: 2006/4/11
居住地:
投稿: 10
Re: APP_UdpSendNewDataWithPriorityについて
うーん・・・。

ちゃんと確認はしていないのですが、
・broadcast宛のAddressがほしいだけなら
IO_AppParseDestString()なんてわざわざ使わなくて良いのではないか、
とか、
・APP_UdpSendNewHeaderVirtualDataWithPriority
の第三引数はsourceAddressだから転送しようとしている
ノードのアドレスを入れるんじゃないかとか、
・この関数を呼ばれた時のinfoとかdataとかmsgの
中身はちゃんと期待する値が入っているのか、とか
色々気になりますが、それは一旦置いておいて・・。

もし、最初の送信元からの送信が
「ブロードキャストアドレス」のスレッドの方法
でうまくいったのなら、
?次の転送も同じくAPP_UdpCreateMessageを使う、
あるいは
?受信したメッセージを修正しないで
そのまま転送して良いなら、新しくmessageを作らないで
受信したmessageをそのまま
appUdpSend()
してしまえば良いのではないでしょうか。

ところで、
「ブロードキャストパケットを受け取ったら自分宛か確認し」
するには、アプリケーションデータ内(ここではCbrData構造体ですかね?)
あたりに「最終的な宛先」を格納しておく必要がありそうですが、
そのあたりは大丈夫でしょうか。

T.I
投稿日時: 2018/1/24 18:08
半人前
登録日: 2017/10/21
居住地:
投稿: 32
Re: APP_UdpSendNewDataWithPriorityについて
ご助言ありがとうございます。
理解が浅くて申し訳ございません。

現段階ではこのようなコードを追加しています。
-------------------------------------------------
Address broadcastAddress;
broadcastAddress.networkType=NETWORK_IPV4;
broadcastAddress.interfaceAddr.ipv4=ANY_DEST;
APP_UdpSendNewDataWithPriority(
node,
APP_CBR_SERVER,
serverPtr->remoteAddr,
(short) serverPtr->sourcePort,
broadcastAddress,
-1,
(char *) &msg->payload,
msg->payloadSize,
APP_DEFAULT_TOS,
1*SECOND,
TRACE_CBR
);
-------------------------------------------------
シミュレーション実行しAnalyzerで確認すると、1hop内のノードにしか送信されていませんでした。

//ところで、
//「ブロードキャストパケットを受け取ったら自分宛か確認し」
//するには、アプリケーションデータ内(ここではCbrData構造体ですか//ね?)
//あたりに「最終的な宛先」を格納しておく必要がありそうですが、
//そのあたりは大丈夫でしょうか。

if文の条件式であらかじめ送信したいノードのアドレス以外なら転送処理を行おうかと考えています。
T.I
投稿日時: 2018/1/26 17:04
半人前
登録日: 2017/10/21
居住地:
投稿: 32
Re: APP_UdpSendNewDataWithPriorityについて
追記です。

APP_UdpSendNewDataWithPriorityの第6引数はなにを入れたらいいのでしょうか?
hファイルにはoutgoingInterfaceと記載があるので、送信したいAddressを入れたらいいのでしょうか?
T.I
投稿日時: 2018/2/5 17:46
半人前
登録日: 2017/10/21
居住地:
投稿: 32
Re: APP_UdpSendNewDataWithPriorityについて
追記です。

app_cbr.cppとapp_cbr.hに変更を加えましたが、エラーは出なくなったのですがデータパケットが宛先に届きません。

CbrData size cant be greater than CBR_HEADER_SIZEのエラーが出るので、hファイルのCBR_HEADER_SIZEを無理やり大きくしているためにデータが届かないのでしょうか?それともその他の理由で届いていないのでしょうか?
cbr.tar.gz
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ
Copyright c KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
XOOPS Cube PROJECT