decrease host timeout, add more ping tries and make them configurable
[project/relayd.git] / relayd.h
index 0fb38e7..cd24aa6 100644 (file)
--- a/relayd.h
+++ b/relayd.h
 #ifndef __RELAYD_H
 #define __RELAYD_H
 
+#include <arpa/inet.h>
+#include <net/if.h>
+#include <net/ethernet.h>
+#include <netinet/if_ether.h>
+#include <netinet/ip.h>
+#include <netinet/udp.h>
+
+#include <linux/if_packet.h>
+#include <linux/rtnetlink.h>
+#include <linux/neighbour.h>
+
+#include <stdint.h>
+#include <stdbool.h>
+
+#include "uloop.h"
+#include "list.h"
+
 #define DEBUG
 #ifdef DEBUG
 #define DPRINTF(level, ...) if (debug >= level) fprintf(stderr, __VA_ARGS__);
@@ -51,10 +68,12 @@ struct relayd_interface {
        struct list_head hosts;
        uint8_t src_ip[4];
        bool managed;
+       int rt_table;
 };
 
 struct relayd_host {
        struct list_head list;
+       struct list_head routes;
        struct relayd_interface *rif;
        uint8_t lladdr[ETH_ALEN];
        uint8_t ipaddr[4];
@@ -62,32 +81,53 @@ struct relayd_host {
        int cleanup_pending;
 };
 
+struct relayd_route {
+       struct list_head list;
+       uint8_t dest[4];
+       uint8_t mask;
+};
+
 struct arp_packet {
        struct ether_header eth;
        struct ether_arp arp;
 } __packed;
 
-struct ip_packet {
-       struct ether_header eth;
-       struct iphdr iph;
-} __packed;
-
-struct dhcp_header {
-       uint8_t op, htype, hlen, hops;
-       uint32_t xit;
-       uint16_t secs, flags;
-       struct in_addr ciaddr, yiaddr, siaddr, giaddr;
-       unsigned char chaddr[16];
-       unsigned char sname[64];
-       unsigned char file[128];
-} __packed;
-
 struct rtnl_req {
        struct nlmsghdr nl;
        struct rtmsg rt;
 } __packed;
 
-struct list_head interfaces;
+extern struct list_head interfaces;
 extern int debug;
+extern int route_table;
+extern uint8_t local_addr[4];
+extern int local_route_table;
+
+void rtnl_route_set(struct relayd_host *host, struct relayd_route *route, bool add);
+
+static inline void relayd_add_route(struct relayd_host *host, struct relayd_route *route)
+{
+       rtnl_route_set(host, route, true);
+}
+
+static inline void relayd_del_route(struct relayd_host *host, struct relayd_route *route)
+{
+       rtnl_route_set(host, route, false);
+}
+
+void relayd_add_interface_routes(struct relayd_interface *rif);
+void relayd_del_interface_routes(struct relayd_interface *rif);
+
+int relayd_rtnl_init(void);
+void relayd_rtnl_done(void);
+
+struct relayd_host *relayd_refresh_host(struct relayd_interface *rif,
+                                       const uint8_t *lladdr,
+                                       const uint8_t *ipaddr);
+void relayd_add_host_route(struct relayd_host *host, const uint8_t *ipaddr, uint8_t mask);
+void relayd_add_pending_route(const uint8_t *gateway, const uint8_t *dest, uint8_t mask, int timeout);
+
+void relayd_forward_bcast_packet(struct relayd_interface *from_rif, void *packet, int len);
+bool relayd_handle_dhcp_packet(struct relayd_interface *rif, void *data, int len, bool forward);
 
 #endif