ccspi application reflexive jamming and reflexive jamming returning the jammed frame...
[goodfet] / client / GoodFETCCSPI.py
index 31aaae0..78273ac 100644 (file)
@@ -24,6 +24,7 @@ class GoodFETCCSPI(GoodFET):
         self.poke(0x12, 0x0500); #MDMCTRL1
         self.poke(0x1C, 0x007F); #IOCFG0
         self.poke(0x19, 0x01C4); #SECCTRL0, disabling crypto
+        self.RF_setsync();
         
     def ident(self):
         return self.peek(0x1E); #MANFIDL
@@ -83,7 +84,7 @@ class GoodFETCCSPI(GoodFET):
         """Write a CCSPI Register."""
         data=[reg,(val>>8)&0xFF,val&0xFF];
         self.writecmd(self.CCSPIAPP,0x03,len(data),data);
-        if self.peek(reg,bytes)!=val:
+        if self.peek(reg,bytes)!=val and reg!=0x18:
             print "Warning, failed to set r%02x=0x%04x, got %02x." %(
                 reg,
                 val,
@@ -120,10 +121,18 @@ class GoodFETCCSPI(GoodFET):
         return 0;
     def RF_setrate(self,rate=0):
         return 0;
+    def RF_getsync(self):
+        return self.peek(0x14);
+    def RF_setsync(self,sync=0xa70F):
+        """Set the SYNC preamble.
+        Use 0xA70F for 0xA7."""
+        self.poke(0x14,sync);
+        return;
+    
     def RF_setfreq(self,frequency):
         """Set the frequency in Hz."""
         mhz=frequency/1000000;
-        fsctrl=self.peek(0x18)&~0x3FF;
+        fsctrl=0x8000; #self.peek(0x18)&(~0x3FF);
         fsctrl=fsctrl+int(mhz-2048)
         self.poke(0x18,fsctrl);
         self.strobe(0x02);
@@ -132,6 +141,11 @@ class GoodFETCCSPI(GoodFET):
         fsctrl=self.peek(0x18);
         mhz=2048+(fsctrl&0x3ff)
         return mhz*1000000;
+    def RF_setchan(self,channel):
+        if channel < 11 or channel > 26:
+            print "Only 802.15.4 channels 11 to 26 are currently supported.";
+        else:
+            self.RF_setfreq( ( (channel-11)*5 + 2405 ) * 1000000 );
     def RF_getsmac(self):
         """Return the source MAC address."""
         return 0xdeadbeef;
@@ -172,6 +186,24 @@ class GoodFETCCSPI(GoodFET):
         #self.strobe(0x09);
         return;
     
+    def RF_reflexjam(self):
+        """Place the device into reflexive jamming mode."""
+        data = "";
+        self.writecmd(self.CCSPIAPP,0xA0,len(data),data);
+        return;
+
+    def RF_reflexjam_seq(self):
+        """Place the device into reflexive jamming mode
+           and return the sequence number of the jammed packet."""
+        #TODO make so that this function someone keeps receiving
+        #     the sequence numbers from each jammed frame, or probably
+        #     just make the firmware auto-ack if the frame requests
+        #     an ACK instead of sending data back to client.
+        data = "\0";
+        self.data = data;
+        self.writecmd(self.CCSPIAPP,0xA1,len(data),data);
+        buffer = self.data;
+        return ord(buffer[3]);
 
     def RF_modulated_spectrum(self):
         """Hold a carrier wave on the present frequency."""
@@ -236,12 +268,20 @@ class GoodFETCCSPI(GoodFET):
 
     def RF_promiscuity(self,promiscuous=1):
         mdmctrl0=self.peek(0x11);
-        #print "mdmctrl0 was %04x" % mdmctrl0;
-        mdmctrl0=mdmctrl0&(~0x800);
-        #print "mdmctrl0 is now %04x" % mdmctrl0;
+        if promiscuous>0:
+            mdmctrl0=mdmctrl0&(~0x800);
+        else:
+            mdmctrl0=mdmctrl0|0x800;
+        self.poke(0x11,mdmctrl0);
+        return;
+    def RF_autocrc(self,autocrc=1):
+        mdmctrl0=self.peek(0x11);
+        if autocrc==0:
+            mdmctrl0=mdmctrl0&(~0x0020);
+        else:
+            mdmctrl0=mdmctrl0|0x0020;
         self.poke(0x11,mdmctrl0);
         return;
-        
     packetlen=16;
     def RF_setpacketlen(self,len=16):
         """Set the number of bytes in the expected payload."""
@@ -272,6 +312,7 @@ class GoodFETCCSPI(GoodFET):
         for foo in packet:
             s="%s %02x" % (s,ord(foo));
         print "#%s" % s;
+        
     def printdissect(self,packet):
         try:
             from scapy.all import Dot15d4