From: xuanthanh18 Date: Wed, 21 Oct 2009 06:09:00 +0000 (+0000) Subject: fixing null pointers and get the right message size for VBit messages X-Git-Tag: rc_6_tinyos_2_1_1~198 X-Git-Url: https://oss.titaniummirror.com/gitweb/?p=tinyos-2.x.git;a=commitdiff_plain;h=58054fb3635f80675eaaafcb0f15703294ed7dc6 fixing null pointers and get the right message size for VBit messages --- diff --git a/tos/lib/net/dhv/DhvVBitP.nc b/tos/lib/net/dhv/DhvVBitP.nc index 07579c29..9ebac2fa 100755 --- a/tos/lib/net/dhv/DhvVBitP.nc +++ b/tos/lib/net/dhv/DhvVBitP.nc @@ -13,206 +13,209 @@ #include module DhvVBitP{ - provides interface DhvDecision; - - uses interface DhvSend as VBitSend; - uses interface DhvReceive as VBitReceive; - uses interface DhvStateLogic as VBitLogic; - uses interface DhvLogic as VectorLogic; - uses interface DhvHelp; - uses interface Random; + provides interface DhvDecision; + + uses interface DhvSend as VBitSend; + uses interface DhvReceive as VBitReceive; + uses interface DhvStateLogic as VBitLogic; + uses interface DhvLogic as VectorLogic; + uses interface DhvHelp; + uses interface Random; } implementation{ - uint8_t commRate; - - command uint8_t DhvDecision.getCommRate() - { - return commRate; - } - - command void DhvDecision.resetCommRate(){ - commRate = 0; - } - - - /*construct a vector of bits and send it*/ - command error_t DhvDecision.send(){ - uint8_t bindex; - uint8_t vbit_size; - uint8_t msg_size; - uint8_t numMsg; - uint8_t maxDataLength; - uint8_t i, j; - dhv_msg_t* dmsg; - dhv_vbit_msg_t* dvbmsg; - uint8_t *versionPtr; - error_t sendResult; - uint32_t salt; - - maxDataLength = TOSH_DATA_LENGTH - 11; - sendResult = FAIL; - - if(UQCOUNT_DHV != 0) - { - vbit_size = ((uint8_t)(UQCOUNT_DHV-1)/VBIT_LENGTH) + 1; - numMsg = (vbit_size -1)/maxDataLength + 1; - }else - { - vbit_size = 0; - numMsg = 0; - } - - bindex = call VBitLogic.getVBitIndex(); - - //return if 0 - if(bindex == 0){ - dbg("DhvVBitP", "Error: no vbit to send \n"); - } - - - dmsg = call VBitSend.getPayloadPtr(); - dmsg->type = ID_DHV_VBIT; - dvbmsg = (dhv_vbit_msg_t*) dmsg->content; - dvbmsg->bindex = bindex; - - //put the hash into the message - salt = call Random.rand32(); - dvbmsg->info = call DhvHelp.computeHash(0, UQCOUNT_DHV, salt); - dvbmsg->salt = salt; - - //put the vbit into the message - versionPtr = call DhvHelp.getVBits(bindex); - - for(j = 0; j < numMsg; j++){//number of tos message_t - if(j == numMsg-1){ - //last message - msg_size = vbit_size - j*maxDataLength; - }else{ - msg_size = maxDataLength; - } - - //TODO: need to get this right - dvbmsg->numKey = msg_size*8; //number of keys - - for(i = 0; i < msg_size; i++){ - dvbmsg->vindex = j; - dvbmsg->vbit[i] = versionPtr[j*maxDataLength + i]; - dbg("DhvVBitP", "bindex %d vbit %d: 0x%02x 0x%02x \n",bindex, i, dvbmsg->vbit[i], versionPtr[i]); - } - - dbg("DhvVBitP", "Sending vbit of index %d size %d \n", bindex, sizeof(dhv_msg_t) + sizeof(dhv_vbit_msg_t) + msg_size ); - - for(i = 0; i < msg_size; i++){ - dbg("DhvVBitP", "vbit to send %d, 0x%02x \n", i, dvbmsg->vbit[i]); - } - - //send the vbit out - sendResult = call VBitSend.send(sizeof(dhv_msg_t) + sizeof(dhv_vbit_msg_t) + vbit_size); - if(sendResult == SUCCESS){ - //call VBitLogic.unsetVBitIndex(bindex); - call VBitLogic.setVBitState(0); + uint8_t commRate; + + command uint8_t DhvDecision.getCommRate() + { + return commRate; + } + + command void DhvDecision.resetCommRate(){ + commRate = 0; + } + + + /*construct a vector of bits and send it*/ + command error_t DhvDecision.send(){ + uint8_t bindex; + uint8_t vbit_size; + uint8_t msg_size; + uint8_t numMsg; + uint8_t maxDataLength; + uint8_t i, j; + dhv_msg_t* dmsg; + dhv_vbit_msg_t* dvbmsg; + uint8_t *versionPtr; + error_t sendResult; + uint32_t salt; + + maxDataLength = TOSH_DATA_LENGTH - sizeof(dhv_msg_t) - sizeof(dhv_vbit_msg_t); + sendResult = FAIL; + + if(UQCOUNT_DHV != 0) + { + vbit_size = ((uint8_t)(UQCOUNT_DHV-1)/VBIT_LENGTH) + 1; + numMsg = (vbit_size -1)/maxDataLength + 1; + }else + { + vbit_size = 0; + numMsg = 0; + } + + bindex = call VBitLogic.getVBitIndex(); + + //return if 0 + if(bindex == 0){ + dbg("DhvVBitP", "Error: no vbit to send \n"); + } + + + dmsg = call VBitSend.getPayloadPtr(); + if(dmsg == NULL) + return FAIL; + + dmsg->type = ID_DHV_VBIT; + dvbmsg = (dhv_vbit_msg_t*) dmsg->content; + dvbmsg->bindex = bindex; + + //put the hash into the message + salt = call Random.rand32(); + dvbmsg->info = call DhvHelp.computeHash(0, UQCOUNT_DHV, salt); + dvbmsg->salt = salt; + + //put the vbit into the message + versionPtr = call DhvHelp.getVBits(bindex); + + for(j = 0; j < numMsg; j++){//number of tos message_t + if(j == numMsg-1){ + //last message + msg_size = vbit_size - j*maxDataLength; + }else{ + msg_size = maxDataLength; + } + + //TODO: need to get this right + dvbmsg->numKey = msg_size*8; //number of keys + + for(i = 0; i < msg_size; i++){ + dvbmsg->vindex = j; + dvbmsg->vbit[i] = versionPtr[j*maxDataLength + i]; + dbg("DhvVBitP", "bindex %d vbit %d: 0x%02x 0x%02x \n",bindex, i, dvbmsg->vbit[i], versionPtr[i]); + } + + dbg("DhvVBitP", "Sending vbit of index %d size %d \n", bindex, sizeof(dhv_msg_t) + sizeof(dhv_vbit_msg_t) + msg_size ); + + for(i = 0; i < msg_size; i++){ + dbg("DhvVBitP", "vbit to send %d, 0x%02x \n", i, dvbmsg->vbit[i]); + } + + //send the vbit out + sendResult = call VBitSend.send(sizeof(dhv_msg_t) + sizeof(dhv_vbit_msg_t) + msg_size); + if(sendResult == SUCCESS){ + //call VBitLogic.unsetVBitIndex(bindex); + call VBitLogic.setVBitState(0); call VBitLogic.unsetHSumStatus(); - } - } - return sendResult; - } - - - event void VBitReceive.receive(void* payload, uint8_t len){ - dhv_vbit_msg_t * rcv_dvbmsg; - uint8_t bindex, vindex; - int i,j; - dhv_version_t version; - dhv_version_t mask; - uint8_t diffIndex; - dhv_key_t diffKey; - bool isDiff; - uint8_t vbit_size; - uint8_t* vbit; - uint32_t salt, myHash; - uint8_t maxDataLength; - uint8_t msg_size; - uint8_t numMsg; - uint32_t bitIndexValue; - - isDiff = FALSE; - commRate = 1; - - maxDataLength = TOSH_DATA_LENGTH - 11; - if(UQCOUNT_DHV != 0) - { - vbit_size = ((uint8_t)(UQCOUNT_DHV-1)/VBIT_LENGTH) + 1; - numMsg = (vbit_size -1)/maxDataLength + 1; - - }else - { - vbit_size = 0; - numMsg = 0; - } - - rcv_dvbmsg = (dhv_vbit_msg_t*) payload; - bindex = rcv_dvbmsg->bindex; - vindex = rcv_dvbmsg->vindex; - - dbg("DhvVBitP", "Receive vbit of index %d numMsg %d vbit_size %d \n", bindex, numMsg, vbit_size ); - - //compare the hash first - salt = rcv_dvbmsg->salt; - myHash = call DhvHelp.computeHash(0, UQCOUNT_DHV, salt); - - if(myHash == rcv_dvbmsg->info){ - //some duplicates - dbg("DhvVBitP", "same summary\n"); - call VBitLogic.setSameSummary(); - - }else{ - vbit = call DhvHelp.getVBits(bindex); - if(vindex == numMsg-1){ - msg_size = vbit_size - vindex*maxDataLength; - //dbg("DhvVBitP", "Last message vindex %d numMsg %d msg_size %d \n", vindex, numMsg, msg_size ); - }else{ - msg_size = maxDataLength; - //dbg("DhvVBitP", "Not last message %d\n", msg_size); - } - - //compare with the rcv vbits - for(i = 0; i < msg_size; i++){ - dbg("DhvVBitP", "numMsg %d bindex %d vbit %d vindex %d: msg_size %d local 0x%02x - rcv 0x%02x \n",numMsg, bindex, i, vindex, msg_size ,vbit[vindex*maxDataLength+i],rcv_dvbmsg->vbit[i]); - if(vbit[vindex*maxDataLength + i] != rcv_dvbmsg->vbit[i]){ - version = rcv_dvbmsg->vbit[i]^vbit[vindex*maxDataLength + i]; - mask = 1; - if(version != 0){ - dbg("DhvVBitP", "There is a difference \n"); - isDiff = TRUE; - for(j = 0; j < VBIT_LENGTH; j++){ - if((version & mask) != 0){ - diffIndex = (VBIT_LENGTH -j) + VBIT_LENGTH*i + vindex*maxDataLength - 1 ; - dbg("DhvVBitP", "Detect difference at %d, %d %d %d %d \n", diffIndex, i, j, vindex, maxDataLength); - - diffKey = call DhvHelp.indexToKey(diffIndex); - call VectorLogic.setItem(diffKey); - } - mask = mask << 1; - } - } - } - } - - //reset this bit - call VBitLogic.unsetVBitIndex(bindex); - - if((isDiff == FALSE)){ - bitIndexValue = call VBitLogic.getVBitState(); - if(bitIndexValue == 0){ - //tell DhvLogic to send the next bindex - bindex++; - dbg("DhvVBitP", "No Difference detected, move to bindex %d \n", bindex ); - call VBitLogic.setVBitIndex(bindex); - } - }else{ - dbg("DhvVBitP","difference detected, reset to 0 \n"); - } - } - } + } + } + return sendResult; + } + + + event void VBitReceive.receive(void* payload, uint8_t len){ + dhv_vbit_msg_t * rcv_dvbmsg; + uint8_t bindex, vindex; + int i,j; + dhv_version_t version; + dhv_version_t mask; + uint8_t diffIndex; + dhv_key_t diffKey; + bool isDiff; + uint8_t vbit_size; + uint8_t* vbit; + uint32_t salt, myHash; + uint8_t maxDataLength; + uint8_t msg_size; + uint8_t numMsg; + uint32_t bitIndexValue; + + isDiff = FALSE; + commRate = 1; + + maxDataLength = TOSH_DATA_LENGTH - sizeof(dhv_msg_t) - sizeof(dhv_vbit_msg_t); + if(UQCOUNT_DHV != 0) + { + vbit_size = ((uint8_t)(UQCOUNT_DHV-1)/VBIT_LENGTH) + 1; + numMsg = (vbit_size -1)/maxDataLength + 1; + + }else + { + vbit_size = 0; + numMsg = 0; + } + + rcv_dvbmsg = (dhv_vbit_msg_t*) payload; + bindex = rcv_dvbmsg->bindex; + vindex = rcv_dvbmsg->vindex; + + dbg("DhvVBitP", "Receive vbit of index %d numMsg %d vbit_size %d \n", bindex, numMsg, vbit_size ); + + //compare the hash first + salt = rcv_dvbmsg->salt; + myHash = call DhvHelp.computeHash(0, UQCOUNT_DHV, salt); + + if(myHash == rcv_dvbmsg->info){ + //some duplicates + dbg("DhvVBitP", "same summary\n"); + call VBitLogic.setSameSummary(); + + }else{ + vbit = call DhvHelp.getVBits(bindex); + if(vindex == numMsg-1){ + msg_size = vbit_size - vindex*maxDataLength; + //dbg("DhvVBitP", "Last message vindex %d numMsg %d msg_size %d \n", vindex, numMsg, msg_size ); + }else{ + msg_size = maxDataLength; + //dbg("DhvVBitP", "Not last message %d\n", msg_size); + } + + //compare with the rcv vbits + for(i = 0; i < msg_size; i++){ + dbg("DhvVBitP", "numMsg %d bindex %d vbit %d vindex %d: msg_size %d local 0x%02x - rcv 0x%02x \n",numMsg, bindex, i, vindex, msg_size ,vbit[vindex*maxDataLength+i],rcv_dvbmsg->vbit[i]); + if(vbit[vindex*maxDataLength + i] != rcv_dvbmsg->vbit[i]){ + version = rcv_dvbmsg->vbit[i]^vbit[vindex*maxDataLength + i]; + mask = 1; + if(version != 0){ + dbg("DhvVBitP", "There is a difference \n"); + isDiff = TRUE; + for(j = 0; j < VBIT_LENGTH; j++){ + if((version & mask) != 0){ + diffIndex = (VBIT_LENGTH -j) + VBIT_LENGTH*i + vindex*maxDataLength - 1 ; + dbg("DhvVBitP", "Detect difference at %d, %d %d %d %d \n", diffIndex, i, j, vindex, maxDataLength); + + diffKey = call DhvHelp.indexToKey(diffIndex); + call VectorLogic.setItem(diffKey); + } + mask = mask << 1; + } + } + } + } + + //reset this bit + call VBitLogic.unsetVBitIndex(bindex); + + if((isDiff == FALSE)){ + bitIndexValue = call VBitLogic.getVBitState(); + if(bitIndexValue == 0){ + //tell DhvLogic to send the next bindex + bindex++; + dbg("DhvVBitP", "No Difference detected, move to bindex %d \n", bindex ); + call VBitLogic.setVBitIndex(bindex); + } + }else{ + dbg("DhvVBitP","difference detected, reset to 0 \n"); + } + } + } }