Skip to main content

59 posts tagged with "IPv6"

View All Tags

· 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; 收到其他狀態訊息的話都直接刪除

· One min read

void TCPGenericCliAppBase::setStatusString(const char *s) { if (ev.isGUI()) displayString().setTagArg("t", 0, s); }

void TCPGenericCliAppBase::socketEstablished(int, void ) { // redefine* to perform or schedule first sending ev << "connected\n"; setStatusString("connected"); }

· One min read

剛看到

http://ctieware.eng.monash.edu.au/twiki/bin/view/Simulation/Installation

上提供了 IPv6SuiteWithINET for OMNeT++ 3.1, windows/linux 版.

趕快來試用,如果沒問題的話那 INET6 計畫的下一步就修正成寫 IPv6SuiteWithINET 文件推廣囉, 當然,要先自己 trace 一遍才知人家怎麼做的

4/21 quick revice: 必須安裝 VC 7.1 編譯程式才能編譯,6.0 的不行。程式可以由下面連結下載 http://www.microsoft.com/downloads/details.aspx?FamilyID=272be09d-40bb-49fd-9cb0-4bfa122fa91b&displaylang=en

· One min read

Define_Module (PingApp); 模組名稱是 PingApp

PingApp::initialize()

  1. 讀入 omnetpp.ini 中設定的參數.
  2. 在 TKenv 中監視
  • sendSeqNo
  • expectedReplySeqNo
  • dropCount
  • outOfOrderArrivalCount 這幾個結果 PingApp::handleMessage (cMessage *msg)

if (msg->isSelfMessage ()) 若訊息來自本身節點

destAddr = IPAddressResolver ().resolve (par ("destAddr")); 解析目的位址設定

來自其他節點則啟動回覆機制

processPingResponse(check_and_cast<pingpayload>(msg));

void PingApp::sendPing()

PingPayload msg = new PingPayload (name); 新增封包,接著下面照著宣告的格式填入對應的值 msg->setLength (8packetSize); //? 封包裡沒宣告

sendToICMP (msg, destAddr, srcAddr, hopLimit); 把訊息送到 ICMP 裡

PingApp::scheduleNextPing(cMessage *timer)

simtime_t nextPing = simTime () + intervalp->doubleValue (); 模擬時間加上間隔時間

void PingApp::sendToICMP(cMessage *msg, const IPvXAddress& destAddr, const IPvXAddress& srcAddr, int hopLimit) 判斷送出 v4/v6 icmp 格式封包

void PingApp::processPingResponse (PingPayload *msg) 收到 ICMP 封包,判斷</pingpayload> v4/v6 並<pingpayload>處理 </pingpayload>

· 2 min read

16.3.1. 確認是否支援

嘗試載入模組,確認是否編譯成功

# modprobe ip6_tables

確認相容性

� 'ip6tables' firewalling (IPv6)!"

16.3.2. 學習如何使用 ip6tables

16.3.2.1. 列出所有 IPv6 netfilter 輸入條件

  • 短指令

# ip6tables -L

  • 延伸指令 ip6tables -n -v --line-numbers -L

16.3.2.2. 列出特定過濾器

# ip6tables -n -v --line-numbers -L INPUT

16.3.2.3. 使用選項在輸入過濾器中插入紀錄規則

� --log-level 7

16.3.2.4. 在輸入過濾器中插入拋棄條件

# ip6tables --table filter --append INPUT -j DROP

16.3.2.5. 依號碼刪除一筆條件

# ip6tables --table filter --delete INPUT 1

16.3.2.6. 允許 ICMPv6 訊息

使用較舊的 Linux 核心 (未修正的核心 2.4.5 與 iptables-1.2.2) 將無法指定類型 (type)

  • 接受透過隧道 (Tunnel) 進來的 ICMPv6 通訊

# ip6tables -A INPUT -i sit+ -p icmpv6 -j ACCEPT

  • 接受透過隧道 (Tunnel) 出去的 ICMPv6 通訊

# ip6tables -A OUTPUT -o sit+ -p icmpv6 -j ACCEPT

新的 Linux 核心可以指定 ICMPv6 類型:

# ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT

16.3.2.7. 速率限制

http://www.tldp.org/HOWTO/Linux+IPv6-HOWTO/x2231.html