Annotation of embedaddon/bird2/proto/rpki/packets.c, revision 1.1.1.1
1.1 misho 1: /*
2: * BIRD -- The Resource Public Key Infrastructure (RPKI) to Router Protocol
3: *
4: * (c) 2015 CZ.NIC
5: * (c) 2015 Pavel Tvrdik <pawel.tvrdik@gmail.com>
6: *
7: * This file was a part of RTRlib: http://rpki.realmv6.org/
8: *
9: * Can be freely distributed and used under the terms of the GNU GPL.
10: */
11:
12: #include <stdlib.h>
13: #include <string.h>
14: #include <stdio.h>
15:
16: #undef LOCAL_DEBUG
17:
18: #include "rpki.h"
19: #include "transport.h"
20: #include "packets.h"
21:
22: #define RPKI_ADD_FLAG 0b00000001
23:
24: enum rpki_transmit_type {
25: RPKI_RECV = 0,
26: RPKI_SEND = 1,
27: };
28:
29: enum pdu_error_type {
30: CORRUPT_DATA = 0,
31: INTERNAL_ERROR = 1,
32: NO_DATA_AVAIL = 2,
33: INVALID_REQUEST = 3,
34: UNSUPPORTED_PROTOCOL_VER = 4,
35: UNSUPPORTED_PDU_TYPE = 5,
36: WITHDRAWAL_OF_UNKNOWN_RECORD = 6,
37: DUPLICATE_ANNOUNCEMENT = 7,
38: PDU_TOO_BIG = 32
39: };
40:
41: static const char *str_pdu_error_type[] = {
42: [CORRUPT_DATA] = "Corrupt-Data",
43: [INTERNAL_ERROR] = "Internal-Error",
44: [NO_DATA_AVAIL] = "No-Data-Available",
45: [INVALID_REQUEST] = "Invalid-Request",
46: [UNSUPPORTED_PROTOCOL_VER] = "Unsupported-Protocol-Version",
47: [UNSUPPORTED_PDU_TYPE] = "Unsupported-PDU-Type",
48: [WITHDRAWAL_OF_UNKNOWN_RECORD]= "Withdrawal-Of-Unknown-Record",
49: [DUPLICATE_ANNOUNCEMENT] = "Duplicate-Announcement",
50: [PDU_TOO_BIG] = "PDU-Too-Big",
51: };
52:
53: enum pdu_type {
54: SERIAL_NOTIFY = 0,
55: SERIAL_QUERY = 1,
56: RESET_QUERY = 2,
57: CACHE_RESPONSE = 3,
58: IPV4_PREFIX = 4,
59: RESERVED = 5,
60: IPV6_PREFIX = 6,
61: END_OF_DATA = 7,
62: CACHE_RESET = 8,
63: ROUTER_KEY = 9,
64: ERROR = 10,
65: PDU_TYPE_MAX
66: };
67:
68: static const char *str_pdu_type_[] = {
69: [SERIAL_NOTIFY] = "Serial Notify",
70: [SERIAL_QUERY] = "Serial Query",
71: [RESET_QUERY] = "Reset Query",
72: [CACHE_RESPONSE] = "Cache Response",
73: [IPV4_PREFIX] = "IPv4 Prefix",
74: [RESERVED] = "Reserved",
75: [IPV6_PREFIX] = "IPv6 Prefix",
76: [END_OF_DATA] = "End of Data",
77: [CACHE_RESET] = "Cache Reset",
78: [ROUTER_KEY] = "Router Key",
79: [ERROR] = "Error"
80: };
81:
82: static const char *str_pdu_type(uint type) {
83: if (type < PDU_TYPE_MAX)
84: return str_pdu_type_[type];
85: else
86: return "Undefined packet type";
87: }
88:
89: /*
90: * 0 8 16 24 31
91: * .-------------------------------------------.
92: * | Protocol | PDU | |
93: * | Version | Type | reserved = zero |
94: * | 0 or 1 | 0 - 10 | |
95: * +-------------------------------------------+
96: * | |
97: * | Length >= 8 |
98: * | |
99: * `-------------------------------------------' */
100: struct pdu_header {
101: u8 ver;
102: u8 type;
103: u16 reserved;
104: u32 len;
105: } PACKED;
106:
107: struct pdu_cache_response {
108: u8 ver;
109: u8 type;
110: u16 session_id;
111: u32 len;
112: } PACKED;
113:
114: struct pdu_serial_notify {
115: u8 ver;
116: u8 type;
117: u16 session_id;
118: u32 len;
119: u32 serial_num;
120: } PACKED;
121:
122: struct pdu_serial_query {
123: u8 ver;
124: u8 type;
125: u16 session_id;
126: u32 len;
127: u32 serial_num;
128: } PACKED;
129:
130: struct pdu_ipv4 {
131: u8 ver;
132: u8 type;
133: u16 reserved;
134: u32 len;
135: u8 flags;
136: u8 prefix_len;
137: u8 max_prefix_len;
138: u8 zero;
139: ip4_addr prefix;
140: u32 asn;
141: } PACKED;
142:
143: struct pdu_ipv6 {
144: u8 ver;
145: u8 type;
146: u16 reserved;
147: u32 len;
148: u8 flags;
149: u8 prefix_len;
150: u8 max_prefix_len;
151: u8 zero;
152: ip6_addr prefix;
153: u32 asn;
154: } PACKED;
155:
156: /*
157: * 0 8 16 24 31
158: * .-------------------------------------------.
159: * | Protocol | PDU | |
160: * | Version | Type | Error Code |
161: * | 1 | 10 | |
162: * +-------------------------------------------+
163: * | |
164: * | Length |
165: * | |
166: * +-------------------------------------------+
167: * | |
168: * | Length of Encapsulated PDU |
169: * | |
170: * +-------------------------------------------+
171: * | |
172: * ~ Copy of Erroneous PDU ~
173: * | |
174: * +-------------------------------------------+
175: * | |
176: * | Length of Error Text |
177: * | |
178: * +-------------------------------------------+
179: * | |
180: * | Arbitrary Text |
181: * | of |
182: * ~ Error Diagnostic Message ~
183: * | |
184: * `-------------------------------------------' */
185: struct pdu_error {
186: u8 ver;
187: u8 type;
188: u16 error_code;
189: u32 len;
190: u32 len_enc_pdu; /* Length of Encapsulated PDU */
191: byte rest[]; /* Copy of Erroneous PDU
192: * Length of Error Text
193: * Error Diagnostic Message */
194: } PACKED;
195:
196: struct pdu_reset_query {
197: u8 ver;
198: u8 type;
199: u16 flags;
200: u32 len;
201: } PACKED;
202:
203: struct pdu_end_of_data_v0 {
204: u8 ver;
205: u8 type;
206: u16 session_id;
207: u32 len;
208: u32 serial_num;
209: } PACKED;
210:
211: struct pdu_end_of_data_v1 {
212: u8 ver;
213: u8 type;
214: u16 session_id;
215: u32 len;
216: u32 serial_num;
217: u32 refresh_interval;
218: u32 retry_interval;
219: u32 expire_interval;
220: } PACKED;
221:
222: static const size_t min_pdu_size[] = {
223: [SERIAL_NOTIFY] = sizeof(struct pdu_serial_notify),
224: [SERIAL_QUERY] = sizeof(struct pdu_serial_query),
225: [RESET_QUERY] = sizeof(struct pdu_reset_query),
226: [CACHE_RESPONSE] = sizeof(struct pdu_cache_response),
227: [IPV4_PREFIX] = sizeof(struct pdu_ipv4),
228: [RESERVED] = sizeof(struct pdu_header),
229: [IPV6_PREFIX] = sizeof(struct pdu_ipv6),
230: [END_OF_DATA] = sizeof(struct pdu_end_of_data_v0),
231: [CACHE_RESET] = sizeof(struct pdu_cache_response),
232: [ROUTER_KEY] = sizeof(struct pdu_header), /* FIXME */
233: [ERROR] = 16,
234: };
235:
236: static int rpki_send_error_pdu(struct rpki_cache *cache, const enum pdu_error_type error_code, const u32 err_pdu_len, const struct pdu_header *erroneous_pdu, const char *fmt, ...);
237:
238: static void
239: rpki_pdu_to_network_byte_order(struct pdu_header *pdu)
240: {
241: pdu->reserved = htons(pdu->reserved);
242: pdu->len = htonl(pdu->len);
243:
244: switch (pdu->type)
245: {
246: case SERIAL_QUERY:
247: {
248: /* Note that a session_id is converted using converting header->reserved */
249: struct pdu_serial_query *sq_pdu = (void *) pdu;
250: sq_pdu->serial_num = htonl(sq_pdu->serial_num);
251: break;
252: }
253:
254: case ERROR:
255: {
256: struct pdu_error *err = (void *) pdu;
257: u32 *err_text_len = (u32 *)(err->rest + err->len_enc_pdu);
258: *err_text_len = htonl(*err_text_len);
259: err->len_enc_pdu = htonl(err->len_enc_pdu);
260: break;
261: }
262:
263: case RESET_QUERY:
264: break;
265:
266: default:
267: bug("PDU type %s should not be sent by us", str_pdu_type(pdu->type));
268: }
269: }
270:
271: static void
272: rpki_pdu_to_host_byte_order(struct pdu_header *pdu)
273: {
274: /* The Router Key PDU has two one-byte fields instead of one two-bytes field. */
275: if (pdu->type != ROUTER_KEY)
276: pdu->reserved = ntohs(pdu->reserved);
277:
278: pdu->len = ntohl(pdu->len);
279:
280: switch (pdu->type)
281: {
282: case SERIAL_NOTIFY:
283: {
284: /* Note that a session_id is converted using converting header->reserved */
285: struct pdu_serial_notify *sn_pdu = (void *) pdu;
286: sn_pdu->serial_num = ntohl(sn_pdu->serial_num);
287: break;
288: }
289:
290: case END_OF_DATA:
291: {
292: /* Note that a session_id is converted using converting header->reserved */
293: struct pdu_end_of_data_v0 *eod0 = (void *) pdu;
294: eod0->serial_num = ntohl(eod0->serial_num); /* Same either for version 1 */
295:
296: if (pdu->ver == RPKI_VERSION_1)
297: {
298: struct pdu_end_of_data_v1 *eod1 = (void *) pdu;
299: eod1->expire_interval = ntohl(eod1->expire_interval);
300: eod1->refresh_interval = ntohl(eod1->refresh_interval);
301: eod1->retry_interval = ntohl(eod1->retry_interval);
302: }
303: break;
304: }
305:
306: case IPV4_PREFIX:
307: {
308: struct pdu_ipv4 *ipv4 = (void *) pdu;
309: ipv4->prefix = ip4_ntoh(ipv4->prefix);
310: ipv4->asn = ntohl(ipv4->asn);
311: break;
312: }
313:
314: case IPV6_PREFIX:
315: {
316: struct pdu_ipv6 *ipv6 = (void *) pdu;
317: ipv6->prefix = ip6_ntoh(ipv6->prefix);
318: ipv6->asn = ntohl(ipv6->asn);
319: break;
320: }
321:
322: case ERROR:
323: {
324: /* Note that a error_code is converted using converting header->reserved */
325: struct pdu_error *err = (void *) pdu;
326: err->len_enc_pdu = ntohl(err->len_enc_pdu);
327: u32 *err_text_len = (u32 *)(err->rest + err->len_enc_pdu);
328: *err_text_len = htonl(*err_text_len);
329: break;
330: }
331:
332: case ROUTER_KEY:
333: /* Router Key PDU is not supported yet */
334:
335: case SERIAL_QUERY:
336: case RESET_QUERY:
337: /* Serial/Reset Query are sent only in direction router to cache.
338: * We don't care here. */
339:
340: case CACHE_RESPONSE:
341: case CACHE_RESET:
342: /* Converted with pdu->reserved */
343: break;
344: }
345: }
346:
347: /**
348: * rpki_convert_pdu_back_to_network_byte_order - convert host-byte order PDU back to network-byte order
349: * @out: allocated memory for writing a converted PDU of size @in->len
350: * @in: host-byte order PDU
351: *
352: * Assumed: |A == ntoh(ntoh(A))|
353: */
354: static struct pdu_header *
355: rpki_pdu_back_to_network_byte_order(struct pdu_header *out, const struct pdu_header *in)
356: {
357: memcpy(out, in, in->len);
358: rpki_pdu_to_host_byte_order(out);
359: return out;
360: }
361:
362: static void
363: rpki_log_packet(struct rpki_cache *cache, const struct pdu_header *pdu, const enum rpki_transmit_type action)
364: {
365: if (!(cache->p->p.debug & D_PACKETS))
366: return;
367:
368: const char *str_type = str_pdu_type(pdu->type);
369: char detail[256];
370:
371: #define SAVE(fn) \
372: do { \
373: if (fn < 0) \
374: { \
375: bsnprintf(detail + sizeof(detail) - 16, 16, "... <too long>)"); \
376: goto detail_finished; \
377: } \
378: } while(0) \
379:
380: switch (pdu->type)
381: {
382: case SERIAL_NOTIFY:
383: case SERIAL_QUERY:
384: SAVE(bsnprintf(detail, sizeof(detail), "(session id: %u, serial number: %u)", pdu->reserved, ((struct pdu_serial_notify *) pdu)->serial_num));
385: break;
386:
387: case END_OF_DATA:
388: {
389: const struct pdu_end_of_data_v1 *eod = (void *) pdu;
390: if (eod->ver == RPKI_VERSION_1)
391: SAVE(bsnprintf(detail, sizeof(detail), "(session id: %u, serial number: %u, refresh: %us, retry: %us, expire: %us)", eod->session_id, eod->serial_num, eod->refresh_interval, eod->retry_interval, eod->expire_interval));
392: else
393: SAVE(bsnprintf(detail, sizeof(detail), "(session id: %u, serial number: %u)", eod->session_id, eod->serial_num));
394: break;
395: }
396:
397: case CACHE_RESPONSE:
398: SAVE(bsnprintf(detail, sizeof(detail), "(session id: %u)", pdu->reserved));
399: break;
400:
401: case IPV4_PREFIX:
402: {
403: const struct pdu_ipv4 *ipv4 = (void *) pdu;
404: SAVE(bsnprintf(detail, sizeof(detail), "(%I4/%u-%u AS%u)", ipv4->prefix, ipv4->prefix_len, ipv4->max_prefix_len, ipv4->asn));
405: break;
406: }
407:
408: case IPV6_PREFIX:
409: {
410: const struct pdu_ipv6 *ipv6 = (void *) pdu;
411: SAVE(bsnprintf(detail, sizeof(detail), "(%I6/%u-%u AS%u)", ipv6->prefix, ipv6->prefix_len, ipv6->max_prefix_len, ipv6->asn));
412: break;
413: }
414:
415: case ROUTER_KEY:
416: /* We don't support saving Router Key PDUs yet */
417: SAVE(bsnprintf(detail, sizeof(detail), "(ignored)"));
418: break;
419:
420: case ERROR:
421: {
422: const struct pdu_error *err = (void *) pdu;
423: SAVE(bsnprintf(detail, sizeof(detail), "(%s", str_pdu_error_type[err->error_code]));
424:
425: /* Optional description of error */
426: const u32 len_err_txt = *((u32 *) (err->rest + err->len_enc_pdu));
427: if (len_err_txt > 0)
428: {
429: size_t expected_len = err->len_enc_pdu + len_err_txt + 16;
430: if (expected_len == err->len)
431: {
432: char txt[len_err_txt + 1];
433: char *pdu_txt = (char *) err->rest + err->len_enc_pdu + 4;
434: bsnprintf(txt, sizeof(txt), "%s", pdu_txt); /* it's ensured that txt is ended with a null byte */
435: SAVE(bsnprintf(detail + strlen(detail), sizeof(detail) - strlen(detail), ": '%s'", txt));
436: }
437: else
438: {
439: SAVE(bsnprintf(detail + strlen(detail), sizeof(detail) - strlen(detail), ", malformed size"));
440: }
441: }
442:
443: /* Optional encapsulated erroneous packet */
444: if (err->len_enc_pdu)
445: {
446: SAVE(bsnprintf(detail + strlen(detail), sizeof(detail) - strlen(detail), ", %s packet:", str_pdu_type(((struct pdu_header *) err->rest)->type)));
447: if (err->rest + err->len_enc_pdu <= (byte *)err + err->len)
448: {
449: for (const byte *c = err->rest; c != err->rest + err->len_enc_pdu; c++)
450: SAVE(bsnprintf(detail + strlen(detail), sizeof(detail) - strlen(detail), " %02X", *c));
451: }
452: }
453:
454: SAVE(bsnprintf(detail + strlen(detail), sizeof(detail) - strlen(detail), ")"));
455: break;
456: }
457:
458: default:
459: *detail = '\0';
460: }
461: #undef SAVE
462:
463: detail_finished:
464:
465: if (action == RPKI_RECV)
466: {
467: CACHE_TRACE(D_PACKETS, cache, "Received %s packet %s", str_type, detail);
468: }
469: else
470: {
471: CACHE_TRACE(D_PACKETS, cache, "Sending %s packet %s", str_type, detail);
472: }
473:
474: #if defined(LOCAL_DEBUG) || defined(GLOBAL_DEBUG)
475: int seq = 0;
476: for(const byte *c = pdu; c != pdu + pdu->len; c++)
477: {
478: if ((seq % 4) == 0)
479: DBG("%2d: ", seq);
480:
481: DBG(" 0x%02X %-3u", *c, *c);
482:
483: if ((++seq % 4) == 0)
484: DBG("\n");
485: }
486: if ((seq % 4) != 0)
487: DBG("\n");
488: #endif
489: }
490:
491: static int
492: rpki_send_pdu(struct rpki_cache *cache, const void *pdu, const uint len)
493: {
494: struct rpki_proto *p = cache->p;
495: sock *sk = cache->tr_sock->sk;
496:
497: rpki_log_packet(cache, pdu, RPKI_SEND);
498:
499: if (sk->tbuf != sk->tpos)
500: {
501: RPKI_WARN(p, "Old packet overwritten in TX buffer");
502: }
503:
504: if (len > sk->tbsize)
505: {
506: RPKI_WARN(p, "%u bytes is too much for send", len);
507: ASSERT(0);
508: return RPKI_ERROR;
509: }
510:
511: memcpy(sk->tbuf, pdu, len);
512: rpki_pdu_to_network_byte_order((void *) sk->tbuf);
513:
514: if (!sk_send(sk, len))
515: {
516: DBG("Cannot send just the whole data. It will be sent using a call of tx_hook()");
517: }
518:
519: return RPKI_SUCCESS;
520: }
521:
522: /**
523: * rpki_check_receive_packet - make a basic validation of received RPKI PDU header
524: * @cache: cache connection instance
525: * @pdu: RPKI PDU in network byte order
526: *
527: * This function checks protocol version, PDU type, version and size. If all is all right then
528: * function returns |RPKI_SUCCESS| otherwise sends Error PDU and returns
529: * |RPKI_ERROR|.
530: */
531: static int
532: rpki_check_receive_packet(struct rpki_cache *cache, const struct pdu_header *pdu)
533: {
534: u32 pdu_len = ntohl(pdu->len);
535:
536: /*
537: * Minimal and maximal allowed PDU size is treated in rpki_rx_hook() function.
538: * @header.len corresponds to number of bytes of @pdu and
539: * it is in range from RPKI_PDU_HEADER_LEN to RPKI_PDU_MAX_LEN bytes.
540: */
541:
542: /* Do not handle error PDUs here, leave this task to rpki_handle_error_pdu() */
543: if (pdu->ver != cache->version && pdu->type != ERROR)
544: {
545: /* If this is the first PDU we have received */
546: if (cache->request_session_id)
547: {
548: if (pdu->type == SERIAL_NOTIFY)
549: {
550: /*
551: * The router MUST ignore any Serial Notify PDUs it might receive from
552: * the cache during this initial start-up period, regardless of the
553: * Protocol Version field in the Serial Notify PDU.
554: * (https://tools.ietf.org/html/draft-ietf-sidr-rpki-rtr-rfc6810-bis-07#section-7)
555: */
556: }
557: else if (!cache->last_update &&
558: (pdu->ver <= RPKI_MAX_VERSION) &&
559: (pdu->ver < cache->version))
560: {
561: CACHE_TRACE(D_EVENTS, cache, "Downgrade session to %s from %u to %u version", rpki_get_cache_ident(cache), cache->version, pdu->ver);
562: cache->version = pdu->ver;
563: }
564: else
565: {
566: /* If this is not the first PDU we have received, something is wrong with
567: * the server implementation -> Error */
568: rpki_send_error_pdu(cache, UNSUPPORTED_PROTOCOL_VER, pdu_len, pdu, "PDU with unsupported Protocol version received");
569: return RPKI_ERROR;
570: }
571: }
572: }
573:
574: if ((pdu->type >= PDU_TYPE_MAX) || (pdu->ver == RPKI_VERSION_0 && pdu->type == ROUTER_KEY))
575: {
576: rpki_send_error_pdu(cache, UNSUPPORTED_PDU_TYPE, pdu_len, pdu, "Unsupported PDU type %u received", pdu->type);
577: return RPKI_ERROR;
578: }
579:
580: if (pdu_len < min_pdu_size[pdu->type])
581: {
582: rpki_send_error_pdu(cache, CORRUPT_DATA, pdu_len, pdu, "Received %s packet with %d bytes, but expected at least %d bytes", str_pdu_type(pdu->type), pdu_len, min_pdu_size[pdu->type]);
583: return RPKI_ERROR;
584: }
585:
586: return RPKI_SUCCESS;
587: }
588:
589: static int
590: rpki_handle_error_pdu(struct rpki_cache *cache, const struct pdu_error *pdu)
591: {
592: switch (pdu->error_code)
593: {
594: case CORRUPT_DATA:
595: case INTERNAL_ERROR:
596: case INVALID_REQUEST:
597: case UNSUPPORTED_PDU_TYPE:
598: rpki_cache_change_state(cache, RPKI_CS_ERROR_FATAL);
599: break;
600:
601: case NO_DATA_AVAIL:
602: rpki_cache_change_state(cache, RPKI_CS_ERROR_NO_DATA_AVAIL);
603: break;
604:
605: case UNSUPPORTED_PROTOCOL_VER:
606: CACHE_TRACE(D_PACKETS, cache, "Client uses unsupported protocol version");
607: if (pdu->ver <= RPKI_MAX_VERSION &&
608: pdu->ver < cache->version)
609: {
610: CACHE_TRACE(D_EVENTS, cache, "Downgrading from protocol version %d to version %d", cache->version, pdu->ver);
611: cache->version = pdu->ver;
612: rpki_cache_change_state(cache, RPKI_CS_FAST_RECONNECT);
613: }
614: else
615: {
616: CACHE_TRACE(D_PACKETS, cache, "Got UNSUPPORTED_PROTOCOL_VER error PDU with invalid values, " \
617: "current version: %d, PDU version: %d", cache->version, pdu->ver);
618: rpki_cache_change_state(cache, RPKI_CS_ERROR_FATAL);
619: }
620: break;
621:
622: default:
623: CACHE_TRACE(D_PACKETS, cache, "Error unknown, server sent unsupported error code %u", pdu->error_code);
624: rpki_cache_change_state(cache, RPKI_CS_ERROR_FATAL);
625: break;
626: }
627:
628: return RPKI_SUCCESS;
629: }
630:
631: static void
632: rpki_handle_serial_notify_pdu(struct rpki_cache *cache, const struct pdu_serial_notify *pdu)
633: {
634: /* The router MUST ignore any Serial Notify PDUs it might receive from
635: * the cache during this initial start-up period, regardless of the
636: * Protocol Version field in the Serial Notify PDU.
637: * (https://tools.ietf.org/html/draft-ietf-sidr-rpki-rtr-rfc6810-bis-07#section-7)
638: */
639: if (cache->request_session_id)
640: {
641: CACHE_TRACE(D_PACKETS, cache, "Ignore a Serial Notify packet during initial start-up period");
642: return;
643: }
644:
645: /* XXX Serial number should be compared using method RFC 1982 (3.2) */
646: if (cache->serial_num != pdu->serial_num)
647: rpki_cache_change_state(cache, RPKI_CS_SYNC_START);
648: }
649:
650: static int
651: rpki_handle_cache_response_pdu(struct rpki_cache *cache, const struct pdu_cache_response *pdu)
652: {
653: if (cache->request_session_id)
654: {
655: if (cache->last_update)
656: {
657: /*
658: * This isn't the first sync and we already received records. This point
659: * is after Reset Query and before importing new records from cache
660: * server. We need to load new ones and kick out missing ones. So start
661: * a refresh cycle.
662: */
663: if (cache->p->roa4_channel)
664: rt_refresh_begin(cache->p->roa4_channel->table, cache->p->roa4_channel);
665: if (cache->p->roa6_channel)
666: rt_refresh_begin(cache->p->roa6_channel->table, cache->p->roa6_channel);
667:
668: cache->p->refresh_channels = 1;
669: }
670: cache->session_id = pdu->session_id;
671: cache->request_session_id = 0;
672: }
673: else
674: {
675: if (cache->session_id != pdu->session_id)
676: {
677: byte tmp[pdu->len];
678: const struct pdu_header *hton_pdu = rpki_pdu_back_to_network_byte_order((void *) tmp, (const void *) pdu);
679: rpki_send_error_pdu(cache, CORRUPT_DATA, pdu->len, hton_pdu, "Wrong session_id %u in Cache Response PDU", pdu->session_id);
680: rpki_cache_change_state(cache, RPKI_CS_ERROR_FATAL);
681: return RPKI_ERROR;
682: }
683: }
684:
685: rpki_cache_change_state(cache, RPKI_CS_SYNC_RUNNING);
686: return RPKI_SUCCESS;
687: }
688:
689: /**
690: * rpki_prefix_pdu_2_net_addr - convert IPv4/IPv6 Prefix PDU into net_addr_union
691: * @pdu: host byte order IPv4/IPv6 Prefix PDU
692: * @n: allocated net_addr_union for save ROA
693: *
694: * This function reads ROA data from IPv4/IPv6 Prefix PDU and
695: * write them into net_addr_roa4 or net_addr_roa6 data structure.
696: */
697: static net_addr_union *
698: rpki_prefix_pdu_2_net_addr(const struct pdu_header *pdu, net_addr_union *n)
699: {
700: /*
701: * Note that sizeof(net_addr_roa6) > sizeof(net_addr)
702: * and thence we must use net_addr_union and not only net_addr
703: */
704:
705: if (pdu->type == IPV4_PREFIX)
706: {
707: const struct pdu_ipv4 *ipv4 = (void *) pdu;
708: n->roa4.type = NET_ROA4;
709: n->roa4.length = sizeof(net_addr_roa4);
710: n->roa4.prefix = ipv4->prefix;
711: n->roa4.asn = ipv4->asn;
712: n->roa4.pxlen = ipv4->prefix_len;
713: n->roa4.max_pxlen = ipv4->max_prefix_len;
714: }
715: else
716: {
717: const struct pdu_ipv6 *ipv6 = (void *) pdu;
718: n->roa6.type = NET_ROA6;
719: n->roa6.length = sizeof(net_addr_roa6);
720: n->roa6.prefix = ipv6->prefix;
721: n->roa6.asn = ipv6->asn;
722: n->roa6.pxlen = ipv6->prefix_len;
723: n->roa6.max_pxlen = ipv6->max_prefix_len;
724: }
725:
726: return n;
727: }
728:
729: static int
730: rpki_handle_prefix_pdu(struct rpki_cache *cache, const struct pdu_header *pdu)
731: {
732: const enum pdu_type type = pdu->type;
733: ASSERT(type == IPV4_PREFIX || type == IPV6_PREFIX);
734:
735: net_addr_union addr = {};
736: rpki_prefix_pdu_2_net_addr(pdu, &addr);
737:
738: struct channel *channel = NULL;
739:
740: if (type == IPV4_PREFIX)
741: channel = cache->p->roa4_channel;
742: if (type == IPV6_PREFIX)
743: channel = cache->p->roa6_channel;
744:
745: if (!channel)
746: {
747: CACHE_TRACE(D_ROUTES, cache, "Skip %N, missing %s channel", &addr, (type == IPV4_PREFIX ? "roa4" : "roa6"), addr);
748: return RPKI_ERROR;
749: }
750:
751: cache->last_rx_prefix = current_time();
752:
753: /* A place for 'flags' is same for both data structures pdu_ipv4 or pdu_ipv6 */
754: struct pdu_ipv4 *pfx = (void *) pdu;
755: if (pfx->flags & RPKI_ADD_FLAG)
756: rpki_table_add_roa(cache, channel, &addr);
757: else
758: rpki_table_remove_roa(cache, channel, &addr);
759:
760: return RPKI_SUCCESS;
761: }
762:
763: static uint
764: rpki_check_interval(struct rpki_cache *cache, const char *(check_fn)(uint), uint interval)
765: {
766: if (check_fn(interval))
767: {
768: RPKI_WARN(cache->p, "%s, received %u seconds", check_fn(interval), interval);
769: return 0;
770: }
771: return 1;
772: }
773:
774: static void
775: rpki_handle_end_of_data_pdu(struct rpki_cache *cache, const struct pdu_end_of_data_v1 *pdu)
776: {
777: const struct rpki_config *cf = (void *) cache->p->p.cf;
778:
779: if (pdu->session_id != cache->session_id)
780: {
781: byte tmp[pdu->len];
782: const struct pdu_header *hton_pdu = rpki_pdu_back_to_network_byte_order((void *) tmp, (const void *) pdu);
783: rpki_send_error_pdu(cache, CORRUPT_DATA, pdu->len, hton_pdu, "Received Session ID %u, but expected %u", pdu->session_id, cache->session_id);
784: rpki_cache_change_state(cache, RPKI_CS_ERROR_FATAL);
785: return;
786: }
787:
788: if (pdu->ver == RPKI_VERSION_1)
789: {
790: if (!cf->keep_refresh_interval && rpki_check_interval(cache, rpki_check_refresh_interval, pdu->refresh_interval))
791: cache->refresh_interval = pdu->refresh_interval;
792:
793: if (!cf->keep_retry_interval && rpki_check_interval(cache, rpki_check_retry_interval, pdu->retry_interval))
794: cache->retry_interval = pdu->retry_interval;
795:
796: if (!cf->keep_expire_interval && rpki_check_interval(cache, rpki_check_expire_interval, pdu->expire_interval))
797: cache->expire_interval = pdu->expire_interval;
798:
799: CACHE_TRACE(D_EVENTS, cache, "New interval values: "
800: "refresh: %s%us, "
801: "retry: %s%us, "
802: "expire: %s%us",
803: (cf->keep_refresh_interval ? "keeps " : ""), cache->refresh_interval,
804: (cf->keep_retry_interval ? "keeps " : ""), cache->retry_interval,
805: (cf->keep_expire_interval ? "keeps " : ""), cache->expire_interval);
806: }
807:
808: if (cache->p->refresh_channels)
809: {
810: cache->p->refresh_channels = 0;
811: if (cache->p->roa4_channel)
812: rt_refresh_end(cache->p->roa4_channel->table, cache->p->roa4_channel);
813: if (cache->p->roa6_channel)
814: rt_refresh_end(cache->p->roa6_channel->table, cache->p->roa6_channel);
815: }
816:
817: cache->last_update = current_time();
818: cache->serial_num = pdu->serial_num;
819: rpki_cache_change_state(cache, RPKI_CS_ESTABLISHED);
820: }
821:
822: /**
823: * rpki_rx_packet - process a received RPKI PDU
824: * @cache: RPKI connection instance
825: * @pdu: a RPKI PDU in network byte order
826: */
827: static void
828: rpki_rx_packet(struct rpki_cache *cache, struct pdu_header *pdu)
829: {
830: struct rpki_proto *p = cache->p;
831:
832: if (rpki_check_receive_packet(cache, pdu) == RPKI_ERROR)
833: {
834: rpki_cache_change_state(cache, RPKI_CS_ERROR_FATAL);
835: return;
836: }
837:
838: rpki_pdu_to_host_byte_order(pdu);
839: rpki_log_packet(cache, pdu, RPKI_RECV);
840:
841: switch (pdu->type)
842: {
843: case RESET_QUERY:
844: case SERIAL_QUERY:
845: RPKI_WARN(p, "Received a %s packet that is destined for cache server", str_pdu_type(pdu->type));
846: break;
847:
848: case SERIAL_NOTIFY:
849: /* This is a signal to synchronize with the cache server just now */
850: rpki_handle_serial_notify_pdu(cache, (void *) pdu);
851: break;
852:
853: case CACHE_RESPONSE:
854: rpki_handle_cache_response_pdu(cache, (void *) pdu);
855: break;
856:
857: case IPV4_PREFIX:
858: case IPV6_PREFIX:
859: rpki_handle_prefix_pdu(cache, pdu);
860: break;
861:
862: case END_OF_DATA:
863: rpki_handle_end_of_data_pdu(cache, (void *) pdu);
864: break;
865:
866: case CACHE_RESET:
867: /* Cache cannot provide an incremental update. */
868: rpki_cache_change_state(cache, RPKI_CS_NO_INCR_UPDATE_AVAIL);
869: break;
870:
871: case ERROR:
872: rpki_handle_error_pdu(cache, (void *) pdu);
873: break;
874:
875: case ROUTER_KEY:
876: /* TODO: Implement Router Key PDU handling */
877: break;
878:
879: default:
880: CACHE_TRACE(D_PACKETS, cache, "Received unsupported type (%u)", pdu->type);
881: };
882: }
883:
884: int
885: rpki_rx_hook(struct birdsock *sk, uint size)
886: {
887: struct rpki_cache *cache = sk->data;
888: struct rpki_proto *p = cache->p;
889:
890: byte *pkt_start = sk->rbuf;
891: byte *end = pkt_start + size;
892:
893: DBG("rx hook got %u bytes \n", size);
894:
895: while (end >= pkt_start + RPKI_PDU_HEADER_LEN)
896: {
897: struct pdu_header *pdu = (void *) pkt_start;
898: u32 pdu_size = ntohl(pdu->len);
899:
900: if (pdu_size < RPKI_PDU_HEADER_LEN || pdu_size > RPKI_PDU_MAX_LEN)
901: {
902: RPKI_WARN(p, "Received invalid packet length %u, purge the whole receiving buffer", pdu_size);
903: return 1; /* Purge recv buffer */
904: }
905:
906: if (end < pkt_start + pdu_size)
907: break;
908:
909: rpki_rx_packet(cache, pdu);
910:
911: /* It is possible that bird socket was freed/closed */
912: if (p->p.proto_state == PS_DOWN || sk != cache->tr_sock->sk)
913: return 0;
914:
915: pkt_start += pdu_size;
916: }
917:
918: if (pkt_start != sk->rbuf)
919: {
920: CACHE_DBG(cache, "Move %u bytes of a memory at the start of buffer", end - pkt_start);
921: memmove(sk->rbuf, pkt_start, end - pkt_start);
922: sk->rpos = sk->rbuf + (end - pkt_start);
923: }
924:
925: return 0; /* Not purge sk->rbuf */
926: }
927:
928: void
929: rpki_err_hook(struct birdsock *sk, int error_num)
930: {
931: struct rpki_cache *cache = sk->data;
932:
933: if (error_num)
934: {
935: /* sk->err may contains a SSH error description */
936: if (sk->err)
937: CACHE_TRACE(D_EVENTS, cache, "Lost connection: %s", sk->err);
938: else
939: CACHE_TRACE(D_EVENTS, cache, "Lost connection: %M", error_num);
940: }
941: else
942: {
943: CACHE_TRACE(D_EVENTS, cache, "The other side closed a connection");
944: }
945:
946:
947: rpki_cache_change_state(cache, RPKI_CS_ERROR_TRANSPORT);
948: }
949:
950: static int
951: rpki_fire_tx(struct rpki_cache *cache)
952: {
953: sock *sk = cache->tr_sock->sk;
954:
955: uint bytes_to_send = sk->tpos - sk->tbuf;
956: DBG("Sending %u bytes", bytes_to_send);
957: return sk_send(sk, bytes_to_send);
958: }
959:
960: void
961: rpki_tx_hook(sock *sk)
962: {
963: struct rpki_cache *cache = sk->data;
964:
965: while (rpki_fire_tx(cache) > 0)
966: ;
967: }
968:
969: void
970: rpki_connected_hook(sock *sk)
971: {
972: struct rpki_cache *cache = sk->data;
973:
974: CACHE_TRACE(D_EVENTS, cache, "Connected");
975: proto_notify_state(&cache->p->p, PS_UP);
976:
977: sk->rx_hook = rpki_rx_hook;
978: sk->tx_hook = rpki_tx_hook;
979:
980: rpki_cache_change_state(cache, RPKI_CS_SYNC_START);
981: }
982:
983: /**
984: * rpki_send_error_pdu - send RPKI Error PDU
985: * @cache: RPKI connection instance
986: * @error_code: PDU Error type
987: * @err_pdu_len: length of @erroneous_pdu
988: * @erroneous_pdu: optional network byte-order PDU that invokes Error by us or NULL
989: * @fmt: optional description text of error or NULL
990: * @args: optional arguments for @fmt
991: *
992: * This function prepares Error PDU and sends it to a cache server.
993: */
994: static int
995: rpki_send_error_pdu(struct rpki_cache *cache, const enum pdu_error_type error_code, const u32 err_pdu_len, const struct pdu_header *erroneous_pdu, const char *fmt, ...)
996: {
997: va_list args;
998: char msg[128];
999:
1000: /* Size including the terminating null byte ('\0') */
1001: int msg_len = 0;
1002:
1003: /* Don't send errors for erroneous error PDUs */
1004: if (err_pdu_len >= 2)
1005: {
1006: if (erroneous_pdu->type == ERROR)
1007: return RPKI_SUCCESS;
1008: }
1009:
1010: if (fmt)
1011: {
1012: va_start(args, fmt);
1013: msg_len = bvsnprintf(msg, sizeof(msg), fmt, args) + 1;
1014: }
1015:
1016: u32 pdu_size = 16 + err_pdu_len + msg_len;
1017: byte pdu[pdu_size];
1018: memset(pdu, 0, sizeof(pdu));
1019:
1020: struct pdu_error *e = (void *) pdu;
1021: e->ver = cache->version;
1022: e->type = ERROR;
1023: e->error_code = error_code;
1024: e->len = pdu_size;
1025:
1026: e->len_enc_pdu = err_pdu_len;
1027: if (err_pdu_len > 0)
1028: memcpy(e->rest, erroneous_pdu, err_pdu_len);
1029:
1030: *((u32 *)(e->rest + err_pdu_len)) = msg_len;
1031: if (msg_len > 0)
1032: memcpy(e->rest + err_pdu_len + 4, msg, msg_len);
1033:
1034: return rpki_send_pdu(cache, pdu, pdu_size);
1035: }
1036:
1037: int
1038: rpki_send_serial_query(struct rpki_cache *cache)
1039: {
1040: struct pdu_serial_query pdu = {
1041: .ver = cache->version,
1042: .type = SERIAL_QUERY,
1043: .session_id = cache->session_id,
1044: .len = sizeof(pdu),
1045: .serial_num = cache->serial_num
1046: };
1047:
1048: if (rpki_send_pdu(cache, &pdu, sizeof(pdu)) != RPKI_SUCCESS)
1049: {
1050: rpki_cache_change_state(cache, RPKI_CS_ERROR_TRANSPORT);
1051: return RPKI_ERROR;
1052: }
1053:
1054: return RPKI_SUCCESS;
1055: }
1056:
1057: int
1058: rpki_send_reset_query(struct rpki_cache *cache)
1059: {
1060: struct pdu_reset_query pdu = {
1061: .ver = cache->version,
1062: .type = RESET_QUERY,
1063: .len = sizeof(pdu),
1064: };
1065:
1066: if (rpki_send_pdu(cache, &pdu, sizeof(pdu)) != RPKI_SUCCESS)
1067: {
1068: rpki_cache_change_state(cache, RPKI_CS_ERROR_TRANSPORT);
1069: return RPKI_ERROR;
1070: }
1071:
1072: return RPKI_SUCCESS;
1073: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>