X-Git-Url: http://git.archive.openwrt.org/?p=project%2Frelayd.git;a=blobdiff_plain;f=relayd.h;h=d7ad212edb6848cfe9fd9fe3a73f215cae7cb3c9;hp=e724c4eb859b00a935082b5fb7269f08c4c2ee26;hb=HEAD;hpb=b4ba9ff8cb2ed0283ffb05b13d1da0d93f09957a diff --git a/relayd.h b/relayd.h index e724c4e..d7ad212 100644 --- a/relayd.h +++ b/relayd.h @@ -27,13 +27,12 @@ #include #include -#include #include #include -#include "uloop.h" -#include "list.h" +#include +#include #define DEBUG #ifdef DEBUG @@ -68,10 +67,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]; @@ -79,40 +80,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); -void relayd_add_route(struct relayd_host *host); -void relayd_del_route(struct relayd_host *host); +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); +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, bool parse); #endif