struct relayd_host {
struct list_head list;
+ struct list_head routes;
struct relayd_interface *rif;
uint8_t lladdr[ETH_ALEN];
uint8_t ipaddr[4];
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;
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, bool add);
+void rtnl_route_set(struct relayd_host *host, struct relayd_route *route, bool add);
-static inline void relayd_add_route(struct relayd_host *host)
+static inline void relayd_add_route(struct relayd_host *host, struct relayd_route *route)
{
- rtnl_route_set(host, true);
+ rtnl_route_set(host, route, true);
}
-static inline void relayd_del_route(struct relayd_host *host)
+static inline void relayd_del_route(struct relayd_host *host, struct relayd_route *route)
{
- rtnl_route_set(host, false);
+ rtnl_route_set(host, route, false);
}
void relayd_add_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);
+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