root/lib/common/ipc_common.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. pcmk__ipc_buffer_size
  2. crm_ipc_default_buffer_size
  3. pcmk__valid_ipc_header
  4. pcmk__client_type_str

   1 /*
   2  * Copyright 2004-2020 the Pacemaker project contributors
   3  *
   4  * The version control history for this file may have further details.
   5  *
   6  * This source code is licensed under the GNU Lesser General Public License
   7  * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY.
   8  */
   9 
  10 #include <crm_internal.h>
  11 
  12 #include <stdio.h>
  13 #include <stdint.h>         // uint64_t
  14 #include <sys/types.h>
  15 
  16 #include <crm/msg_xml.h>
  17 #include "crmcommon_private.h"
  18 
  19 #define MIN_MSG_SIZE    12336    // sizeof(struct qb_ipc_connection_response)
  20 #define MAX_MSG_SIZE    128*1024 // 128k default
  21 
  22 /*!
  23  * \internal
  24  * \brief Choose an IPC buffer size in bytes
  25  *
  26  * \param[in] max  Use this value if environment/default is lower
  27  *
  28  * \return Maximum of max and value of PCMK_ipc_buffer (default 128KB)
  29  */
  30 unsigned int
  31 pcmk__ipc_buffer_size(unsigned int max)
     /* [previous][next][first][last][top][bottom][index][help] */
  32 {
  33     static unsigned int global_max = 0;
  34 
  35     if (global_max == 0) {
  36         const char *env = getenv("PCMK_ipc_buffer");
  37 
  38         if (env) {
  39             int env_max = crm_parse_int(env, "0");
  40 
  41             global_max = (env_max > 0)? QB_MAX(MIN_MSG_SIZE, env_max) : MAX_MSG_SIZE;
  42 
  43         } else {
  44             global_max = MAX_MSG_SIZE;
  45         }
  46     }
  47     return QB_MAX(max, global_max);
  48 }
  49 
  50 /*!
  51  * \brief Return pacemaker's default IPC buffer size
  52  *
  53  * \return IPC buffer size in bytes
  54  */
  55 unsigned int
  56 crm_ipc_default_buffer_size(void)
     /* [previous][next][first][last][top][bottom][index][help] */
  57 {
  58     static unsigned int default_size = 0;
  59 
  60     if (default_size == 0) {
  61         default_size = pcmk__ipc_buffer_size(0);
  62     }
  63     return default_size;
  64 }
  65 
  66 /*!
  67  * \internal
  68  * \brief Check whether an IPC header is valid
  69  *
  70  * \param[in] header  IPC header to check
  71  *
  72  * \return true if IPC header has a supported version, false otherwise
  73  */
  74 bool
  75 pcmk__valid_ipc_header(const pcmk__ipc_header_t *header)
     /* [previous][next][first][last][top][bottom][index][help] */
  76 {
  77     if (header == NULL) {
  78         crm_err("IPC message without header");
  79         return false;
  80 
  81     } else if (header->version > PCMK__IPC_VERSION) {
  82         crm_err("Filtering incompatible v%d IPC message (only versions <= %d supported)",
  83                 header->version, PCMK__IPC_VERSION);
  84         return false;
  85     }
  86     return true;
  87 }
  88 
  89 const char *
  90 pcmk__client_type_str(uint64_t client_type)
     /* [previous][next][first][last][top][bottom][index][help] */
  91 {
  92     switch (client_type) {
  93         case pcmk__client_ipc:
  94             return "IPC";
  95         case pcmk__client_tcp:
  96             return "TCP";
  97 #ifdef HAVE_GNUTLS_GNUTLS_H
  98         case pcmk__client_tls:
  99             return "TLS";
 100 #endif
 101         default:
 102             return "unknown";
 103     }
 104 }

/* [previous][next][first][last][top][bottom][index][help] */