Example #1
0
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 ;
}
Example #2
0
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;
}