Example #1
0
/*-----------------------------------------------------------------------------------*/
static short
parse_hello_reply(uint8_t *buf)
{
	if(buf[0] != HELLO_ACK) {
		return 0;
	}

	if(buf[1] != SEC_ARP_REPLY) {
		return 0;
	}

#if DEBUG
	uint8_t i;
	PRINTF("sec-arp: buf ");
	for(i=0; i<(KEY_SIZE*3); i++) PRINTF("%02x ", buf[3+i]);
	PRINTF("\n");
#endif

	/* Write security data to Flash */
	xmem_erase(XMEM_ERASE_UNIT_SIZE, MAC_SECURITY_DATA);
	xmem_pwrite(&buf[3], (KEY_SIZE*3), MAC_SECURITY_DATA);

	PRINTF("sec-arp: parse OK\n");

	watchdog_reboot();

	return 1;
}
Example #2
0
/*---------------------------------------------------------------------*/
static
PT_THREAD(recv_tcpthread(struct pt *pt))
{
  PT_BEGIN(pt);

  /* Read the header. */
  PT_WAIT_UNTIL(pt, uip_newdata() && uip_datalen() > 0);

  if(uip_datalen() < sizeof(struct codeprop_tcphdr)) {
    PRINTF(("codeprop: header not found in first tcp segment\n"));
    uip_abort();
    goto thread_done;
  }

  s.len = uip_htons(((struct codeprop_tcphdr *)uip_appdata)->len);
  s.addr = 0;
  uip_appdata += sizeof(struct codeprop_tcphdr);
  uip_len -= sizeof(struct codeprop_tcphdr);

  xmem_erase(XMEM_ERASE_UNIT_SIZE, EEPROMFS_ADDR_CODEPROP);

  /* Read the rest of the data. */
  do {      
    if(uip_len > 0) {
      xmem_pwrite(uip_appdata, uip_len, EEPROMFS_ADDR_CODEPROP + s.addr);
      s.addr += uip_len;
    }
    if(s.addr < s.len) {
      PT_YIELD_UNTIL(pt, uip_newdata());
    }	
  } while(s.addr < s.len);

  /* Kill old program. */
  elfloader_unload();

  /* Link, load, and start new program. */
  int s;
  static char msg[30 + 10];
  s = elfloader_load(EEPROMFS_ADDR_CODEPROP);
  if (s == ELFLOADER_OK)
    sprintf(msg, "ok\n");
  else
    sprintf(msg, "err %d %s\n", s, elfloader_unknown);
    
  /* Return "ok" message. */
  do {
    s = strlen(msg);
    uip_send(msg, s);
    PT_WAIT_UNTIL(pt, uip_acked() || uip_rexmit() || uip_closed());
  } while(uip_rexmit());

  /* Close the connection. */
  uip_close();
    
 thread_done:;
  PT_END(pt);
}
Example #3
0
/*---------------------------------------------------------------------------*/
void
node_id_burn(unsigned short id)
{
  unsigned char buf[4];
  buf[0] = 0xad;
  buf[1] = 0xde;
  buf[2] = id >> 8;
  buf[3] = id & 0xff;
  xmem_erase(XMEM_ERASE_UNIT_SIZE, NODE_ID_XMEM_OFFSET);
  xmem_pwrite(buf, 4, NODE_ID_XMEM_OFFSET);
}
Example #4
0
/*---------------------------------------------------------------------------*/
int
cfs_write(int f, void *buf, unsigned int len)
{
  if(file.fileptr >= CFS_XMEM_SIZE) {
    return 0;
  }
  if(file.fileptr + len > CFS_XMEM_SIZE) {
    len = CFS_XMEM_SIZE - file.fileptr;
  }

  if(file.fileptr + len > file.filesize) {
    /* Extend the size of the file. */
    file.filesize = file.fileptr + len;
  }
  if(f == 1) {
    xmem_pwrite(buf, len, CFS_XMEM_OFFSET + file.fileptr);
    file.fileptr += len;
    return len;
  } else {
    return -1;
  }
}
Example #5
0
/*---------------------------------------------------------------------------*/
void
key_flash_append_keying_material(void *keying_material, uint16_t len)
{
  xmem_pwrite(keying_material, len, KEY_FLASH_KEYING_MATERIAL_OFFSET + keying_material_offset);
  keying_material_offset += len;
}