GNUnet 0.28.1-dev.2-13-g57ceb9dfb
 
Loading...
Searching...
No Matches
gnunet-service-cadet_hello.c
Go to the documentation of this file.
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2014, 2017 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
27#include "gnunet_pils_service.h"
28#include "platform.h"
29#include "gnunet_util_lib.h"
32#include "cadet_protocol.h"
37
38#define LOG(level, ...) GNUNET_log_from (level, "cadet-hll", __VA_ARGS__)
39
65
70
75
76
81
86
92
93
94static void
95sign_hello_cb (void *cls,
96 const struct GNUNET_HELLO_Parser *parser,
97 const struct GNUNET_HashCode *hash)
98{
99
103 "Received new PID information with address hash `%s'\n",
104 GNUNET_h2s (hash));
106}
107
108
117static void
118got_hello (void *cls,
119 const struct GNUNET_PEERSTORE_Record *record,
120 const char *err_msg)
121{
122 const struct GNUNET_PeerIdentity *my_identity;
123 struct CadetPeer *peer;
124 struct GNUNET_MessageHeader *hello;
125
127 if (! my_identity)
128 {
129 /* MUST still ask for the next record. Returning without doing so stops
130 this monitor permanently -- the PEERSTORE service waits for a
131 MONITOR_NEXT that never comes -- so CADET would never learn another
132 peer's HELLO for the rest of the process's life. We only need our own
133 identity to skip our own HELLO below, so skipping this one record
134 while PILS is still answering costs nothing. */
136 return;
137 }
138
139 if (NULL == record->value)
140 {
142 return;
143 }
144 hello = record->value;
145 if (0 == GNUNET_memcmp (&record->peer, my_identity))
146 {
148 "Ignoring own HELLOs\n");
150 return;
151 }
152
154 "Hello for %s (%d bytes), expires on %s\n",
155 GNUNET_i2s (&record->peer),
156 ntohs (hello->size),
159 peer = GCP_get (&record->peer,
160 GNUNET_YES);
161 GCP_set_hello (peer,
162 hello);
164}
165
166
167static void
168error_cb (void *cls)
169{
171 "Error in PEERSTORE monitoring\n");
172}
173
174
175static void
176sync_cb (void *cls)
177{
179 "Done with initial PEERSTORE iteration during monitoring\n");
180}
181
182
188void
190{
196 "peerstore",
197 NULL,
199 &error_cb,
200 NULL,
201 &sync_cb,
202 NULL,
203 &got_hello,
204 NULL);
207 NULL);
208}
209
210
214void
216{
217 struct PilsRequest *pr;
218
219 if (NULL != peerstore_notify)
220 {
222 peerstore_notify = NULL;
223 }
224 if (NULL != peerstore)
225 {
227 peerstore = NULL;
228 }
229 while (NULL != (pr = pils_requests_head))
230 {
233 pr);
234 if (NULL != pr->op)
236 if (NULL != pr->builder)
238 GNUNET_free (pr);
239 }
240 if (NULL != pils)
241 {
243 pils = NULL;
244 }
245 if (NULL != mine)
246 {
248 mine = NULL;
249 }
250}
251
252
260{
261 return mine;
262}
263
264
265/* end of gnunet-service-cadet-new_hello.c */
P2P messages used by CADET.
static void record(void *cls, size_t data_size, const void *data)
Process recorded audio data.
static struct GNUNET_PILS_Handle * pils
Handle to PILS.
Definition gnunet-pils.c:44
Information we track per peer.
void GCD_hello_update()
Function called by the HELLO subsystem whenever OUR hello changes.
cadet service; dealing with DHT requests and results
static void sync_cb(void *cls)
void GCH_shutdown()
Shut down the hello subsystem.
void GCH_init(const struct GNUNET_CONFIGURATION_Handle *c)
Initialize the hello subsystem.
static void got_hello(void *cls, const struct GNUNET_PEERSTORE_Record *record, const char *err_msg)
Process each hello message received from peerinfo.
static struct GNUNET_PEERSTORE_Monitor * peerstore_notify
Our peerstore notification context.
static struct GNUNET_PEERSTORE_Handle * peerstore
Handle to the PEERSTORE service.
static struct PilsRequest * pils_requests_head
PILS Operation DLL.
static void sign_hello_cb(void *cls, const struct GNUNET_HELLO_Parser *parser, const struct GNUNET_HashCode *hash)
static struct PilsRequest * pils_requests_tail
PILS Operation DLL.
static struct GNUNET_MessageHeader * mine
Hello message of local peer.
static void error_cb(void *cls)
#define LOG(level,...)
struct GNUNET_MessageHeader * GCH_get_mine()
Get own hello message.
cadet service; dealing with hello messages
struct CadetPeer * GCP_get(const struct GNUNET_PeerIdentity *peer_id, int create)
Retrieve the CadetPeer structure associated with the peer.
void GCP_set_hello(struct CadetPeer *cp, const struct GNUNET_MessageHeader *hello)
We got a HELLO for a cp, remember it, and possibly trigger adequate actions (like trying to connect).
Information we track per peer.
static struct GNUNET_PeerIdentity my_identity
Identity of this peer.
API to the peerstore service.
struct GNUNET_PILS_Handle * GNUNET_PILS_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_PILS_PidChangeCallback pid_change_cb, void *cls)
Connect to the PILS service.
Definition pils_api.c:624
void GNUNET_PILS_disconnect(struct GNUNET_PILS_Handle *handle)
Disconnect from the PILS service.
Definition pils_api.c:647
void GNUNET_PILS_cancel(struct GNUNET_PILS_Operation *op)
Cancel request.
Definition pils_api.c:776
const struct GNUNET_PeerIdentity * GNUNET_PILS_get_identity(const struct GNUNET_PILS_Handle *handle)
Return the current peer identity of a given handle.
Definition pils_api.c:875
API to create, modify and access statistics.
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
void GNUNET_HELLO_builder_free(struct GNUNET_HELLO_Builder *builder)
Release resources of a builder.
Definition hello-uri.c:398
struct GNUNET_MessageHeader * GNUNET_HELLO_parser_to_dht_hello_msg(const struct GNUNET_HELLO_Parser *parser)
Generate DHT HELLO message from a parser.
Definition hello-uri.c:1228
struct GNUNET_TIME_Absolute GNUNET_HELLO_get_expiration_time_from_msg(const struct GNUNET_MessageHeader *msg)
Get the expiration time for this HELLO.
Definition hello-uri.c:642
#define GNUNET_log(kind,...)
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format.
@ GNUNET_YES
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
@ GNUNET_ERROR_TYPE_WARNING
@ GNUNET_ERROR_TYPE_DEBUG
@ GNUNET_ERROR_TYPE_INFO
#define GNUNET_free(ptr)
Wrapper around free.
void GNUNET_PEERSTORE_monitor_stop(struct GNUNET_PEERSTORE_Monitor *zm)
Stop monitoring.
void GNUNET_PEERSTORE_disconnect(struct GNUNET_PEERSTORE_Handle *h)
Disconnect from the PEERSTORE service.
struct GNUNET_PEERSTORE_Monitor * GNUNET_PEERSTORE_monitor_start(const struct GNUNET_CONFIGURATION_Handle *cfg, int iterate_first, const char *sub_system, const struct GNUNET_PeerIdentity *peer, const char *key, GNUNET_SCHEDULER_TaskCallback error_cb, void *error_cb_cls, GNUNET_SCHEDULER_TaskCallback sync_cb, void *sync_cb_cls, GNUNET_PEERSTORE_Processor callback, void *callback_cls)
Request watching a given key The monitoring can be filtered to contain only records matching peer and...
struct GNUNET_PEERSTORE_Handle * GNUNET_PEERSTORE_connect(const struct GNUNET_CONFIGURATION_Handle *cfg)
Connect to the PEERSTORE service.
void GNUNET_PEERSTORE_monitor_next(struct GNUNET_PEERSTORE_Monitor *zm, uint64_t limit)
Calls the monitor processor specified in GNUNET_PEERSTORE_monitor_start for the next record(s).
#define GNUNET_PEERSTORE_HELLO_KEY
Key used for storing HELLO in the peerstore.
const char * GNUNET_STRINGS_absolute_time_to_string(struct GNUNET_TIME_Absolute t)
Like asctime, except for GNUnet time.
Definition strings.c:671
Struct containing all information regarding a given peer.
Context for building (or parsing) HELLO URIs.
Definition hello-uri.c:185
Context for parsing HELLOs.
Definition hello-uri.c:233
A 512-bit hashcode.
Header for all communications.
Handle to the PEERSTORE service.
The identity of the host (wraps the signing key of the peer).
struct GNUNET_PILS_Operation * op
The pils operation.
struct PilsRequest * next
DLL.
struct PilsRequest * prev
DLL.
struct GNUNET_HELLO_Builder * builder
Address builder.