aboutsummaryrefslogtreecommitdiff
path: root/src/transport/communicator.h
blob: 38b9f93b1267008a7b6d8d4948926ac9467825f9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
     This file is part of GNUnet.
     Copyright (C) 2009-2014 GNUnet e.V.

     GNUnet is free software: you can redistribute it and/or modify it
     under the terms of the GNU Affero General Public License as published
     by the Free Software Foundation, either version 3 of the License,
     or (at your option) any later version.

     GNUnet is distributed in the hope that it will be useful, but
     WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     Affero General Public License for more details.

     You should have received a copy of the GNU Affero General Public License
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

/**
 * @file transport/communicator.h
 * @brief common internal definitions for communicator services
 * @author Christian Grothoff
 */
#ifndef COMMUNICATOR_H
#define COMMUNICAOTR_H

#include "gnunet_util_lib.h"
#include "gnunet_protocols.h"

GNUNET_NETWORK_STRUCT_BEGIN

/**
 * Message used to tell a communicator about a successful
 * key exchange.
 *
 * Note that this style of KX acknowledgement typically only applies
 * for communicators where the underlying network protocol is
 * unidirectional and/or lacks cryptography.  Furthermore, this is
 * just the recommended "generic" style, communicators are always free
 * to implement original designs that better fit their requirements.
 */
struct GNUNET_TRANSPORT_CommunicatorGenericKXConfirmation
{
  /**
   * Type is #GNUNET_MESSAGE_TYPE_TRANSPORT_COMMUNICATOR_KX_CONFIRMATION
   */
  struct GNUNET_MessageHeader header;

  /**
   * Timestamp from the original sender which identifies the original KX.
   */
  struct GNUNET_TIME_AbsoluteNBO monotonic_time;

  /**
   * How long does the receiver of the KX believe that the address
   * on which the KX was received will continue to be valid.
   */
  struct GNUNET_TIME_RelativeNBO validity;

  /**
   * Hash of the shared secret. Specific hash function may depend on
   * the communicator's protocol details.
   */
  struct GNUNET_HashCode token;
};


/**
 * Message used to tell a communicator about the receiver's
 * flow control limits and to acknowledge receipt of certain
 * messages.
 *
 * Note that a sender MAY choose to violate the flow-control
 * limits provided in this message by a receiver, which may
 * result in messages being lost (after all, transport is an
 * unreliable channel).  So if the sender violates these
 * constraints, it should expect that the receive will simply
 * discard the (partially) received "old" messages.
 *
 * This way, if a sender or receiver crashes, there is no protocol
 * violation.
 *
 * Note that this style of flow control typically only applies
 * for communicators where the underlying network protocol does
 * not already implement flow control.  Furthermore, this is
 * just the recommended "generic" style, communicators are always
 * free to implement original designs that better fit their
 * requirements.
 */
struct GNUNET_TRANSPORT_CommunicatorGenericFCLimits
{
  /**
   * Type is #GNUNET_MESSAGE_TYPE_TRANSPORT_COMMUNICATOR_FC_LIMITS
   */
  struct GNUNET_MessageHeader header;

  /**
   * Maximum number of messages beyond the acknowledged message
   * number that can still be transmitted concurrently without
   * further acknowledgements.
   */
  uint32_t msg_window_size;

  /**
   * Up to which message number were all messages received.
   */
  uint64_t msg_cummulative_ack;

  /**
   * Maximum number of payload bytes beyond the acknowledged
   * number of bytes can still be transmitted without further
   * acknowledgements.
   */
  uint64_t bytes_window_size;

  /**
   * Cummulative acknowledgement for number of bytes received.
   */
  uint64_t bytes_cummulative_ack;

  /**
   * Followed by a variable-size bitfield for messages received
   * beyond @e msg_cummulative_ack. Index at offset 0 must thus
   * be zero, otherwise @e msg_cummulative_ack should be
   * increased.  Note that this field can be overall of 0 bytes.
   * The variable-size bitfield must be a multiple of 64 bits
   * long.
   */
  /* uint64_t msg_selective_ack_field[]; */
};





GNUNET_NETWORK_STRUCT_END

/* end of communicator.h */
#endif