Вопрос с одной функцией c в PPTP - PullRequest
0 голосов
/ 13 января 2011

Я исследую источник программы PPTP и хочу пояснить, каким образом PPTP назначает сеанс идентификатору вызова и идентификатору однорангового вызова.я нахожу код следующим образом, кто может объяснить код для меня?На самом деле я не ясен с логикой.спасибо!

/*
 * ctrlpacket.c
 *
 * PPTP Control Message packet reading, formatting and writing.
 *
 * $Id: ctrlpacket.c,v 1.6 2005/08/03 09:10:59 quozl Exp $
 */

#define C_BITS (sizeof(unsigned int) * 8)
#define C_SEG(x) (x/C_BITS)
#define C_BIT(x) ((1U)<<(x%C_BITS))
static unsigned int activeCalls[(MAX_CALLS / C_BITS) + 1];
#define MAX_CALLS_PER_TCP_LINK      128
#define MAX_CALLS           60

/*
 * get_call_id
 *
 * Assigns a call ID and peer call ID to the session.
 *
 * args: call_id (OUT) - the call ID for the session
 * retn: 0 on success, -1 on failure
 */
int get_call_id(u_int16_t * loc)
{
 for (i = 0; i < MAX_CALLS; i++) {
  if (!(activeCalls[C_SEG(i)] & C_BIT(i))) {
   activeCalls[C_SEG(i)] |= C_BIT(i);
   *loc = i;
   return 0;
  }
 }
 return -1;
}

Ответы [ 2 ]

1 голос
/ 13 января 2011

activeCalls - битовая карта с MAX_CALLS записями. Он состоит из массива unsigned int, каждый из которых содержит C_BITS битов.

C_SEG() находит правильную запись unsigned int в массиве для данного номера вызова, а C_BIT() идентифицирует правильный бит.

Код просматривает битовую карту и находит первый не установленный бит. Затем он устанавливает этот бит и возвращает индекс.

0 голосов
/ 13 января 2011

Он просто реализует массив логических значений.

Логическое значение использует только один бит и обычно тратит впустую все остальное, поэтому этот код выполняет некоторую перестановку битов для размещения более одного логического значения на элемент массива.

...