summaryrefslogtreecommitdiff
path: root/nhrp/nhrp_packet.h
diff options
context:
space:
mode:
Diffstat (limited to 'nhrp/nhrp_packet.h')
-rw-r--r--nhrp/nhrp_packet.h128
1 files changed, 128 insertions, 0 deletions
diff --git a/nhrp/nhrp_packet.h b/nhrp/nhrp_packet.h
new file mode 100644
index 0000000..3f435c8
--- /dev/null
+++ b/nhrp/nhrp_packet.h
@@ -0,0 +1,128 @@
+/* nhrp_packet.h - In-memory NHRP packet definitions
+ *
+ * Copyright (C) 2007-2009 Timo Teräs <timo.teras@iki.fi>
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 or later as
+ * published by the Free Software Foundation.
+ *
+ * See http://www.gnu.org/ for details.
+ */
+
+#ifndef NHRP_PACKET_H
+#define NHRP_PACKET_H
+
+#include "libev.h"
+#include "list.h"
+#include "nhrp_protocol.h"
+#include "nhrp_address.h"
+
+#define NHRP_MAX_EXTENSIONS 10
+
+#define NHRP_PACKET_DEFAULT_HOP_COUNT 16
+
+struct nhrp_interface;
+
+struct nhrp_buffer {
+ uint32_t length;
+ uint8_t data[NHRP_EMPTY_ARRAY];
+};
+
+struct nhrp_cie {
+ struct list_head cie_list_entry;
+ struct nhrp_cie_header hdr;
+ struct nhrp_address nbma_address;
+ struct nhrp_address protocol_address;
+};
+
+#define NHRP_PAYLOAD_TYPE_ANY -1
+#define NHRP_PAYLOAD_TYPE_NONE 0
+#define NHRP_PAYLOAD_TYPE_RAW 1
+#define NHRP_PAYLOAD_TYPE_CIE_LIST 2
+
+struct nhrp_payload {
+ uint16_t extension_type;
+ uint16_t payload_type;
+ union {
+ struct nhrp_buffer *raw;
+ struct list_head cie_list;
+ } u;
+};
+
+struct nhrp_packet {
+ int ref;
+
+ struct nhrp_packet_header hdr;
+ struct nhrp_address src_nbma_address;
+ struct nhrp_address src_protocol_address;
+ struct nhrp_address dst_protocol_address;
+
+ int num_extensions;
+ struct nhrp_payload extension_by_order[NHRP_MAX_EXTENSIONS];
+ struct nhrp_payload * extension_by_type[NHRP_MAX_EXTENSIONS];
+
+ struct list_head request_list_entry;
+ struct ev_timer timeout;
+ void (*handler)(void *ctx, struct nhrp_packet *packet);
+ void * handler_ctx;
+ int retry;
+
+ uint8_t * req_pdu;
+ size_t req_pdulen;
+
+ struct nhrp_interface * src_iface;
+ struct nhrp_address src_linklayer_address;
+ struct nhrp_interface * dst_iface;
+ struct nhrp_peer * dst_peer;
+};
+
+#define NHRP_EXTENSION_FLAG_NOCREATE 0x00010000
+
+int nhrp_rate_limit_clear(struct nhrp_address *addr, int prefix_len);
+
+struct nhrp_buffer *nhrp_buffer_alloc(uint32_t size);
+struct nhrp_buffer *nhrp_buffer_copy(struct nhrp_buffer *buffer);
+int nhrp_buffer_cmp(struct nhrp_buffer *a, struct nhrp_buffer *b);
+void nhrp_buffer_free(struct nhrp_buffer *buffer);
+
+struct nhrp_cie *nhrp_cie_alloc(void);
+void nhrp_cie_free(struct nhrp_cie *cie);
+void nhrp_cie_reset(struct nhrp_cie *cie);
+
+void nhrp_payload_set_type(struct nhrp_payload *payload, int type);
+void nhrp_payload_set_raw(struct nhrp_payload *payload, struct nhrp_buffer *buf);
+void nhrp_payload_add_cie(struct nhrp_payload *payload, struct nhrp_cie *cie);
+struct nhrp_cie *nhrp_payload_get_cie(struct nhrp_payload *payload, int index);
+void nhrp_payload_free(struct nhrp_payload *payload);
+
+struct nhrp_packet *nhrp_packet_alloc(void);
+struct nhrp_packet *nhrp_packet_get(struct nhrp_packet *packet);
+void nhrp_packet_put(struct nhrp_packet *packet);
+
+struct nhrp_payload *nhrp_packet_payload(struct nhrp_packet *packet, int payload_type);
+struct nhrp_payload *nhrp_packet_extension(struct nhrp_packet *packet,
+ uint32_t extension, int payload_type);
+int nhrp_packet_receive(uint8_t *pdu, size_t pdulen,
+ struct nhrp_interface *iface,
+ struct nhrp_address *from);
+int nhrp_packet_route(struct nhrp_packet *packet);
+int nhrp_packet_reroute(struct nhrp_packet *packet, struct nhrp_peer *dst_peer);
+int nhrp_packet_marshall_and_send(struct nhrp_packet *packet);
+int nhrp_packet_route_and_send(struct nhrp_packet *packet);
+int nhrp_packet_send(struct nhrp_packet *packet);
+int nhrp_packet_send_request(struct nhrp_packet *packet,
+ void (*handler)(void *ctx, struct nhrp_packet *packet),
+ void *ctx);
+int nhrp_packet_send_error(struct nhrp_packet *error_packet,
+ uint16_t indication_code, uint16_t offset);
+int nhrp_packet_send_traffic(struct nhrp_interface *iface,
+ struct nhrp_address *nbma_src,
+ struct nhrp_address *protocol_src,
+ struct nhrp_address *protocol_dst,
+ int protocol_type, uint8_t *pdu, size_t pdulen);
+
+void nhrp_packet_hook_request(int request,
+ int (*handler)(struct nhrp_packet *packet));
+
+#endif