static void do_addr(const char* line, uint8_t len) { uint16_t tmp; skip_ws(&line, &len); if (len == 0) { /* get address value */ write_ok(); uart_write((const uint8_t*)uint16_to_string(mem_addr), 4); write_eol(); } else { /* set address value */ if (string_to_uint16(line, &tmp)) goto on_error; mem_addr = tmp; write_ok(); } return ; on_error: write_ko(); return ; }
static void do_rmem(const char* line, uint8_t len) { uint16_t size; skip_ws(&line, &len); if (len != 4) goto on_error; if (string_to_uint16(line, &size)) goto on_error; if ((mem_addr + size) > DS2433_MEM_SIZE) goto on_error; if (ds2433_read_mem(mem_buf, mem_addr, size)) goto on_error; mem_addr += size; write_ok(); write_buf(mem_buf, size); return ; on_error: write_ko(); return ; }
static bool get_overlay_info( uint32_t vni, uint64_t datapath_id, char **local_address, uint16_t *local_port, char **broadcast_address, uint16_t *broadcast_port ) { debug( "Retrieving overlay network information from database ( vni = %#x, datapath_id = %#" PRIx64 ", local_address = %p, local_port = %p, " "broadcast_address = %p, broadcast_port = %p ).", vni, datapath_id, local_address, local_port, broadcast_address, broadcast_port ); assert( db != NULL ); assert( local_address != NULL ); assert( broadcast_address != NULL ); MYSQL_RES *result = NULL; *local_address = NULL; *broadcast_address = NULL; bool ret = execute_query( db, "select reflectors.broadcast_address,reflectors.broadcast_port from " "overlay_networks,reflectors where overlay_networks.reflector_group_id = reflectors.group_id and " "overlay_networks.slice_id = %u", vni ); if ( !ret ) { goto error; } result = mysql_store_result( db ); if ( result == NULL ) { error( "Failed to retrieve result from database ( %s ).", mysql_error( db ) ); goto error; } assert( mysql_num_fields( result ) == 2 ); if ( mysql_num_rows( result ) == 0 ) { warn( "Failed to retrieve overlay network configuration ( vni = %#x ).", vni ); goto error; } MYSQL_ROW row = mysql_fetch_row( result ); if ( row != NULL ) { *broadcast_address = xstrdup( row[ 0 ] ); ret = string_to_uint16( row[ 1 ], broadcast_port ); if ( !ret ) { error( "Invalid transport port number ( %s ).", row[ 1 ] ); goto error; } } else { error( "Failed to fetch data." ); goto error; } mysql_free_result( result ); result = NULL; ret = execute_query( db, "select local_address,local_port from tunnel_endpoints where datapath_id = %" PRIu64, datapath_id ); if ( !ret ) { goto error; } result = mysql_store_result( db ); if ( result == NULL ) { error( "Failed to retrieve result from database ( %s ).", mysql_error( db ) ); goto error; } assert( mysql_num_fields( result ) == 2 ); if ( mysql_num_rows( result ) == 0 ) { warn( "Failed to retrieve tunnel endpoint configuration ( datapath_id = %#" PRIx64 " ).", datapath_id ); goto error; } row = mysql_fetch_row( result ); if ( row != NULL ) { *local_address = xstrdup( row[ 0 ] ); ret = string_to_uint16( row[ 1 ], local_port ); if ( !ret ) { error( "Invalid transport port number ( %s ).", row[ 1 ] ); goto error; } } else { error( "Failed to fetch data." ); goto error; } mysql_free_result( result ); debug( "Overlay network information is retrieved ( vni = %#x, datapath_id = %#" PRIx64 ", local_address = %s, local_port = %u, " "broadcast_address = %s, broadcast_port = %u ).", vni, datapath_id, *local_address, *local_port, *broadcast_address, *broadcast_port ); return true; error: error( "Failed to retrieve overlay network information from database ( vni = %#x, datapath_id = %#" PRIx64 ", local_address = %p, local_port = %p, " "broadcast_address = %p, broadcast_port = %p ).", vni, datapath_id, local_address, local_port, broadcast_address, broadcast_port ); if ( result != NULL ) { mysql_free_result( result ); } if ( *broadcast_address != NULL ) { xfree( *broadcast_address ); *broadcast_address = NULL; } *broadcast_port = 0; if ( *local_address != NULL ) { xfree( *local_address ); *local_address = NULL; } *local_port = 0; return false; }