From ecf5482c0bcf9c6dc17235392d619826020bc054 Mon Sep 17 00:00:00 2001 From: Andrew Robinson Date: Tue, 22 Jan 2013 11:28:00 -0500 Subject: [PATCH] fixed src address recognition --- cc2520.ko | Bin 38640 -> 39126 bytes packet.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ packet.h | 2 +- unique.c | 8 ++++---- 4 files changed, 62 insertions(+), 5 deletions(-) diff --git a/cc2520.ko b/cc2520.ko index 311d9c8736273d259ac356579e111004111a420e..0996466905654ed6ec9ff7fc4d9feec35af2b376 100644 GIT binary patch delta 7154 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 W-}u7PTtCad$vtwo|E*K=v;QC1#+;-8 delta 6703 zcmZ9Qe{daD702%`N&5(Ci4bTgFYTkmkkYh$Ndpuo&=dkwFhcCFL?|?9N=peCurhTF z?t=!5LzUnLts3Bg9Su+x zzvrBL?!9O4z5BB79rmYR@jDZK^QObg7MAzbt*r6Ay?x(YeZBAXguknJJ2-X2$`8C$ zdfYXo$Nzig%-;s;pPS6BNss%jBa`!7))q_lPv*EygtNB zE3T}#@v1d9u3x+My2>>-_EoN1?1jDS=K0&(!%NnW^cAhY>#U%+HO&v3yG@dr*S2#CFzA`urYvIB% zZb~YZAf0Nh>|1!lg$ow#_*3d%x7IHD&+qyl{>S#$mfv^bRYxx;EPQfPL)f`#YxJ+L zb5p114_AiEwk*pX-Rj&>c+-|keYYmOe@p4Sk~PlFoE?6D%QC;{n()mnrMV}sac&}f zV9WX8=`98R$hG0Zt)+hV&hSdmxh}jDOzaFF-&&eGR^!}2czElj{>;wsJ-M$B|0~p! z`ogffp}-%g4{vEG6&?b2Zw#MpD9yclqjM|5=Nrxsj}h|J#_+?2(gjEFbuJNi?gFN; zA-tsV;@pX^JC`4>Z!8K@p4*JsKgYRd7=OxhUE+7WOofV{_S}g1M@1gI3g++i+%fSJ zr1Y}!ZBX$YQ2F*7J4NEV#Kq2y!g#aiW?&HC?zvi@h76<*Y5b_OkiSOkPV!|phPFdCC=5%&nBvc zN>m5qhdsB;bgSw8rmJK4>A2Qd57n+!nhG5e>3ABdax>B`o{I%+U5E{|coyHXGZFUB*MkQE>+YFy@m(Iw-T7T4R&34XUG*_=@M+#mk-R zhH5xq95qfG^YgR*GUHmPJhjq1ie2IhXLwrXn)L z36a$^B|od?q)5wY|K%yRFzj4qwY#cKlhpNnkNX4c^Dt1z&Qqv-pnh~kgDUnK@ z7O9lu=Y}ek6W94msbVs`5k7cVL+}IzMQNNHM21%b>AfN;9BIz-fp@> zo7i#18 zi&SF3I4IVI=Y3&az_8p>>P9y?P<4rk?7~7A-_7uhCB|}Nm9fUS!B}tHCf?+^7FY~h zq4Iagp5~Z=fo=xOFk+lCI)0AHUt}y7dHvRj`&hWfgCce75m^wuP}A)f4>N7kM??lN zDE@@sCkYm~0&6azVKX~MB+-DFBG5PlwW5Ya;-_RMep-Bl3N3>@Y<=-|&OPxEuXFKx z3`o3#gZk3!3T=eS-*jn7_NL1m2h5Q+_GB3TtNF6v0Scz*2N@pJJ9kKAxWkrZ6l$1b z;#o}Vlf>gsiNtppJE7vbMB;{I=eRv?JY_5_#ooj^hj}_En`GD#zOdu6OE_*jQT~u~ zhcZ@{yKx8>9|}+GxGbPXLzmHpK~IScqM!^isB#fq1vQwp#%hs44a-m5s7Tx~v59TIBI_>@$JqwrE8!pR zUV1hqs6#P1f9K^vvOF7DXB>v=aLn|C^y8ePE8!107DV~QUS6l-iyVIHI*CH0Mk;PX6*12x-c%z8(S!g07Y!?^s;($ujFOp~w7W0gb%1^=}7$i|fzYmD_U9&BcYx`CsjW>N_$WxlZxs-q&2B^wtRV8YmB{$_C{GZibTn0N&z z3e*G!rOBhqe}WKzQPw z-(J+felXwkEb>?TySvxjgtv@VYMGoxH^7>Z&SkflU6j4r?CM$VM0&jK-dnwf@TGg# zT|`X3#c-R65sC3z6tl7Ax~taumJF(s8j&FVi7maswCEUQeO8C>w5(sGKeIKEF4>4Z zV7`m*E6pLax9>Ce%`doeH=gLqasNESAB0ZdYqFQ;9>6cn0p@(?Irg+mmWQuDyd=mB zE)#c-Q!{h0J-NInWZ+l9 zM-8++qX0F~ccnE-mF*)_8R^ua39N}yd7 zX(iBytVqkR-4$v1^?@tW@@v;cT7G@_iu7_O_gMHv+U)$>u4rDyO}n43>WWPP4ti?VfZs>AEyxyH1Nb|-i258Q zUOHw6o4Qc`1?U63!>i4|n`U)*|D5=T(8u`+O3F;W zC+7H{nWGN|81#8JW)0q)6Y$O)eSD5Sf$rd6zqLO-$3Kt9m*%yg{Hmb719hzU|04=k zVkjUWD)H6m=u*knql@@EG0nXy)L{N>!ujq?=ytZy5%WKWt~ocmrWF6I#pBLAf>%GT z1NYX)4es4J`j6=Rr5qyG!N1W145-_*&*O+L4fq0dGmIv*6y3v&`NKLhfvS(i^Zal4 zn1Ro$=&6OQWNXke$N$wixuCNa_^8D1psQzX)A!LjAEQU0Z+p?Dd^6}#wjuX@uYO}eUf;W6PVWBz0rTmi diff --git a/packet.c b/packet.c index 40f6496..e32f337 100644 --- a/packet.c +++ b/packet.c @@ -57,6 +57,63 @@ void cc2520_packet_create_ack(u8 *pkt, u8 *buf) *ptr = IEEE154_ACK_FRAME_LENGTH; } +u64 cc2520_packet_get_src(u8 *buf) +{ + // TODO: Make this a little smarter. + // Right now we're assuming that the + // PAN ID is always present. It's easy + // to construct packets that don't + // follow this contract. + + ieee154_simple_header_t *hdr; + u64 ret; + + u8 src_addr_mode; + u8 dest_addr_mode; + bool pan_compression; + + u8 src_addr_offset; + + ret = 0; + src_addr_offset = 4; + hdr = cc2520_packet_get_header(buf); + + src_addr_mode = ((hdr->fcf >> IEEE154_FCF_SRC_ADDR_MODE) & 0x03); + dest_addr_mode = ((hdr->fcf >> IEEE154_FCF_DEST_ADDR_MODE) & 0x03); + pan_compression = ((hdr->fcf >> IEEE154_FCF_INTRAPAN) & 0x01) == 1; + + if (dest_addr_mode == IEEE154_ADDR_SHORT) { + src_addr_offset += 4; + } + else if (dest_addr_mode == IEEE154_ADDR_EXT) { + src_addr_offset += 10; + } + // WARNING: this is a weird edge case from the + // 802.15.4 spec. + // NOTE: Assuming we're on LE arch. + else if (pan_compression) { + src_addr_offset += 2; + } + + if (src_addr_mode == IEEE154_ADDR_SHORT) { + if (!pan_compression) { + src_addr_offset += 2; + } + memcpy(&ret, buf + src_addr_offset, 2); + } + else if (src_addr_mode == IEEE154_ADDR_EXT) { + if (!pan_compression) { + src_addr_offset += 2; + } + memcpy(&ret, buf + src_addr_offset, 8); + } + + INFO((KERN_INFO "[cc2520] - src_mode: %d dest_mode: %d pan_comp: %d src_addr_offset: %d\n", + src_addr_mode, dest_addr_mode, pan_compression, src_addr_offset)); + + return ret; +} + ieee154_simple_header_t* cc2520_packet_get_header(u8 *buf) { // Ignore the length diff --git a/packet.h b/packet.h index 35b50fa..be98704 100644 --- a/packet.h +++ b/packet.h @@ -93,6 +93,6 @@ bool cc2520_packet_requires_ack_wait(u8 *buf); void cc2520_packet_create_ack(u8 *pkt, u8 *buf); bool cc2520_packet_is_ack(u8* buf); bool cc2520_packet_is_ack_to(u8* pending, u8 * buf); - +u64 cc2520_packet_get_src(u8 *buf); #endif \ No newline at end of file diff --git a/unique.c b/unique.c index a2cbe14..5889955 100644 --- a/unique.c +++ b/unique.c @@ -10,7 +10,7 @@ struct node_list{ struct list_head list; - u16 src; + u64 src; u8 dsn; }; @@ -59,13 +59,13 @@ static void cc2520_unique_rx_done(u8 *buf, u8 len) { struct node_list *tmp; u8 dsn; - u16 src; + u64 src; bool found; bool drop; dsn = cc2520_packet_get_header(buf)->dsn; - src = cc2520_packet_get_header(buf)->src; + src = cc2520_packet_get_src(buf); found = false; drop = false; @@ -89,7 +89,7 @@ static void cc2520_unique_rx_done(u8 *buf, u8 len) tmp->dsn = dsn; tmp->src = src; list_add(&(tmp->list), &nodes); - INFO((KERN_INFO "[cc2520] - unique found new mote: %d\n", src)); + INFO((KERN_INFO "[cc2520] - unique found new mote: %lld\n", src)); } else { INFO((KERN_INFO "[cc2520] - alloc failed.\n"));