Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 23 Mar 2008 17:05:01 GMT
From:      Paolo Pisati <piso@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 138373 for review
Message-ID:  <200803231705.m2NH519J002267@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=138373

Change 138373 by piso@piso_newluxor on 2008/03/23 17:04:40

	Start modifying libalias API to properly use mbuf while in kernel land:
	 -Make LibAliasSaveFragment() & LibAliasGetFrament() mbuf able.
	 -Import some helper macros&c to handle code in kernel & user 
	  land transparently.

Affected files ...

.. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.c#70 edit
.. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.h#18 edit
.. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_db.c#31 edit
.. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_local.h#33 edit

Differences ...

==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.c#70 (text+ko) ====

@@ -1148,44 +1148,51 @@
 (prototypes in alias.h)
 */
 
-// XXX ip free
 int
-LibAliasSaveFragment(struct libalias *la, char *ptr)
+LibAliasSaveFragment(struct libalias *la, pkt_t ptr)
 {
 	int iresult;
 	struct alias_link *lnk;
 	struct ip *pip;
 
 	LIBALIAS_LOCK(la);
-	pip = (struct ip *)ptr;
+	iresult = PKT_ALIAS_ERROR;
+	PULLUP_IPHDR(pip, ptr);
+	if (!pip) 
+		goto getout;
 	lnk = AddFragmentPtrLink(la, pip->ip_src, pip->ip_id);
-	iresult = PKT_ALIAS_ERROR;
 	if (lnk != NULL) {
 		SetFragmentPtr(lnk, ptr);
 		iresult = PKT_ALIAS_OK;
 	}
+getout:
 	LIBALIAS_UNLOCK(la);
 	return (iresult);
 }
 
-// XXX ip free
-char           *
-LibAliasGetFragment(struct libalias *la, char *ptr)
+#ifdef _KERNEL
+struct mbuf *
+#else
+char *
+#endif
+LibAliasGetFragment(struct libalias *la, pkt_t ptr)
 {
 	struct alias_link *lnk;
-	char *fptr;
+	void *fptr;
 	struct ip *pip;
 
 	LIBALIAS_LOCK(la);
-	pip = (struct ip *)ptr;
+	fptr = NULL;
+	PULLUP_IPHDR(pip, ptr);
+	if (!pip) 
+		goto getout;
 	lnk = FindFragmentPtr(la, pip->ip_src, pip->ip_id);
 	if (lnk != NULL) {
 		GetFragmentPtr(lnk, &fptr);
 		SetFragmentPtr(lnk, NULL);
 		SetExpire(lnk, 0);	/* Deletes link */
-	} else		
-		fptr = NULL;
-
+	}
+getout:
 	LIBALIAS_UNLOCK(la);
 	return (fptr);
 }

==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.h#18 (text+ko) ====

@@ -81,6 +81,27 @@
  */
 struct alias_link;
 
+#ifdef _KERNEL
+typedef struct mbuf ** pkt_t;
+
+#define _MTOD(p, foo) (p != NULL) ? mtod(p, foo) : NULL
+
+#define PULLUP_SIZE(pip, ptr, s) do {           \
+	*ptr = m_pullup((*ptr), s);     	\
+        (pip) = _MTOD(*ptr, struct ip *);       \
+} while (0)
+
+#define PULLUP_IPHDR(pip, ptr) do {			                \
+        PULLUP_SIZE(pip, ptr, sizeof(struct ip));                       \
+        if (pip != NULL && ((pip->ip_hl << 2) > sizeof(struct ip)))     \
+                PULLUP_SIZE(pip, ptr, (pip->ip_hl << 2));               \
+} while (0)
+#else
+typedef char * pkt_t;
+
+#define PULLUP_IPHDR(pip, ptr) pip = (struct ip *)ptr
+#endif
+
 /* Initialization and control functions. */
 struct libalias *LibAliasInit(struct libalias *);
 void		LibAliasSetAddress(struct libalias *, struct in_addr _addr);
@@ -118,8 +139,13 @@
 
 /* Fragment Handling functions. */
 void		LibAliasFragmentIn(struct libalias *, char *_ptr, char *_ptr_fragment);
+#ifdef _KERNEL
+struct mbuf    *LibAliasGetFragment(struct libalias *, struct mbuf **_ptr);
+int		LibAliasSaveFragment(struct libalias *, struct mbuf **_ptr);
+#else
 char           *LibAliasGetFragment(struct libalias *, char *_ptr);
 int		LibAliasSaveFragment(struct libalias *, char *_ptr);
+#endif
 
 /* Miscellaneous functions. */
 int		LibAliasCheckNewLink(struct libalias *);

==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_db.c#31 (text+ko) ====

@@ -327,7 +327,7 @@
 								 * lookup tables  */
 
 	union {			/* Auxiliary data                      */
-		char           *frag_ptr;
+		void           *frag_ptr;
 		struct in_addr	frag_addr;
 		struct tcp_dat *tcp;
 	}		data;
@@ -1814,14 +1814,14 @@
 
 
 void
-SetFragmentPtr(struct alias_link *lnk, char *fptr)
+SetFragmentPtr(struct alias_link *lnk, void *fptr)
 {
 	lnk->data.frag_ptr = fptr;
 }
 
 
 void
-GetFragmentPtr(struct alias_link *lnk, char **fptr)
+GetFragmentPtr(struct alias_link *lnk, void **fptr)
 {
 	*fptr = lnk->data.frag_ptr;
 }

==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_local.h#33 (text+ko) ====

@@ -274,8 +274,8 @@
     u_char _proto, u_char _align);
 void		GetFragmentAddr(struct alias_link *_lnk, struct in_addr *_src_addr);
 void		SetFragmentAddr(struct alias_link *_lnk, struct in_addr _src_addr);
-void		GetFragmentPtr(struct alias_link *_lnk, char **_fptr);
-void		SetFragmentPtr(struct alias_link *_lnk, char *fptr);
+void		GetFragmentPtr(struct alias_link *_lnk, void **_fptr);
+void		SetFragmentPtr(struct alias_link *_lnk, void *fptr);
 void		SetStateIn(struct alias_link *_lnk, int _state);
 void		SetStateOut(struct alias_link *_lnk, int _state);
 int		GetStateIn (struct alias_link *_lnk);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200803231705.m2NH519J002267>