diff --git a/client/streamconfigdialog.cpp b/client/streamconfigdialog.cpp
index 7789f8d..6d336e3 100644
--- a/client/streamconfigdialog.cpp
+++ b/client/streamconfigdialog.cpp
@@ -200,6 +200,8 @@ void StreamConfigDialog::setupUiExtra()
bgProto[ProtoL3]->addButton(rbL3Ipv4, OstProto::Protocol::kIp4FieldNumber);
bgProto[ProtoL3]->addButton(rbL3Ipv6, 0xFFFF);
bgProto[ProtoL3]->addButton(rbL3Arp, OstProto::Protocol::kArpFieldNumber);
+ bgProto[ProtoL3]->addButton(rbL3Ip4over4,
+ OstProto::Protocol::kIp4over4FieldNumber);
bgProto[ProtoL3]->addButton(rbL3Other, ButtonIdOther);
#endif
@@ -952,8 +954,10 @@ void StreamConfigDialog::on_tbProtocolData_currentChanged(int /*index*/)
// Refresh protocol widgets in case there is any dependent data between
// protocols e.g. TCP/UDP port numbers are dependent on Port/Protocol
// selection in TextProtocol
+#if 0 // FIXME: temp mask to avoid crash till we fix it
mpStream->storeProtocolWidgets();
mpStream->loadProtocolWidgets();
+#endif
}
void StreamConfigDialog::on_pbOk_clicked()
diff --git a/client/streamconfigdialog.ui b/client/streamconfigdialog.ui
index f64c848..687b970 100644
--- a/client/streamconfigdialog.ui
+++ b/client/streamconfigdialog.ui
@@ -8,7 +8,7 @@
0
0
- 569
+ 579
481
@@ -173,7 +173,7 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
0
0
- 527
+ 537
243
@@ -339,6 +339,19 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
-
+
+
+ false
+
+
+ IP 4over4
+
+
+ false
+
+
+
+ -
false
diff --git a/common/comboprotocol.h b/common/comboprotocol.h
index c6efa0a..c7d4053 100644
--- a/common/comboprotocol.h
+++ b/common/comboprotocol.h
@@ -25,7 +25,7 @@ along with this program. If not, see
template
class ComboProtocol : public AbstractProtocol
{
-private:
+protected:
ProtoA *protoA;
ProtoB *protoB;
QWidget *configForm;
@@ -82,8 +82,7 @@ public:
// NOTE: To use protoX->protoDataCopyFrom() we need to arrange
// so that it sees its own protocolNumber() - but since the
- // input param 'protocol' is 'const', we make a copy first
-
+ // input param 'protocol' is 'const', we work on a copy
proto.CopyFrom(protocol);
proto.mutable_protocol_id()->set_id(protoA->protocolNumber());
diff --git a/common/ip4.ui b/common/ip4.ui
index a3135e7..c457a2d 100644
--- a/common/ip4.ui
+++ b/common/ip4.ui
@@ -5,8 +5,8 @@
0
0
- 527
- 296
+ 493
+ 308
@@ -35,7 +35,8 @@
-
- Override Header Length (x4)
+ Override Header
+Length (x4)
@@ -66,16 +67,6 @@
- -
-
-
- false
-
-
- ...
-
-
-
-
@@ -106,13 +97,6 @@
- -
-
-
- Qt::Vertical
-
-
-
-
-
diff --git a/common/ip4over4.h b/common/ip4over4.h
new file mode 100644
index 0000000..cf6c5f5
--- /dev/null
+++ b/common/ip4over4.h
@@ -0,0 +1,101 @@
+/*
+Copyright (C) 2010 Srivats P.
+
+This file is part of "Ostinato"
+
+This is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see
+*/
+
+#ifndef _IP_4_OVER_4_H
+#define _IP_4_OVER_4_H
+
+#include "ip4over4.pb.h"
+
+#include "comboprotocol.h"
+#include "ip4.h"
+
+typedef ComboProtocol Ip4over4Combo;
+
+class Ip4over4Protocol : public Ip4over4Combo
+{
+public:
+ Ip4over4Protocol(StreamBase *stream, AbstractProtocol *parent = 0)
+ : Ip4over4Combo(stream, parent)
+ {
+ }
+
+ static Ip4over4Protocol* createInstance(StreamBase *stream,
+ AbstractProtocol *parent)
+ {
+ return new Ip4over4Protocol(stream, parent);
+ }
+
+ virtual void protoDataCopyInto(OstProto::Protocol &protocol) const
+ {
+ OstProto::Protocol tempProto;
+
+ protoA->protoDataCopyInto(tempProto);
+ protocol.MutableExtension(OstProto::ip4over4)
+ ->MutableExtension(OstProto::ip4_outer)
+ ->CopyFrom(tempProto.GetExtension(OstProto::ip4));
+
+ tempProto.Clear();
+
+ protoB->protoDataCopyInto(tempProto);
+ protocol.MutableExtension(OstProto::ip4over4)
+ ->MutableExtension(OstProto::ip4_inner)
+ ->CopyFrom(tempProto.GetExtension(OstProto::ip4));
+
+ protocol.mutable_protocol_id()->set_id(protocolNumber());
+ }
+
+ virtual void protoDataCopyFrom(const OstProto::Protocol &protocol)
+ {
+ if (protocol.protocol_id().id() == protocolNumber()
+ && protocol.HasExtension(OstProto::ip4over4))
+ {
+ OstProto::Protocol tempProto;
+
+ // NOTE: To use protoX->protoDataCopyFrom() we need to arrange
+ // so that it sees its own protocolNumber() and its own extension
+ // in 'protocol'
+ tempProto.mutable_protocol_id()->set_id(protoA->protocolNumber());
+ tempProto.MutableExtension(OstProto::ip4)->CopyFrom(
+ protocol.GetExtension(OstProto::ip4over4).GetExtension(
+ OstProto::ip4_outer));
+ protoA->protoDataCopyFrom(tempProto);
+
+ tempProto.Clear();
+
+ tempProto.mutable_protocol_id()->set_id(protoB->protocolNumber());
+ tempProto.MutableExtension(OstProto::ip4)->CopyFrom(
+ protocol.GetExtension(OstProto::ip4over4).GetExtension(
+ OstProto::ip4_inner));
+ protoB->protoDataCopyFrom(tempProto);
+ }
+ }
+ virtual quint32 protocolFrameCksum(int streamIndex = 0,
+ CksumType cksumType = CksumIp) const
+ {
+ // For a Pseudo IP cksum, we assume it is the succeeding protocol
+ // that is requesting it and hence return protoB's cksum;
+ if (cksumType == CksumIpPseudo)
+ return protoB->protocolFrameCksum(streamIndex, cksumType);
+
+ return Ip4over4Combo::protocolFrameCksum(streamIndex, cksumType);
+ }
+};
+
+#endif
diff --git a/common/ip4over4.proto b/common/ip4over4.proto
new file mode 100644
index 0000000..df25a32
--- /dev/null
+++ b/common/ip4over4.proto
@@ -0,0 +1,37 @@
+/*
+Copyright (C) 2010 Srivats P.
+
+This file is part of "Ostinato"
+
+This is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see
+*/
+
+import "protocol.proto";
+import "ip4.proto";
+
+package OstProto;
+
+// IP 4over4 (also called IPIP)
+message Ip4over4 {
+ extensions 1 to 2;
+}
+
+extend Ip4over4 {
+ optional Ip4 ip4_outer = 1;
+ optional Ip4 ip4_inner = 2;
+}
+
+extend Protocol {
+ optional Ip4over4 ip4over4 = 132;
+}
diff --git a/common/ostproto.pro b/common/ostproto.pro
index 33567f8..89510ce 100644
--- a/common/ostproto.pro
+++ b/common/ostproto.pro
@@ -34,6 +34,7 @@ PROTOS += \
vlanstack.proto \
arp.proto \
ip4.proto \
+ ip4over4.proto \
icmp.proto \
tcp.proto \
udp.proto \
@@ -60,6 +61,7 @@ HEADERS += \
vlanstack.h \
arp.h \
ip4.h \
+ ip4over4.h \
icmp.h \
tcp.h \
udp.h \
diff --git a/common/protocol.proto b/common/protocol.proto
index bafbe8a..6f88c78 100644
--- a/common/protocol.proto
+++ b/common/protocol.proto
@@ -101,6 +101,7 @@ message Protocol {
kIp4FieldNumber = 130;
kArpFieldNumber = 131;
+ kIp4over4FieldNumber = 132;
kTcpFieldNumber = 140;
kUdpFieldNumber = 141;
diff --git a/common/protocolmanager.cpp b/common/protocolmanager.cpp
index b543ac0..e8e6570 100644
--- a/common/protocolmanager.cpp
+++ b/common/protocolmanager.cpp
@@ -33,6 +33,7 @@ along with this program. If not, see
#include "vlanstack.h"
#include "arp.h"
#include "ip4.h"
+#include "ip4over4.h"
#include "icmp.h"
#include "tcp.h"
#include "udp.h"
@@ -49,6 +50,7 @@ ProtocolManager::ProtocolManager()
*/
registerProtocol(OstProto::Protocol::kMacFieldNumber,
(void*) MacProtocol::createInstance);
+
registerProtocol(OstProto::Protocol::kEth2FieldNumber,
(void*) Eth2Protocol::createInstance);
registerProtocol(OstProto::Protocol::kDot3FieldNumber,
@@ -61,23 +63,27 @@ ProtocolManager::ProtocolManager()
(void*) Dot2LlcProtocol::createInstance);
registerProtocol(OstProto::Protocol::kDot2SnapFieldNumber,
(void*) Dot2SnapProtocol::createInstance);
+
registerProtocol(OstProto::Protocol::kSvlanFieldNumber,
(void*) SVlanProtocol::createInstance);
registerProtocol(OstProto::Protocol::kVlanFieldNumber,
(void*) VlanProtocol::createInstance);
registerProtocol(OstProto::Protocol::kVlanStackFieldNumber,
(void*) VlanStackProtocol::createInstance);
+
registerProtocol(OstProto::Protocol::kArpFieldNumber,
(void*) ArpProtocol::createInstance);
registerProtocol(OstProto::Protocol::kIp4FieldNumber,
(void*) Ip4Protocol::createInstance);
+ registerProtocol(OstProto::Protocol::kIp4over4FieldNumber,
+ (void*) Ip4over4Protocol::createInstance);
+
registerProtocol(OstProto::Protocol::kIcmpFieldNumber,
(void*) IcmpProtocol::createInstance);
registerProtocol(OstProto::Protocol::kTcpFieldNumber,
(void*) TcpProtocol::createInstance);
registerProtocol(OstProto::Protocol::kUdpFieldNumber,
(void*) UdpProtocol::createInstance);
-
registerProtocol(OstProto::Protocol::kTextProtocolFieldNumber,
(void*) TextProtocol::createInstance);