Changeset 35
- Timestamp:
- 04/05/2007 03:52:53 PM (5 years ago)
- Location:
- nano-RK/src/net/dsr
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
nano-RK/src/net/dsr/dsr.c
r20 r35 64 64 util_pkt.type=ROUTE_REQUEST; 65 65 util_pkt.len=_curr_hop_cnt;//how many hops to propogate the request upon time out goes up etc 66 util_pkt.src_cnt=0; 66 67 util_pkt.src_route=&dsr_util_dest; 67 68 util_pkt.payload=&dsr_util_route; … … 71 72 void dsr_tx_packet(uint8_t dest,uint8_t*payload,uint8_t len) 72 73 { 74 RF_RX_INFO *pkt; 75 DSR_PKT_INFO *dsr_pkt; 76 uint8_t src_route[MAX_PATH_LEN]; 77 uint8_t len; 78 uint8_t i; 79 uint8_t j; 80 uint8_t rssi; 81 uint32_t mask; 73 82 if(dsr_path_exist(dest)) 74 83 { 75 84 _dsr_tx_packet(dest,payload,len); 76 85 nrk_event_signal(SIG(EVENT_DSR_PKT_TX)); 86 return; 77 87 } 78 88 else 79 89 { 80 90 dsr_util_dest=dest; 81 while(dsr_path_exist(dest)||_curr_hop_cnt==MAX_HOP_COUNT) 82 dsr_request_path(); 83 nrk_event_wait(SIG(BMAC_RX_PKT_EVENT)|SIG(TASK_TIMEOUT_EVENT)| 91 while(dsr_path_exist(dest)||_curr_hop_cnt==MAX_HOP_COUNT) 92 { 93 dsr_request_path(); //TODO CHECK AND SAVE OLD TIMEOUT STATE THEN AFTER REQUEST ETC DONE RESTORE OLD STATE 94 mask=nrk_event_wait(SIG(BMAC_RX_PKT_EVENT)|SIG(TASK_TIMEOUT_EVENT)); 95 if(mask==SIG(TASK_TIMEOUT_EVENT)) 96 { 97 if(_curr_hop_cnt==DSR_MAX_HOP_COUNT) 98 { 99 rate_adjust(0); //reset timeout rate on retransmission 100 nrk_event_signal(SIG(DSR_PACKET_TIMEOUT)); 101 return; 102 } 103 rate_adjust(1); //increase rate exponentially 104 } 105 else //get bmac packet 106 { 107 pkt=bmac_rx_pkt_get(&len,&rssi); 108 if(pkt!=NULL) 109 { 110 dsr_pkt=(DSR_PKT_INFO*)pkt->pPayload; 111 if(dsr_pkt->type==ROUTE_RETURN) 112 { 113 for(i=dsr_pkt->src_cnt-1;i>=0;i--) 114 { 115 src_route[j]=dsr_pkt->src_route[i]; 116 j++; 117 } 118 dsr_add_path(&src_route); 119 bmac_rx_pkt_release();//done with the packet 120 _dsr_tx_packet(dest,payload,len); 121 nrk_event_signal(SIG(EVENT_DSR_PKT_TX)); 122 rate_adjust(0); //increase rate exponentially 123 return; 124 } 125 } 126 } 84 127 } 85 128 return; 129 } 130 131 void rate_adjust(uint8_t increase)//increase rate decrease timeout rate 132 { 133 if(!increase) 134 { 135 dsr_timeout_timer->nano_secs=NANOS_PER_MS * 500; 136 dsr_timeout_timer->secs=0; 137 _curr_hop_cnt=1; 138 nrk_set_task_timeout(dsr_timeout_timer); 139 } 140 else 141 { 142 if(_curr_hop_cnt%2==0) 143 dsr_timeout_timer->nano_secs+=(2*dsr_timeout_timer->nano_secs)*( _curr_hop_cnt-1 ); 144 else 145 dsr_timeout_timer->nano_secs+=(2*dsr_timeout_timer->nano_secs); 146 nrk_set_task_timeout(dsr_timeout_timer); 147 } 148 149 } 150 151 DSR_PKT_INFO * dsr_rx_pkt() 152 { 153 154 RF_RX_INFO *pkt; 155 nrk_event_wait(SIG(DSR_RX_PKT)); 156 pkt=bmac_rx_pkt_get(&len,&rssi); 157 return (DSR_PKT_INFO*)pkt->pPayload; 158 86 159 } 87 160 void dsr_update_clist() //periodically clean cache frequency … … 110 183 bmac_tx_packet(&rxtx_pkt,MAX_ROUTE+16); 111 184 } 185 void dsr_network_task() 186 { 187 uint32_t mask; 188 uint8_t temp; 189 uint8_t len; 190 uint8_t rssi; 191 uint8_t i; 192 uint8_t j; 193 RF_RX_INFO *pkt; 194 DSR_PKT_INFO *dsr_pkt; 195 uint8_t path[MAX_ROUTE] 196 mask=nrk_event_wait(SIG(BMAC_RX_PKT_EVENT)); 197 pkt=bmac_rx_pkt_get(&len,&rssi); 198 dsr_pkt=(DSR_PKT_INFO*)pkt->pPayload; 199 200 if(dsr_pkt->type==DATA_PACKET) 201 if(dsr_pkt->src_route[[dsr_pkt->src_cnt]]==MYMAC) //Packet is for me 202 { 203 if(dest_cnt==dsr_pkt->src_cnt) //@ final destination 204 nrk_signal_event(SIG(DSR_RX_PKT)); 205 else //forward packet along update its source pos 206 { 207 dsr_pkt->src_cnt++; 208 bmac_tx_packet(&pkt,MAX_ROUTE+16);// TODO check node leaving case no longer exists case 209 } 210 } 211 if(dsr_pkt->type==ROUTE_REQUEST) 212 { 213 if(dsr_pkt->hop_cnt>0) 214 { 215 if(dsr_path_exist(dsr_pkt->src_route)) //destination exists in your paths? 216 { 217 j=0; 218 for(i=dsr_pkt->src_cnt;i>-1;i--) //BOUND THIS BY MAX_ROUTE 219 { 220 221 path[j]=dsr_pkt->payload[i]; //make new path 222 } 223 for(i=j+1;i<MAX_ROUTE;i++) 224 { 225 path[i]= dsr_src_route_path[dsr_src_route_table[dsr_pkt->src_route]]; 226 if(path[i]==dsr_pkt->src_route) 227 break; 228 } 229 dsr_pkt->src_route=&path; 230 dsr_pkt->type=ROUTE_RETURN; 231 dsr_pkt->src_cnt=0; 232 bmac_tx_packet(&pkt,MAX_ROUTE+16);// TODO check node leaving case no longer exists case 233 } 234 else 235 { 236 dsr_pkt->payload[dsr_pkt->src_cnt]=MYMAC; 237 dsr_pkt->src_cnt++; 238 dsr_pkt->hop_cnt--; 239 dsr_pkt->type=ROUTE_RETURN; 240 bmac_tx_packet(&pkt,MAX_ROUTE+16);// TODO check node leaving case no longer exists case 241 } 242 } 243 if(dsr_pkt->type==ROUTE_RETURN) 244 { 245 if(dsr_pkt->src_route[[dsr_pkt->src_cnt]]!=MYMAC) //Packet is for me 246 { 247 dsr_pkt->src_cnt++; 248 bmac_tx_packet(&pkt,MAX_ROUTE+16);// TODO check node leaving case no longer exists case 249 } 250 } 251 } -
nano-RK/src/net/dsr/dsr.h
r20 r35 3 3 #define DSR_PKT_TX_EVENT 13 4 4 #define DSR_PATH_FOUND_EVENT 12 5 #define DSR_MAX_HOP_COUNT 5 5 #define DSR_PACKET_TIMEOUT 11 6 #define DSR_MAX_HOP_COUNT 10 6 7 #define MAX_ROUTE 16 7 8 #define MAX_PATH_LEN 16 … … 25 26 uint8_t dsr_get_path(uint8_t mac); 26 27 uint8_t dsr_request_path(); 28 void dsr_network_task(); 27 29 typedef struct DSR_PKT 28 30 { … … 34 36 uint8_t *payload; 35 37 }DSR_PKT_INFO; 38 typedef struct DSR_PKT 39 { 40 uint8_t *src_route; 41 uint8_t src_cnt;//your theo pos in the route 42 uint8_t dest_cnt;// how far in the pos is final destination 43 uint8_t type; // type of packet 44 uint8_t len;//length of your packet 45 uint8_t *payload; 46 }DSR_PKT_INFO; 47 36 48 DSR_PKT_INFO rxtx_pkt; 37 49 DSR_PKT_INFO util_pkt; 38 50 nrk_time_t dsr_timeout_timer;
Note: See TracChangeset
for help on using the changeset viewer.
