Skip to main content

34 posts tagged with "OMNET++"

View All Tags

· One min read

17th Part:

檔案管理方式決定: 用 freemind 畫好了 INET6 與 INET 檔案分佈圖, 隨時比較兩者間相應模組與進度

封包測試方式決定: 使用 tictoc scenario 先測試 IPv6, ICMPv6 封包格式的正確性

· One min read

The Mobility module provides a geographical position of the host and handles its movement.

The Blackboard module is used for cross layer communication. It provides information relevant to more than one layer like the actual energy status of the host, the display appearance or the status of the radio.

· One min read

15th Part:

模組組成

  • PING6, TraceRoute6
  • UDP6

IP6

  • ICMP6
  • ND (replace ARP) -- future --
  • MLD
  • IPSEC

封包處理流程: 收到封包 -> 判斷是給自己或給別人的封包 (Deliver locally/Addressed to another node) If 給別人 ->Look up routing table -> 轉送封包到對應介面上 (identified interface)

16th Part: 位址格式:

  • unicast
  • link-local
  • multicast
  • IPv4-compatible address 評估: flatconfigurator6 是否可以先使用 IPv4-compatible address 的方式設定?

Addressing format (參考 Smartbit-smartflow):

  • Full hexadecimal
  • No leading zero (前面的 0 省略)
  • Compact (最簡化 ex: 2001::1)
  • Mixed (最後四碼接 IPv4 位址 ex: 2001::192.168.0.1)

· 3 min read

13th. Part: 看 RFC3493RFC 2542 一邊處理 IP6Address.h 位址格式設定的問題.

原本 IPAddress 內部結構是 unsigned char addr[4]; 用來儲存 32bits IP 位址 改成 IP6Address 後, 內部結構要儲存 128 bits IPv6 位址,因此改成 uint8_t s6_addr[16];

取消輸入值或回傳值為 int 型態的函數,因為與 IPv6 位址表示方式不符, 這部分需弄更清楚後再作加強.

14th. Part: 聯想:

猜測 OMNET++ 中的 IPControInfo 應該就是 RFC 中的 sockaddr_in , 是用來與上層協定溝通的資料結構.

該詢問 INET Wireless 模組部分的進度 The routing information for wired nodes are based on connectivity of the topology, i.e how are nodes connected to one another through Links. This connectivity information is used to populate the forwarding tables in each wired node., however wireless nodes have no concept of "links".

Inorder to exchange pkts among these wired and wireless nodes, Base-stations(BS) is introduced to act as gateways between the two domains.

porting 學長模組時, 發現 OPNET/NS2 (Mobiwan2) 共同的缺點是模組用太多簡寫, 讓人剛開始沒有辦法一看就很清楚這模組的作用...... 若能減少花在辨認簡寫上的時間, 使用者可以更容易明瞭各模組的作用, 也能更容易去使用它們.

· 3 min read

從 UDPApp 或 TCPApp 一堆檔案中,總是要從 xxSinkApp 最先開始看, 最簡單又能猜測到大致流程的一定是這幾個檔案,透過這樣 tracing code 熟悉了大致架構後,看其他相關檔案時會事半功倍.

因為 xxSinkApp 明顯講的都會是如何收到這種類型的封包,還有收到後如何將封包消滅的過程


TCPSinkApp void TCPSinkApp::initialize()

TCPSocket socket; 宣告 TCPSocket

socket.setOutputGate(gate("tcpOut"));

socket.bind(address[0] ? IPAddress (address) : IPAddress (), port); 繫結 "位址 - 埠號"

socket.listen(true);

.... 參考一般 socket 連線相關文件

void TCPSinkApp::handleMessage (cMessage *msg) if (msg->kind ()==TCP_I_PEER_CLOSED) 如果狀態為 TCP_I_PEER_CLOSED

msg->setKind (TCP_C_CLOSE); 將狀態設成 TCP_C_CLOSE

send (msg, "tcpOut"); 將訊息送到 "tcpOut"

else if (msg->kind ()==TCP_I_DATA || msg->kind ()==TCP_I_URGENT_DATA) 如果狀態為 TCP_I_DATA 或 TCP_I_URGENT_DATA

bytesRcvd += msg->length ()/8; bytesRcvd += 收到的封包 bit 長度 / 8 (變成 byte)

delete msg; 並將訊息刪除

else delete msg; 收到其他狀態訊息的話都直接刪除


TCPEchoApp echoFactor=1 will result in sending back the same message unmodified The lengths of the messages are multiplied by echoFactor before sending them back

void TCPEchoApp::sendOrSchedule(cMessage *msg)

if (delay==0) 若 delay 變數值為 0

bytesSent += msg->length ()/8; 紀錄總共送出的封包 byte 長度

send (msg, "tcpOut"); 並送出訊息

else scheduleAt (simTime ()+delay, msg); 否則繼續等待 delay 這段時間

void TCPEchoApp::handleMessage(cMessage *msg)

if (msg->isSelfMessage ()) 若訊息來自本身 紀錄總共送出的封包 byte 長度 並送出訊息

else if (msg->kind ()==TCP_I_PEER_CLOSED) 如果狀態為 TCP_I_PEER_CLOSED

msg->setKind (TCP_C_CLOSE); 將狀態設成 TCP_C_CLOSE

sendOrSchedule (msg); 將訊息傳到 sendOrSchedule () 處理

else if (msg->kind ()==TCP_I_DATA || msg->kind ()==TCP_I_URGENT_DATA) 如果狀態為 TCP_I_DATA 或 TCP_I_URGENT_DATA 紀錄總共收到的封包 byte 長度

if (echoFactor==0) 若 echoFactor==0 將訊息刪除

else 其他: msg->setKind (TCP_C_SEND); 狀態設成 TCP_C_SEND

//reverse direction, modify length, and send it back

TCPCommand ind = check_and_cast<TCPCommand >(msg->removeControlInfo ()); 將 msg 的 ControlInfo 去掉後,強制轉換型別成 TCPCommand

TCPSendCommand *cmd = new TCPSendCommand();

cmd->setConnId(ind->connId()); msg->setControlInfo(cmd);

delete ind; 將不再用到的 ind 刪除

計算回傳訊息大小: long len = long (msg->length ()echoFactor) & ~7U; 將原訊息長度echoFactor

if (len<8) len=8; 若訊息長度小於 1 byte, 補足成 1 byte

msg->setLength (len); 設定回傳訊息長度 sendOrSchedule (msg); 排到 sendOrSchedule () 中

else delete msg; 收到其他狀態訊息的話都直接刪除