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);