PERFORCE change 138373 for review
Paolo Pisati
piso at FreeBSD.org
Sun Mar 23 17:05:02 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=138373
Change 138373 by piso at 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);
More information about the p4-projects
mailing list