Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #define WANT_WINSOCK2
00022
00023 #include <platdep/sockets.h>
00024 #include <stdio.h>
00025 #include <string.h>
00026 #include <omnetpp.h>
00027 #include "InterfaceTable.h"
00028 #include "InterfaceTableAccess.h"
00029 #include "ExtInterface.h"
00030 #include "IPSerializer.h"
00031
00032
00033 Define_Module(ExtInterface);
00034
00035 void ExtInterface::initialize(int stage)
00036 {
00037
00038 if(stage == 0)
00039 {
00040 if(dynamic_cast<cSocketRTScheduler *>(simulation.getScheduler()) != NULL)
00041 {
00042 rtScheduler = check_and_cast<cSocketRTScheduler *>(simulation.getScheduler());
00043
00044 device = par("device");
00045
00046 const char *filter = par("filterString");
00047 rtScheduler->setInterfaceModule(this, device, filter);
00048 connected = true;
00049 }
00050 else
00051 {
00052
00053 connected = false;
00054 }
00055 }
00056
00057 if (stage == 3)
00058 {
00059
00060 updateDisplayString();
00061 return;
00062 }
00063
00064
00065 if (stage != 0)
00066 return;
00067
00068 numSent = numRcvd = numDropped = 0;
00069 WATCH(numSent);
00070 WATCH(numRcvd);
00071 WATCH(numDropped);
00072
00073
00074 interfaceEntry = registerInterface();
00075
00076
00077 if (ev.isGUI() && !connected)
00078 {
00079 getDisplayString().setTagArg("i",1,"#707070");
00080 getDisplayString().setTagArg("i",2,"100");
00081 }
00082 }
00083
00084 InterfaceEntry *ExtInterface::registerInterface()
00085 {
00086 InterfaceEntry *e = new InterfaceEntry();
00087
00088
00089 char *interfaceName = new char[strlen(getFullName())+1];
00090 char *d=interfaceName;
00091 for (const char *s=getFullName(); *s; s++)
00092 if (isalnum(*s))
00093 *d++ = *s;
00094 *d = '\0';
00095 e->setName(interfaceName);
00096 delete [] interfaceName;
00097
00098 e->setMtu(par("mtu"));
00099 e->setMulticast(true);
00100 e->setPointToPoint(true);
00101 IInterfaceTable *ift = InterfaceTableAccess().get();
00102 ift->addInterface(e, this);
00103 return e;
00104 }
00105
00106 void ExtInterface::handleMessage(cMessage *msg)
00107 {
00108
00109 if(dynamic_cast<ExtFrame *>(msg) != NULL)
00110 {
00111
00112 uint32 packetLength;
00113 ExtFrame *rawPacket = check_and_cast<ExtFrame *>(msg);
00114
00115 packetLength = rawPacket->getDataArraySize();
00116 for(uint32 i=0; i < packetLength; i++)
00117 buffer[i] = rawPacket->getData(i);
00118
00119 IPDatagram *ipPacket = new IPDatagram("ip-from-wire");
00120 IPSerializer().parse(buffer, packetLength, (IPDatagram *)ipPacket);
00121 EV << "Delivering an IP packet from "
00122 << ipPacket->getSrcAddress()
00123 << " to "
00124 << ipPacket->getDestAddress()
00125 << " and length of"
00126 << ipPacket->getByteLength()
00127 << " bytes to IP layer.\n";
00128 send(ipPacket, "netwOut");
00129 numRcvd++;
00130 }
00131 else
00132 {
00133 memset(buffer, 0, 1<<16);
00134 IPDatagram *ipPacket = check_and_cast<IPDatagram *>(msg);
00135
00136 if ((ipPacket->getTransportProtocol() != IP_PROT_ICMP) &&
00137 (ipPacket->getTransportProtocol() != IPPROTO_SCTP) &&
00138 (ipPacket->getTransportProtocol() != IPPROTO_TCP) &&
00139 (ipPacket->getTransportProtocol() != IPPROTO_UDP))
00140 {
00141 EV << "Can not send packet. Protocol " << ipPacket->getTransportProtocol() << " is not supported.\n";
00142 numDropped++;
00143 delete(msg);
00144 return;
00145 }
00146
00147 if(connected)
00148 {
00149 struct sockaddr_in addr;
00150 addr.sin_family = AF_INET;
00151 #if !defined(linux) && !defined(_WIN32)
00152 addr.sin_len = sizeof(struct sockaddr_in);
00153 #endif
00154 addr.sin_port = 0;
00155 addr.sin_addr.s_addr = htonl(ipPacket->getDestAddress().getInt());
00156 int32 packetLength = IPSerializer().serialize(ipPacket,buffer, sizeof(buffer));
00157 EV << "Delivering an IP packet from "
00158 << ipPacket->getSrcAddress()
00159 << " to "
00160 << ipPacket->getDestAddress()
00161 << " and length of "
00162 << ipPacket->getByteLength()
00163 << " bytes to link layer.\n";
00164 rtScheduler->sendBytes(buffer, packetLength, (struct sockaddr *) &addr, sizeof(struct sockaddr_in));
00165 numSent++;
00166 }
00167 else
00168 {
00169 EV << "Interface is not connected, dropping packet " << msg << endl;
00170 numDropped++;
00171 }
00172 }
00173 delete(msg);
00174 if (ev.isGUI())
00175 updateDisplayString();
00176 }
00177
00178 void ExtInterface::displayBusy()
00179 {
00180 getDisplayString().setTagArg("i",1, "yellow");
00181 gate("physOut")->getDisplayString().setTagArg("ls",0,"yellow");
00182 gate("physOut")->getDisplayString().setTagArg("ls",1,"3");
00183 }
00184
00185 void ExtInterface::displayIdle()
00186 {
00187 getDisplayString().setTagArg("i",1,"");
00188 gate("physOut")->getDisplayString().setTagArg("ls",0,"black");
00189 gate("physOut")->getDisplayString().setTagArg("ls",1,"1");
00190 }
00191
00192 void ExtInterface::updateDisplayString()
00193 {
00194 char buf[80];
00195 if (ev.disable_tracing)
00196 getDisplayString().setTagArg("t",0,"");
00197 if(connected)
00198 sprintf(buf, "pcap device: %s\nrcv:%d snt:%d", device, numRcvd, numSent);
00199 else
00200 sprintf(buf, "not connected");
00201 getDisplayString().setTagArg("t", 0, buf);
00202 }
00203
00204 void ExtInterface::finish()
00205 {
00206 std::cout << getFullPath() << ": " << numSent << " packets sent, " <<
00207 numRcvd << " packets received, " << numDropped <<" packets dropped.\n";
00208 }
00209