socsvn commit: r273571 - soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw

dpl at FreeBSD.org dpl at FreeBSD.org
Wed Sep 3 18:03:35 UTC 2014


Author: dpl
Date: Wed Sep  3 18:03:34 2014
New Revision: 273571
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=273571

Log:
  Added the needed stuff to have a complete bitcode.

Modified:
  soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/ip_fw_rules.c

Modified: soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/ip_fw_rules.c
==============================================================================
--- soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/ip_fw_rules.c	Wed Sep  3 18:01:56 2014	(r273570)
+++ soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/ip_fw_rules.c	Wed Sep  3 18:03:34 2014	(r273571)
@@ -1,5 +1,6 @@
  #include <sys/param.h>
  #include <sys/ucred.h>
+ #include <netinet/in.h>
 
  #define IPFW_RULES_INLINE __unused
  #include "ip_fw_rules.h"
@@ -7,6 +8,71 @@
 // The real function will be compiled and inserted by the JIT.
 int ipfw_chk_jit(struct ip_fw_args *args, struct ip_fw_chain *chain);
 
+void crfree(struct ucred *);
+time_t time_uptime = 0;
+
+/* XXX Function defined at ip_fw_sockopt.c
+ * Find the smallest rule >= key, id.
+ * We could use bsearch but it is so simple that we code it directly
+ */
+int
+ipfw_find_rule(struct ip_fw_chain *chain, uint32_t key, uint32_t id)
+{
+	int i, lo, hi;
+	struct ip_fw *r;
+
+  	for (lo = 0, hi = chain->n_rules - 1; lo < hi;) {
+		i = (lo + hi) / 2;
+		r = chain->map[i];
+		if (r->rulenum < key)
+			lo = i + 1;	/* continue from the next one */
+		else if (r->rulenum > key)
+			hi = i;		/* this might be good */
+		else if (r->id < id)
+			lo = i + 1;	/* continue from the next one */
+		else /* r->id >= id */
+			hi = i;		/* this might be good */
+	};
+	return hi;
+}
+
+/* Defined at extra/missing.c */
+struct tags_freelist tags_freelist;
+int tags_minlen = 64;
+int tags_freelist_count = 0;
+static int tags_freelist_max = 0;
+
+struct mbuf *mbuf_freelist;
+
+void
+m_freem(struct mbuf *m)
+{
+	struct m_tag *t;
+
+	/* free the m_tag chain */
+	while ( (t = SLIST_FIRST(&m->m_pkthdr.tags) ) ) {
+		ND("free tag %p", &m->m_pkthdr.tags);
+		SLIST_REMOVE_HEAD(&m->m_pkthdr.tags, m_tag_link);
+		SLIST_INSERT_HEAD(&tags_freelist, t, m_tag_link);
+		tags_freelist_count++;
+		if (tags_freelist_count > tags_freelist_max) {
+			static int pr=0;
+			if ((pr++ % 1000) == 0)
+				D("new max %d", tags_freelist_count);
+			tags_freelist_max = tags_freelist_count;
+		}
+	}
+	if (m->m_flags & M_STACK) {
+		ND("free invalid mbuf %p", m);
+		return;
+	}
+	/* free the mbuf */
+	ND("free(m = %p, M_IPFW);", m);
+	m->m_next = mbuf_freelist;
+	mbuf_freelist = m;
+};
+
+
 // Declarations of some needed structs.
 struct mbuf;
 struct ifnet;
@@ -26,14 +92,6 @@
 	struct ucred;
 #endif
 
-// Functions used by JIT, external.
-int printf(const char * restrict format, ...);
-int ipfw_find_rule(struct ip_fw_chain *chain, uint32_t key, uint32_t id);
-void crfree(struct ucred *);
-
-// As done at netmap-ipfw
-time_t time_uptime = 0;
-
 // This functions only forces the compiler to store the stubs of the functions
 // so that they can be used by the JIT-compiled code instead.
 // this functions is not to be called anywhere.
@@ -42,6 +100,7 @@
 {
 	struct ip_fw_args arguments;
 	struct ip_fw_chain chainss;
+	uint32_t thing;
 
 	#ifndef __FreeBSD__
 		struct bsd_ucred user_creds;
@@ -68,5 +127,8 @@
 
 	crfree(ucreds);
 #endif
+
+	thing = htonl(thing);
+	thing = ntohl(thing);
 }
 


More information about the svn-soc-all mailing list