NETWORK ATTACKS FRAMEWORK  1.0.0
A NETwork Attacks framework. Making network attacks impact evaluation easier!
NA_IPv4.cc
Go to the documentation of this file.
00001 //
00002 // Copyright (C) 2013, NESG (Network Engineering and Security Group), http://nesg.ugr.es,
00003 // - Gabriel Maciá Fernández (gmacia@ugr.es)
00004 // - Leovigildo Sánchez Casado (sancale@ugr.es)
00005 // - Rafael A. Rodríguez Gómez (rodgom@ugr.es)
00006 // - Roberto Magán Carrión (rmagan@ugr.es)
00007 // - Pedro García Teodoro (pgteodor@ugr.es)
00008 // - José Camacho Páez (josecamacho@ugr.es)
00009 // - Jesús E. Díaz Verdejo (jedv@ugr.es)
00010 //
00011 // This file is part of NETA.
00012 //
00013 //    NETA is free software: you can redistribute it and/or modify
00014 //    it under the terms of the GNU General Public License as published by
00015 //    the Free Software Foundation, either version 3 of the License, or
00016 //    (at your option) any later version.
00017 //
00018 //    NETA is distributed in the hope that it will be useful,
00019 //    but WITHOUT ANY WARRANTY; without even the implied warranty of
00020 //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00021 //    GNU General Public License for more details.
00022 //
00023 //    You should have received a copy of the GNU General Public License
00024 //    along with NETA.  If not, see <http://www.gnu.org/licenses/>.
00025 //
00026 
00027 #include "NA_IPv4.h"
00028 #include <iostream>
00029 #include <string.h>
00030 #include "IPv4Datagram.h"
00031 
00032 using std::cout;
00033 
00034 simsignal_t NA_IPv4::dropSignal = SIMSIGNAL_NULL;
00035 simsignal_t NA_IPv4::rcvdPktSignal = SIMSIGNAL_NULL;
00036 simsignal_t NA_IPv4::delaySignal = SIMSIGNAL_NULL;
00037 
00038 Define_Module(NA_IPv4);
00039 
00040 void NA_IPv4::initialize() {
00041 
00042     // Dropping attack initialization
00043     numDrops = 0;
00044     dropSignal = registerSignal("droppings");
00045     droppingAttackProbability = 0;
00046     droppingAttackIsActive = false;
00047 
00048     // Delay attack initialization
00049     delayAttackIsActive = false;
00050     delayAttackProbability = 0;
00051     numDelays = 0;
00052     delaySignal = registerSignal("delayed");
00053     totalDelayTime = 0;
00054     delayAttackValue = NULL;
00055 
00056     // Number of data packet received
00057     numRecvPacket = 0;
00058     rcvdPktSignal = registerSignal("rcvdPkt");
00059 
00060     IPv4::initialize();
00061 }
00062 
00063 void NA_IPv4::handleMessageFromAttackController(cMessage *msg) {
00064 
00065     // It is necessary to call Enter_Method for doing context switching (4.10 of User Manual)
00066     Enter_Method("NA_IPv4: handle message from attack controller");
00067 
00068     LOG << "NA_IPv4: Received message: " << msg->getFullName() << "\n";
00069 
00070     /*-------------------------- DROPPING ATTACK -------------------------*/
00071     if (not strcmp(msg->getFullName(), "droppingActivate")) {
00072         NA_DroppingMessage *dmsg;
00073         dmsg = check_and_cast<NA_DroppingMessage *>(msg);
00074         LOG << "--> Activating module NA_IPv4 for Dropping Attack...\n";
00075         LOG << "    Dropping Attack Probability received: "
00076                 << dmsg->getDroppingAttackProbability() << "\n";
00077         //Now dropping attack is activated in this module
00078         droppingAttackIsActive = true;
00079         droppingAttackProbability = dmsg->getDroppingAttackProbability();
00080         delete (msg);
00081 
00082     } else if (not strcmp(msg->getFullName(), "droppingDeactivate")) {
00083         NA_DroppingMessage *dmsg;
00084         dmsg = check_and_cast<NA_DroppingMessage *>(msg);
00085         LOG << "Deactivating module NA_IPv4 for Dropping Attack...\n";
00086         //Now dropping attack is deactivated
00087         droppingAttackIsActive = false;
00088         delete (msg);
00089 
00090         /*-------------------------- DELAY ATTACK -------------------------*/
00091 
00092     } else if (not strcmp(msg->getFullName(), "delayActivate")) {
00093         NA_DelayMessage *dmsg;
00094         dmsg = check_and_cast<NA_DelayMessage *>(msg);
00095         LOG << "--> Activating module NA_IPv4 for Delay Attack...\n";
00096         LOG << "    Delay Attack Probability received: "
00097                 << dmsg->getDelayAttackProbability() << "\n";
00098         LOG << "    Delay Attack Value received: "
00099                 << dmsg->getDelayAttackValue() << "\n";
00100         delayAttackIsActive = true;
00101         delayAttackProbability = dmsg->getDelayAttackProbability();
00102         delayAttackValue = dmsg->getDelayAttackValue();
00103         delete (msg);
00104 
00105     } else if (not strcmp(msg->getFullName(), "delayDeactivate")) {
00106         NA_DelayMessage *dmsg;
00107         dmsg = check_and_cast<NA_DelayMessage *>(msg);
00108         LOG << "Deactivating module NA_IPv4 for Delay Attack...\n";
00109         delayAttackIsActive = false;
00110         delayAttackValue = NULL;
00111         delete (msg);
00112 
00113     } else {
00114         LOG
00115                 << "ERROR: Message unknown in NA_IPv4::handleMessageFromAttackController. Msg: "
00116                 << msg->getFullName() << "\n";
00117     }
00118 }
00119 
00120 void NA_IPv4::handlePacketFromNetwork(IPv4Datagram *datagram,
00121         InterfaceEntry *fromIE) {
00122 
00123     ASSERT(datagram);
00124 
00125     //cout << simTime() << ": Incoming packet: " << datagram->getFullPath() << endl;
00126     //cout << simTime() << ": Source address: " << datagram->getSrcAddress().str() << endl;
00127     //cout << simTime() << ": Destination address: " << datagram->getDestAddress().str() << endl;
00128 
00129     // Count the number of total data packet received, for statistics.
00130     if (!strncmp(datagram->getName(), PING_DATA, 4)
00131             || !strncmp(datagram->getName(), UDP_DATA, 3)
00132             || !strncmp(datagram->getName(), TCP_DATA, 3)) {
00133         numRecvPacket++; // The number of packets is updated
00134         emit(rcvdPktSignal, numRecvPacket); // Sending of the signal indicating that we have received a new data packet.
00135     }
00136 
00137     //Packet is a ping/UDP/TCP (data packet)
00138     if (droppingAttackIsActive) {
00139         LOG << "Received packet after activating dropping attack ... " << "\n";
00140         if (!strncmp(datagram->getName(), PING_DATA, 4)
00141                 || !strncmp(datagram->getName(), UDP_DATA, 3)
00142                 || !strncmp(datagram->getName(), TCP_DATA, 3)) {
00143             LOG << "Is a valid packet for dropping ..." << "\n";
00144             if (uniform(0, 1) < droppingAttackProbability) {
00145                 numDrops++; // The number of droppings is updated
00146                 emit(dropSignal, numDrops); // Sending of the signal indicating a drop
00147                 LOG << "Discarding packet: " << datagram->getName() << ": "
00148                         << numDrops << " dropping times." << endl;
00149                 cout << simTime() << ": Discarding packet: "
00150                         << datagram->getName() << endl;
00151                 delete datagram; //Deletes the datagram thus calling its destructor
00152             } else {
00153                 IPv4::handlePacketFromNetwork(datagram, fromIE);
00154             }
00155         } else { //Packet is not a data packet --> normal behavior
00156             IPv4::handlePacketFromNetwork(datagram, fromIE);
00157 
00158         }
00159 
00160     } else { // --> Normal behavior.
00161         IPv4::handlePacketFromNetwork(datagram, fromIE);
00162     }
00163 }
00164 
00165 simtime_t NA_IPv4::startService(cPacket *msg) {
00166 
00167     // The value for the variable "delay" is obtained in QueueBase::initialize from the .ned parameter "procDelay".
00168     // Here, the delay attack add a new delay.
00169 
00170     double delayAttack = 0;
00171 
00172     if (delayAttackIsActive) {
00173         if (delayAttackValue != NULL) {
00174             if (!strncmp(msg->getName(), PING_DATA, 4)
00175                     || !strncmp(msg->getName(), UDP_DATA, 3)
00176                     || !strncmp(msg->getName(), TCP_DATA, 3)) {
00177                 if (uniform(0, 1) < delayAttackProbability) {
00178                     delayAttack = delayAttackValue->doubleValue();
00179                     if (delayAttack < 0)
00180                         delayAttack = 0; //Avoid negative delays from a random distribution
00181                     numDelays++; // The number of packets delayed is updated
00182                     emit(delaySignal, numDelays); // Sending of the signal indicating a drop
00183                     LOG << "(NA_IPv4) Applied delay of: " << delayAttack
00184                             << "s. Packet name: " << msg->getFullName() << endl;
00185                     //cout << simTime() << ": (NA_IPv4) Applied delay of: " << delayAttack << "s. Packet name: " << msg->getFullName() << "\n";
00186                 }
00187             }
00188         }
00189     }
00190     return delayAttack + delay;
00191 }
00192 
 All Classes Files Functions Variables Typedefs Enumerator Defines