00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "MsgHandler.h"
00019 #include "PacketProxy.h"
00020
00021 Define_Module(MsgHandler);
00022
00023 MsgHandler::MsgHandler()
00024 {
00025 host = NULL;
00026 for (int i = 0; i < MAX_NUM_VIF; i++)
00027 vif[i] = NULL;
00028 memset(&addrInfo, 0, sizeof(struct addrinfo));
00029 memset(&hostAddr, 0, sizeof(struct sockaddr_storage));
00030 numVif = 0;
00031 }
00032
00033 MsgHandler::~MsgHandler() {}
00034
00035 void MsgHandler::initialize()
00036 {
00037 host = check_and_cast<cModule *>(getParentModule());
00038 numVif = host->par("numVif");
00039 for (int i = 0; i < numVif; i++)
00040 vif[i] = check_and_cast<cModule *>(host->getSubmodule("ath", i));
00041
00042 std::string hostIP = host->par("ipAddress");
00043 const char *ipp = hostIP.c_str();
00044
00045 struct addrinfo request, *result ;
00046 memset(&request, 0, sizeof(struct addrinfo));
00047 request.ai_family = AF_UNSPEC;
00048 request.ai_socktype = SOCK_DGRAM;
00049 request.ai_flags = AI_NUMERICHOST | AI_NUMERICSERV;
00050 request.ai_protocol = 0;
00051 request.ai_canonname = NULL;
00052 request.ai_addr = NULL;
00053 request.ai_next = NULL;
00054 int port = host->par("port");
00055 char cport[5];
00056 sprintf(cport, "%i", port);
00057 if (getaddrinfo(ipp, cport, &request, &result) < 0)
00058 throw new cRuntimeError("MsgHandler: getaddrinfo");
00059 else {
00060 memmove(&addrInfo, result, sizeof(struct addrinfo));
00061 memmove(&hostAddr, result->ai_addr, sizeof(struct sockaddr_storage));
00062 addrInfo.ai_addr = (struct sockaddr *) &hostAddr;
00063 }
00064 }
00065
00066 void MsgHandler::handleMessage(cMessage *etherFrame)
00067 {
00068 ev << "MsgHandler.handleMessage(): msg received!\n";
00069
00070
00071 RAWEtherFrame *frame = check_and_cast<RAWEtherFrame *>(etherFrame);
00072
00073 int payloadSize = frame->getRawBytesArraySize();
00074 int messageSize = DATA_PREAMBLE_SIZE + payloadSize;
00075
00076
00077 dataMsg *msg = (dataMsg *) calloc(1, messageSize);
00078 ((msgHeader *) msg)->type = DATA_MSG;
00079 strcpy(((msgHeader *) msg)->id, "0\0");
00080 char *payloadPointer = (char *) &(msg->wlanPkt);
00081 for (int i = 0; i < payloadSize; i++)
00082 {
00083 *payloadPointer = frame->getRawBytes(i);
00084 payloadPointer++;
00085 }
00086 msg->pktLength = payloadSize;
00087
00088
00089 PacketProxy::printDataMessage((char *) msg);
00090 sendToHost((char *) msg, messageSize);
00091
00092
00093 timeval curTime;
00094 gettimeofday(&curTime, NULL);
00095 timeval processingTimeval = timeval_substract(curTime, (frame->getTimestamp()).dbl());
00096 double processingTime = (processingTimeval.tv_sec + processingTimeval.tv_usec * 1e-6) * 1000;
00097 ev << "PacketProxy.handleReply(): processingTime " << processingTime << "ms\n";
00098
00099
00100 delete frame;
00101 free(msg);
00102 }
00103
00104 void MsgHandler::sendAck(unsigned int msgId)
00105 {
00106 Enter_Method("sendAck()");
00107 plainMsg *ack;
00108
00109 ack = (plainMsg *) calloc(1, ACK_MSG_SIZE);
00110 ack->msgId = msgId;
00111 ((msgHeader *) ack)->type = ACK_MSG;
00112
00113
00114 PacketProxy::printPlainMessage((char *) ack);
00115
00116 sendToHost((char *) ack, ACK_MSG_SIZE);
00117
00118 free(ack);
00119 }
00120
00121 void MsgHandler::sendToHost(char *msg, int length)
00122 {
00123 cUDPSocketRTScheduler *rtScheduler =
00124 check_and_cast<cUDPSocketRTScheduler *>(simulation.getScheduler());
00125 rtScheduler->sendMessage(msg, length, (struct sockaddr *) &hostAddr,
00126 addrInfo.ai_addrlen);
00127 }
00128
00129 void MsgHandler::sendToModel(char *wlanPkt, int length)
00130 {
00131 Enter_Method("sendToModel()");
00132 RAWEtherFrame *etherFrame = new RAWEtherFrame("etherFrame");
00133
00134
00135
00136
00137 etherFrame->setByteLength(length);
00138 etherFrame->setRawBytesArraySize(length);
00139 char *bufferPtr = wlanPkt;
00140 for (int i = 0; i < length; i++)
00141 {
00142 etherFrame->setRawBytes(i, *bufferPtr);
00143 bufferPtr++;
00144 }
00145 etherFrame->setDest();
00146
00147
00148 MACAddress destAddr = (((Ieee802Ctrl *) etherFrame->getControlInfo())->getDest());
00149 ev << host->getName() << ":MsgHandler.sendToModel(): sending EtherFrame to " << destAddr.str() << "\n";
00150
00151
00152 send(etherFrame, "ifOut");
00153 }
00154
00155 void MsgHandler::setRTS(int8_t index, int16_t rts)
00156 {
00157 ev << host->getName() << ":MsgHandler.setRTS(" << rts << "B)\n";
00158 cModule *mac = check_and_cast<cModule *>(vif[index]->getSubmodule("mac"));
00159 mac->par("rtsThresholdBytes") = rts;
00160 }
00161
00162
00163
00164
00165
00166
00167 void MsgHandler::setChannel(int8_t index, int16_t channel)
00168 {
00169 ev << host->getName() << ":MsgHandler.setChannel(" << channel << ")\n";
00170 PhyControlInfo *phyCtrl = new PhyControlInfo();
00171 phyCtrl->setChannelNumber(channel);
00172 cMessage *msg = new cMessage("changeChannel", PHY_C_CONFIGURERADIO);
00173 msg->setControlInfo(phyCtrl);
00174 send(msg, "ifOut");
00175 }
00176
00177 void MsgHandler::setRetry(int8_t index, int16_t retry)
00178 {
00179 ev << host->getName() << ":MsgHandler.setRetry(" << retry << ")\n";
00180 cModule *mac = check_and_cast<cModule *>(vif[index]->getSubmodule("mac"));
00181 mac->par("retryLimit") = retry;
00182 }
00183
00184 void MsgHandler::setTxPower(int8_t index, int16_t txpower)
00185 {
00186 ev << host->getName() << ":MsgHandler.setTxPower(" << txpower << "mW)\n";
00187 cModule *radio = check_and_cast<cModule *>(vif[index]->getSubmodule("radio"));
00188 radio->par("transmitterPower") = txpower;
00189 }
00190
00191 void MsgHandler::setSensitivity(int8_t index, int16_t sensitivity)
00192 {
00193 ev << host->getName() << ":MsgHandler.setSensitivity(" << sensitivity << "dB)\n";
00194 cModule *radio = check_and_cast<cModule *>(vif[index]->getSubmodule("radio"));
00195 radio->par("sensitivity") = sensitivity;
00196 }
00197
00198 void MsgHandler::updateVifParameter(configNotification *info)
00199 {
00200 Enter_Method("updateVifParameter()");
00201
00202 int vifIndex = 0;
00203 if (vifIndex > numVif)
00204 {
00205 ev << "MsgHandler.updateVifParameter(): No interface with index " << vifIndex << "!\n";
00206 return;
00207 }
00208 switch(info->type)
00209 {
00210
00211 case SIOCSIWFREQ:
00212 setChannel(vifIndex, info->value.channel);
00213 break;
00214 case SIOCSIWRTS:
00215 setRTS(vifIndex, info->value.rts);
00216 break;
00217 case SIOCSIWRETRY:
00218 setRetry(vifIndex, info->value.retry);
00219 break;
00220 case SIOCSIWTXPOW:
00221 setTxPower(vifIndex, info->value.txpower);
00222 break;
00223 case SIOCSIWSENS:
00224 setSensitivity(vifIndex, info->value.sensitivity);
00225 break;
00226 default:
00227 ev << "MsgHandler.updateVifParameter(): Unknown ioctl() " << info->type << "\n";
00228 break;
00229 }
00230 }
00231
00232 void MsgHandler::initializeVifParameters(vifRegistrationData vifReg[])
00233 {
00234 Enter_Method("initializeVifParameters()");
00235
00236 for (int i = 0; i < numVif; i++)
00237 {
00238
00239 setRTS(i, vifReg->rts);
00240 setRetry(i, vifReg->retry);
00241 setTxPower(i, vifReg->txpower);
00242 setChannel(i, vifReg->channel);
00243 if (vifReg->sensitivity < 0)
00244 setSensitivity(i, vifReg->sensitivity);
00245 }
00246 }