/*-----------------------------------------------------------------------------------*/ 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; }
/*---------------------------------------------------------------------*/ 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); }
/*---------------------------------------------------------------------------*/ 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); }
/*---------------------------------------------------------------------------*/ 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; } }
/*---------------------------------------------------------------------------*/ 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; }