diff --git a/src/core/background.c b/src/core/background.c new file mode 100644 index 00000000..1cec05a5 --- /dev/null +++ b/src/core/background.c @@ -0,0 +1,47 @@ +#include "background.h" + +static struct background backgrounds[0] __table_start ( background ); +static struct background backgrounds_end[0] __table_end ( background ); + +/** @file */ + +/** + * Call send method of all background protocols + * + * @v timestamp Current time + * @ret None - + * @err None - + * + * This calls each background protocol's background::send() method. + */ +void background_send ( unsigned long timestamp ) { + struct background *background; + + for ( background = backgrounds ; background < backgrounds_end ; + background++ ) { + if ( background->send ) + background->send ( timestamp ); + } +} + +/** + * Call process method of all background protocols + * + * @v timestamp Current time + * @v ptype Packet type + * @v ip IP header, if present + * @ret None - + * @err None - + * + * This calls each background protocol's background::process() method. + */ +void background_process ( unsigned long timestamp, unsigned short ptype, + struct iphdr *ip ) { + struct background *background; + + for ( background = backgrounds ; background < backgrounds_end ; + background++ ) { + if ( background->process ) + background->process ( timestamp, ptype, ip ); + } +} diff --git a/src/include/background.h b/src/include/background.h new file mode 100644 index 00000000..24cb3201 --- /dev/null +++ b/src/include/background.h @@ -0,0 +1,52 @@ +#ifndef BACKGROUND_H +#define BACKGROUND_H + +/** @file + * + * Background protocols + * + * Some protocols (e.g. ARP, IGMP) operate in the background; the + * upper layers are not aware of their operation. When an ARP query + * for the local station's IP address arrives, Etherboot must reply to + * it regardless of what other operations are currently in progress. + * + * Background protocols are called in two circumstances: when + * Etherboot is about to poll for a packet, and when Etherboot has + * received a packet that the upper layer (whatever that may currently + * be) isn't interested in. + * + */ + +#include "tables.h" +#include "ip.h" + +/** A background protocol */ +struct background { + /** Send method + * + * This method will be called whenever Etherboot is about to + * poll for a packet. The background protocol should use this + * method to send out any periodic transmissions that it may + * require. + */ + void ( *send ) ( unsigned long timestamp ); + /** Process method + * + * This method will be called whenever Etherboot has received + * a packet and doesn't know what to do with it. + */ + void ( *process ) ( unsigned long timestamp, unsigned short ptype, + struct iphdr *ip ); +}; + +/** A member of the background protocols table */ +#define __background __table ( background, 01 ) + +/* Functions in background.c */ + +extern void background_send ( unsigned long timestamp ); + +extern void background_process ( unsigned long timestamp, unsigned short ptype, + struct iphdr *ip ); + +#endif /* BACKGROUND_H */