X-Git-Url: http://git.archive.openwrt.org/?a=blobdiff_plain;ds=sidebyside;f=relayd.h;h=cd24aa6feacd2f0199a8da8d2e8d6a2c8bd80307;hb=bdc7dd27a9f4774d725b64e733ea45e9679b36cd;hp=c8b023c2a8771dd7a549f878bb7de20bdea62d6d;hpb=05a40ea28dd925212c3a45e73c4080e2dcd4e13d;p=project%2Frelayd.git diff --git a/relayd.h b/relayd.h index c8b023c..cd24aa6 100644 --- a/relayd.h +++ b/relayd.h @@ -73,6 +73,7 @@ struct relayd_interface { struct relayd_host { struct list_head list; + struct list_head routes; struct relayd_interface *rif; uint8_t lladdr[ETH_ALEN]; uint8_t ipaddr[4]; @@ -80,26 +81,17 @@ 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; @@ -108,17 +100,19 @@ struct rtnl_req { 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); @@ -127,6 +121,13 @@ 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); #endif