summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2005-06-02 00:18:38 +0200
committerMichael Brown2005-06-02 00:18:38 +0200
commit85a380530d70deb3634d62fdb1330bb90f1b363a (patch)
treeca1cbbd782c5011ee9a8fefdb4f179ed0f9b6222
parentIGMP functions separated out from nic.c (diff)
downloadipxe-85a380530d70deb3634d62fdb1330bb90f1b363a.tar.gz
ipxe-85a380530d70deb3634d62fdb1330bb90f1b363a.tar.xz
ipxe-85a380530d70deb3634d62fdb1330bb90f1b363a.zip
Add generic mechanism for background protocols (e.g. ARP, IGMP)
-rw-r--r--src/core/background.c47
-rw-r--r--src/include/background.h52
2 files changed, 99 insertions, 0 deletions
diff --git a/src/core/background.c b/src/core/background.c
new file mode 100644
index 000000000..1cec05a51
--- /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 000000000..24cb3201f
--- /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 */