Assistant: 
User: 下面是一个C语言伪代码函数，分别分析该函数的预期目的、参数的作用、详细功能，最后取一个新的函数名字。（用简体中文回答我，并且回答开始前加上'---GPT_START---'字符串结束后加上'---GPT_END---'字符串）
int tnlmon_init()
{
  Elf32_Dyn **dynamic_entry_ptr; // esi
  Elf32_Dyn *dynamic_entry; // eax
  void **dynamic_data_ptr; // edx
  Elf32_Dyn *next_dynamic_entry; // eax
  const char *filename; // eax
  char *comment_ptr; // eax
  int line_length; // eax
  char *delimiter_ptr; // eax
  int property_length; // esi
  int trimmed_value_length; // eax
  int obj_id; // esi
  int fetch_id; // eax
  int object_value; // esi
  int return_value; // eax
  int iter_count; // edi
  const char *attribute_name; // eax
  Elf32_Dyn **error_entry_ptr; // eax
  const char *daemon_state_name; // esi
  int intermediate_value; // eax
  int error_check; // eax
  const void *comparision_obj; // edx
  const char *delimiters_str; // esi
  int token_count; // edi
  char *token; // eax
  int net_obj_id; // edx
  const char *net_obj_addr_str; // eax
  unsigned int net_obj_addr; // eax
  int net_ip; // esi
  int *ip_address_entry; // edi
  const char *feature_name; // eax
  int feature_check; // esi
  char *script_name; // ecx
  char *script_path; // eax
  char *down_script_name; // edx
  bool cluster_installed; // al
  const char *default_filename; // eax
  const char **cluster_feature_name_ptr; // [esp+3Ch] [ebp-690h]
  char *copy_token; // [esp+48h] [ebp-684h]
  const char *peer_gw_entry_name; // [esp+4Ch] [ebp-680h]
  int first_state_check; // [esp+50h] [ebp-67Ch]
  int second_state_check; // [esp+54h] [ebp-678h]
  int daemon_type; // [esp+60h] [ebp-66Ch]
  char *attribute_value; // [esp+64h] [ebp-668h]
  char *optional_param; // [esp+68h] [ebp-664h]
  char *gateway_addr; // [esp+6Ch] [ebp-660h]
  char **first_feature_name_ptr; // [esp+70h] [ebp-65Ch]
  int *ping_value_ptr; // [esp+74h] [ebp-658h]
  int network_count; // [esp+78h] [ebp-654h]
  int life_sign_interval; // [esp+7Ch] [ebp-650h]
  __int64 security_flags; // [esp+80h] [ebp-64Ch]
  int is_error; // [esp+88h] [ebp-644h]
  int is_valid; // [esp+8Ch] [ebp-640h]
  char is_success; // [esp+92h] [ebp-63Ah]
  char default_state; // [esp+93h] [ebp-639h]
  int fwobj_obj_id; // [esp+94h] [ebp-638h]
  int list_first_entry; // [esp+94h] [ebp-638h]
  int status_flag; // [esp+98h] [ebp-634h]
  int *ip_address_list; // [esp+98h] [ebp-634h]
  int valid_net_obj; // [esp+A0h] [ebp-62Ch]
  int attribute_check_value; // [esp+A0h] [ebp-62Ch]
  int address_list_count; // [esp+A0h] [ebp-62Ch]
  char *aliases_list; // [esp+A4h] [ebp-628h]
  FILE *file_stream; // [esp+A8h] [ebp-624h]
  const fwset *fetched_obj; // [esp+A8h] [ebp-624h]
  int network_data; // [esp+A8h] [ebp-624h]
  int network_obj; // [esp+A8h] [ebp-624h]
  int line_buffer[64]; // [esp+B0h] [ebp-61Ch] BYREF
  int property_buffer[64]; // [esp+1B0h] [ebp-51Ch] BYREF
  char line_str[1023]; // [esp+2B0h] [ebp-41Ch] BYREF
  char line_null_terminated; // [esp+6AFh] [ebp-1Dh]

  if ( TdCheckLevelF(3) )
    tderrorFunc((int)&off_8485FF4 - 1021890, 3, 0, (int)&(&off_8485FF4)[-29495] + 3);
  tnlmon_fini();
  dpd_init();
  tnlmon_init_strings_cash();
  life_sign_interval = tnlmon_life_sign_timeout_init();
  tnlmon_dpd_timeout_init();
  life_sign_retransmissions_values_init();
  dynamic_entry_ptr = &off_8485FF4 + 11452;
  if ( *(&off_8485FF4 + 11451) )
  {
    do
    {
      dynamic_entry = *dynamic_entry_ptr;
      dynamic_data_ptr = (void **)dynamic_entry_ptr[1];
      if ( *dynamic_entry_ptr && *dynamic_data_ptr )
      {
        if ( dynamic_entry == (Elf32_Dyn *)1 )
        {
          free(*dynamic_data_ptr);
          dynamic_entry = *dynamic_entry_ptr;
          dynamic_data_ptr = (void **)dynamic_entry_ptr[1];
        }
        if ( dynamic_entry == (Elf32_Dyn *)2 )
        {
          lst_destroy((int)*dynamic_data_ptr);
          dynamic_data_ptr = (void **)dynamic_entry_ptr[1];
        }
      }
      next_dynamic_entry = dynamic_entry_ptr[2];
      dynamic_entry_ptr += 4;
      *dynamic_data_ptr = next_dynamic_entry;
    }
    while ( *(dynamic_entry_ptr - 1) );
  }
  filename = (const char *)fw_filename((int)(&off_8485FF4 - 256526), (int)&off_8485FF4 - 943823);
  if ( !filename )
  {
    if ( !TdCheckLevelF(1) )
      goto LABEL_73;
    error_entry_ptr = &off_8485FF4 - 159543;
    goto LABEL_76;
  }
  file_stream = fopen(filename, (const char *)&off_8485FF4 - 1027019);
  if ( !file_stream )
  {
    if ( *__errno_location() == 2 )
    {
      if ( TdCheckLevelF(3) )
        tderrorFunc((int)&off_8485FF4 - 1021890, 3, 0, (int)&(&off_8485FF4)[-19944]);
      goto LABEL_73;
    }
    if ( !TdCheckLevelF(1) )
    {
LABEL_73:
      default_state = 0;
      status_flag = -1;
      goto LABEL_35;
    }
    error_entry_ptr = (Elf32_Dyn **)((char *)&off_8485FF4 - 948045);
LABEL_76:
    tderrorFunc((int)&off_8485FF4 - 1021890, 1, 0, (int)error_entry_ptr);
    goto LABEL_73;
  }
  while ( fgets((char *)line_buffer, 255, file_stream) )
  {
    sub_8257150(line_buffer);
    comment_ptr = strchr((const char *)line_buffer, 35);
    if ( !comment_ptr )
      comment_ptr = (char *)line_buffer + strlen((const char *)line_buffer);
    line_length = comment_ptr - (char *)line_buffer;
    do
      --line_length;
    while ( line_length >= 0
         && ((unsigned __int8)(*((_BYTE *)line_buffer + line_length) - 9) <= 1u
          || *((_BYTE *)line_buffer + line_length) == 32) );
    *((_BYTE *)line_buffer + line_length + 1) = 0;
    if ( LOBYTE(line_buffer[0]) )
    {
      delimiter_ptr = strchr((const char *)line_buffer, 58);
      if ( delimiter_ptr )
      {
        property_length = delimiter_ptr - (char *)line_buffer;
        strncpy((char *)property_buffer, (char *)line_buffer, delimiter_ptr - (char *)line_buffer);
        do
          --property_length;
        while ( property_length >= 0
             && ((unsigned __int8)(*((_BYTE *)property_buffer + property_length) - 9) <= 1u
              || *((_BYTE *)property_buffer + property_length) == 32) );
        *((_BYTE *)property_buffer + property_length + 1) = 0;
        trimmed_value_length = stpcpy() - (_DWORD)line_str;
        do
          --trimmed_value_length;
        while ( trimmed_value_length >= 0
             && ((unsigned __int8)(line_str[trimmed_value_length] - 9) <= 1u || line_str[trimmed_value_length] == 32) );
        line_str[trimmed_value_length + 1] = 0;
        sub_8257150(line_str);
        obj_id = fwobj_new((int)line_str);
        if ( !strcasecmp((const char *)property_buffer, (const char *)&off_8485FF4 - 1006669) )
          fwobj_put(obj_id, (int)&off_8485FF4 - 943794, (int)line_str);
        if ( !sub_82571E0((const char *)property_buffer, obj_id) )
        {
          if ( TdCheckLevelF(3) )
            tderrorFunc((int)&off_8485FF4 - 1021890, 3, 0, (int)(&off_8485FF4 - 235947));
        }
        fwobj_destroy(obj_id);
      }
      else if ( TdCheckLevelF(3) )
      {
        tderrorFunc((int)&off_8485FF4 - 1021890, 3, 0, (int)(&off_8485FF4 - 159561));
      }
    }
  }
  fclose(file_stream);
  default_state = 1;
  status_flag = 0;
LABEL_35:
  fetch_id = fwa_fetchash();
  fetched_obj = (const fwset *)fwobj_getobj(fetch_id, (int)&(&off_8485FF4)[-19941], 0);
  if ( fetched_obj )
  {
    fwobj_obj_id = fwobj_getobj((int)fetched_obj, (int)&off_8485FF4 - 1006669, 0);
    fwset_iterator::fwset_iterator((fwset_iterator *)property_buffer, fetched_obj);
    while ( fwset_iterator::next((fwset_iterator *)property_buffer) )
    {
      object_value = fwobj_getobj((int)fetched_obj, (int)&off_8485FF4 - 1006669, 0);
      if ( object_value && TdCheckLevelF(0) )
      {
        fwobj_names(object_value);
        tderrorFunc((int)&off_8485FF4 - 1021890, 0, 0, (int)&(&off_8485FF4)[-29492] + 1);
      }
    }
    if ( fwobj_obj_id )
    {
      if ( status_flag )
      {
        fwset_iterator::fwset_iterator((fwset_iterator *)line_str, fetched_obj);
        iter_count = 0;
        while ( fwset_iterator::next((fwset_iterator *)line_str) )
        {
          valid_net_obj = fwobj_igetobj();
          attribute_name = (const char *)fwset_iterator::name((fwset_iterator *)line_str);
          if ( sub_82571E0(attribute_name, valid_net_obj) || !TdCheckLevelF(3) )
          {
            ++iter_count;
          }
          else
          {
            fwset_iterator::name((fwset_iterator *)line_str);
            tderrorFunc((int)&off_8485FF4 - 1021890, 3, 0, (int)"%s: unrecognized attribute %s");
            ++iter_count;
          }
        }
        tnlmon_up_down_interval_init();
        fwset_iterator::~fwset_iterator((fwset_iterator *)line_str);
        is_success = 1;
        is_error = 0;
        goto LABEL_45;
      }
      vpnd_features_log(&(&off_8485FF4)[-19935] + 1, 1, 16, 256, 0, 10);
    }
    else if ( TdCheckLevelF(3) )
    {
      tderrorFunc((int)&off_8485FF4 - 1021890, 3, 0, (int)(&off_8485FF4 - 159493));
    }
    is_success = default_state;
    is_error = -1;
LABEL_45:
    fwset_iterator::~fwset_iterator((fwset_iterator *)property_buffer);
    goto LABEL_46;
  }
  if ( TdCheckLevelF(3) )
    tderrorFunc((int)&off_8485FF4 - 1021890, 3, 0, (int)(&off_8485FF4 - 159507));
  is_success = default_state;
  is_error = -1;
LABEL_46:
  if ( !is_success )
  {
    if ( TdCheckLevelF(3) )
      tderrorFunc((int)&off_8485FF4 - 1021890, 3, 0, (int)(&off_8485FF4 - 159452));
    RIM_Route_Clear();
    return _vpn_ioctl_dtab_del_all((int)(&off_8485FF4 - 109309), (int)"dpd_initiator_sn");
  }
  ping_value_ptr = (int *)(&off_8485FF4 + 129469);
  sanity_configuration_check(&off_8485FF4 + 129469, &off_8485FF4 + 129468);
  if ( TdCheckLevelF(3) )
    tderrorFunc((int)&off_8485FF4 - 1021890, 3, 0, (int)(&off_8485FF4 - 159442));
  first_feature_name_ptr = (char **)(&off_8485FF4 + 129462);
  if ( *(&off_8485FF4 + 129462) && (*(&off_8485FF4 + 129464) || *(&off_8485FF4 + 129463)) )
  {
    if ( TdCheckLevelF(3) )
      tderrorFunc((int)&off_8485FF4 - 1021890, 3, 0, (int)(&off_8485FF4 - 159429));
    return _vpn_ioctl_dtab_del_all((int)(&off_8485FF4 - 109309), (int)"dpd_initiator_sn");
  }
  daemon_state_name = (const char *)*(&off_8485FF4 + 129470);
  if ( daemon_state_name )
  {
    first_state_check = strcasecmp(daemon_state_name, (const char *)&off_8485FF4 - 943730);
    if ( first_state_check )
    {
      second_state_check = strcasecmp(daemon_state_name, (const char *)&off_8485FF4 - 943723);
      if ( second_state_check )
      {
        if ( TdCheckLevelF(3) )
          tderrorFunc((int)&off_8485FF4 - 1021890, 3, 0, (int)(&(&off_8485FF4)[-19926] + 1));
        return _vpn_ioctl_dtab_del_all((int)(&off_8485FF4 - 109309), (int)"dpd_initiator_sn");
      }
      first_state_check = 1;
    }
    else
    {
      second_state_check = 1;
    }
  }
  else
  {
    first_state_check = 0;
    second_state_check = 0;
  }
  tnlmon_db_create();
  if ( daemon_conf_get_daemon_type() == 1 )
    tnlmon_job_invoker_init();
  is_valid = 0;
  list_first_entry = lst_first((int)*(&off_8485FF4 + 129467));
  if ( !list_first_entry )
  {
LABEL_131:
    feature_name = (const char *)*(&off_8485FF4 + 129459);
    if ( feature_name )
    {
      feature_check = strcasecmp(feature_name, (const char *)&(&off_8485FF4)[-31598] + 6);
      if ( daemon_conf_get_daemon_type() != 2 )
      {
        if ( feature_check )
          return RIM_Fini();
        goto LABEL_134;
      }
    }
    else if ( daemon_conf_get_daemon_type() != 2 )
    {
LABEL_134:
      if ( is_valid )
      {
        if ( TdCheckLevelF(3) )
          tderrorFunc((int)&off_8485FF4 - 1021890, 3, 0, (int)(&off_8485FF4 - 159286));
        RIM_EncDomainDB_Init();
      }
      else if ( TdCheckLevelF(3) )
      {
        tderrorFunc((int)&off_8485FF4 - 1021890, 3, 0, (int)(&off_8485FF4 - 159277));
      }
      script_name = (char *)*(&off_8485FF4 + 129464);
      if ( script_name )
      {
        script_path = *first_feature_name_ptr;
        down_script_name = (char *)*(&off_8485FF4 + 129463);
      }
      else
      {
        down_script_name = (char *)tnlmon_script_down;
        script_path = *first_feature_name_ptr;
        if ( !tnlmon_script_down )
        {
          script_name = 0;
          if ( !script_path )
          {
            default_filename = (const char *)fw_filename((int)&off_8485FF4 - 943505, (int)&(&off_8485FF4)[-29485] + 1);
            script_path = strdup(default_filename);
            down_script_name = (char *)tnlmon_script_down;
            script_name = (char *)*(&off_8485FF4 + 129464);
            *first_feature_name_ptr = script_path;
          }
        }
      }
      return RIM_Init(
               (char *)*(&off_8485FF4 + 129466),
               (const char *)*(&off_8485FF4 + 129465),
               (const char *)*(&off_8485FF4 + 129461),
               script_name,
               down_script_name,
               script_path);
    }
    return_value = TdCheckLevelF(3);
    if ( return_value )
      return tderrorFunc((int)&off_8485FF4 - 1021699, 3, 0, (int)(&off_8485FF4 - 235886));
    return return_value;
  }
  network_count = 0;
  cluster_feature_name_ptr = (const char **)(&off_8485FF4 + 129460);
  while ( 1 )
  {
    network_data = lst_data(list_first_entry);
    aliases_list = (char *)fwobj_get(network_data, (int)&off_8485FF4 - 943794);
    if ( !aliases_list )
    {
      if ( TdCheckLevelF(3) )
        tderrorFunc((int)&off_8485FF4 - 1021890, 3, 0, (int)&off_8485FF4 - 943714);
      goto LABEL_130;
    }
    gateway_addr = (char *)fwobj_get(network_data, (int)&off_8485FF4 - 943687);
    optional_param = (char *)fwobj_get(network_data, (int)&(&off_8485FF4)[-29490] + 2);
    HIDWORD(security_flags) = obj_true(network_data, (int)&off_8485FF4 - 943667);
    LODWORD(security_flags) = obj_true(network_data, (int)&off_8485FF4 - 943651);
    attribute_value = (char *)fwobj_get(network_data, (int)&off_8485FF4 - 943633);
    intermediate_value = 1;
    if ( !security_flags )
      intermediate_value = is_valid;
    is_valid = intermediate_value;
    line_buffer[0] = *ping_value_ptr;
    property_buffer[0] = life_sign_interval;
    if ( !fwobj_getint(network_data, (int)(&off_8485FF4 - 159685), (int)line_buffer) && TdCheckLevelF(3) )
      tderrorFunc((int)&off_8485FF4 - 1021890, 3, 0, (int)(&off_8485FF4 - 159398));
    if ( !fwobj_getint(network_data, (int)&off_8485FF4 - 943623, (int)property_buffer) && TdCheckLevelF(3) )
      tderrorFunc((int)&off_8485FF4 - 1021890, 3, 0, (int)(&off_8485FF4 - 159374));
    if ( TdCheckLevelF(3) )
    {
      sio_swrite(0, 0, network_data);
      tderrorFunc((int)&off_8485FF4 - 1021890, 3, 0, (int)(&off_8485FF4 - 159353));
    }
    attribute_check_value = fwobj_get(network_data, (int)&off_8485FF4 - 943605);
    if ( attribute_check_value )
    {
      error_check = TdCheckLevelF(3);
      comparision_obj = (const void *)attribute_check_value;
      if ( error_check )
      {
        tderrorFunc((int)&off_8485FF4 - 1021890, 3, 0, (int)(&(&off_8485FF4)[-19918] + 1));
        comparision_obj = (const void *)attribute_check_value;
      }
      if ( !memcmp(comparision_obj, (char *)&(&off_8485FF4)[-29487] + 3, 4u) )
      {
        daemon_type = 1;
        goto LABEL_105;
      }
      if ( !memcmp(comparision_obj, (char *)&(&off_8485FF4)[-29487] + 7, 8u) )
      {
        daemon_type = 2;
LABEL_105:
        daemon_conf_get_daemon_type();
        goto LABEL_106;
      }
    }
    if ( daemon_conf_get_daemon_type() == 2 )
    {
      if ( TdCheckLevelF(3) )
        tderrorFunc((int)&off_8485FF4 - 1021699, 3, 0, (int)(&off_8485FF4 - 159332));
      goto LABEL_130;
    }
    daemon_type = 0;
LABEL_106:
    delimiters_str = (char *)&(&off_8485FF4)[-29646] + 3;
    peer_gw_entry_name = (const char *)fwobj_get(network_data, (int)&off_8485FF4 - 943569);
    strncpy(line_str, aliases_list, 1024);
    line_null_terminated = 0;
    if ( strtok(line_str, (const char *)&(&off_8485FF4)[-29646] + 3) )
    {
      token_count = network_count;
      do
        ++token_count;
      while ( strtok(0, delimiters_str) );
      network_count = token_count;
    }
    ip_address_list = (int *)calloc(network_count + 1, 8u);
    if ( !ip_address_list )
      break;
    strncpy(line_str, aliases_list, 1024);
    line_null_terminated = 0;
    token = strtok(line_str, delimiters_str);
    address_list_count = 0;
    for ( copy_token = token; token; token = strtok(0, (const char *)&(&off_8485FF4)[-29646] + 3) )
    {
      net_obj_id = fwnetobj_getbyname((int)token);
      if ( net_obj_id )
      {
        network_obj = net_obj_id;
        net_obj_addr_str = (const char *)fwobj_get(net_obj_id, (int)&off_8485FF4 - 1024210);
        net_obj_addr = inet_addr(net_obj_addr_str);
        net_ip = net_obj_addr;
        if ( net_obj_addr )
        {
          ip_address_entry = &ip_address_list[2 * address_list_count];
          *ip_address_entry = _byteswap_ulong(net_obj_addr);
          if ( is_profile(network_obj) )
          {
            if ( TdCheckLevelF(3) )
            {
              praddr(net_ip);
              tderrorFunc((int)&off_8485FF4 - 1021890, 3, 0, (int)(&(&off_8485FF4)[-19915] + 1));
            }
            ip_address_entry[1] = 4;
          }
          else
          {
            if ( TdCheckLevelF(3) )
            {
              praddr(net_ip);
              tderrorFunc((int)&off_8485FF4 - 1021890, 3, 0, (int)(&off_8485FF4 - 159310));
            }
            ip_address_entry[1] = 1;
          }
          ++address_list_count;
        }
      }
    }
    if ( is_error && default_state )
    {
      if ( second_state_check )
        goto LABEL_149;
      if ( first_state_check )
        goto LABEL_128;
    }
    else if ( !is_error )
    {
      if ( !strcasecmp(peer_gw_entry_name, (const char *)&off_8485FF4 - 943730) )
      {
LABEL_149:
        if ( *cluster_feature_name_ptr )
          cluster_installed = strcasecmp(*cluster_feature_name_ptr, (const char *)&(&off_8485FF4)[-31598] + 6) == 0;
        else
          cluster_installed = is_success;
        tnlmon_set_cluster_installed(cluster_installed);
        tnlmon_init_peer_gw_list(
          copy_token,
          ip_address_list,
          gateway_addr,
          optional_param,
          SHIDWORD(security_flags),
          security_flags,
          attribute_value,
          daemon_type,
          line_buffer[0],
          property_buffer[0]);
        if ( TdCheckLevelF(3) )
          tderrorFunc((int)&off_8485FF4 - 1021890, 3, 0, (int)(&off_8485FF4 - 159301));
        tnlmon_set_ping_timers(*ping_value_ptr, (int)*(&off_8485FF4 + 129468));
        tnlmon_dpd_up_interval_init();
        tnlmon_dpd_validate_timers();
        goto LABEL_129;
      }
      if ( !strcasecmp(peer_gw_entry_name, (const char *)&off_8485FF4 - 943723) )
LABEL_128:
        tnlmon_init_peer_gw_passive_list(
          copy_token,
          (unsigned int *)ip_address_list,
          gateway_addr,
          optional_param,
          SHIDWORD(security_flags),
          security_flags,
          attribute_value,
          daemon_type,
          line_buffer[0],
          property_buffer[0]);
    }
LABEL_129:
    free(ip_address_list);
LABEL_130:
    list_first_entry = lst_next(list_first_entry);
    if ( !list_first_entry )
      goto LABEL_131;
  }
  return_value = TdCheckLevelF(3);
  if ( return_value )
    return tderrorFunc((int)&off_8485FF4 - 1021890, 3, 0, (int)&off_8485FF4 - 943562);
  return return_value;
}

Assistant: