Date: Mon, 3 Jul 2006 15:22:54 GMT From: Paolo Pisati <piso@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 100507 for review Message-ID: <200607031522.k63FMsQP001281@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=100507 Change 100507 by piso@piso_newluxor on 2006/07/03 15:22:38 Revert previous changes: i axed too much stuff. Affected files ... .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_mod.c#4 edit .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_mod.h#3 edit Differences ... ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_mod.c#4 (text+ko) ==== @@ -56,15 +56,20 @@ #include <sys/types.h> +#if __FreeBSD_version >= 500000 /* XXX - make the compiler happy... */ int strncmp(const char *s1, const char *s2, size_t len); +#endif -/* Protocol and userland module handlers chains. */ +/* protocol and userland module handlers chains */ struct chain handler_chain, dll_chain; -// XXX - use queue(3) and errno.h #ifdef _KERNEL +#if __FreeBSD_version >= 500000 + +/* Fine grained locking for 5.x, 6.x and 7.x */ + #define LIBALIAS_LOCK_INIT(_chain) \ mtx_init(&(_chain)->mtx, "libalias list of proto-handlers", NULL, \ MTX_DEF | MTX_RECURSE) @@ -122,8 +127,58 @@ if (mtx_initialized(&c->mtx)) LIBALIAS_LOCK_DESTROY(c); } +#else + +/* Good old spl*() locking for 4.x */ +/* + * XXX - i'm not sure about mutex & conditional var + * conversion that i did using spl*()... + */ + +#define LIBALIAS_LOCK_INIT(_chain) (_chain)->spl = 0 +#define LIBALIAS_LOCK_DESTROY(_chain) +#define LIBALIAS_WLOCK_ASSERT(_chain) do { \ + KASSERT(_chain->spl != 0, ("chain not locked")); \ +} while (0) + +static __inline void +LIBALIAS_RLOCK(struct chain *chain) +{ + chain->spl = splimp(); +} -#else +static __inline void +LIBALIAS_RUNLOCK(struct chain *chain) +{ + splx(chain->spl); +} + +static __inline void +LIBALIAS_WLOCK(struct chain *chain) +{ + LIBALIAS_RLOCK(chain); +} + +static __inline void +LIBALIAS_WUNLOCK(struct chain *chain) +{ + LIBALIAS_RUNLOCK(chain); +} + +static void +_handler_chain_init(struct chain *c) { + + c->spl = 0; +} + +static void +_handler_chain_destroy(struct chain *c) { + + ; +} + +#endif +#else #define LIBALIAS_LOCK_INIT(_chain) ; #define LIBALIAS_LOCK_DESTROY(_chain) ; @@ -182,16 +237,16 @@ LIBALIAS_WLOCK_ASSERT(c); b = (struct proto_handler **)&c->chain; - p->next = NULL; /* I'm paranoid... */ + p->next = NULL; /* i'm paranoid... */ for(; *b != NULL; b = &((*b)->next), i++) { if (((*b)->pri == p->pri) && ((*b)->dir == p->dir) && ((*b)->proto == p->proto)) - return (EHDCON); /* Priority conflict. */ + return (EHDCON); /* priority conflict */ if ((*b)->pri > p->pri) { p->next = *b; break; } } - /* End of list or got right position, insert here. */ + /* end of list or got right position, insert here */ *b = p; return (OK); } @@ -205,62 +260,62 @@ for(; (*b != NULL) && (*b != p); b = &((*b)->next)) ; if (*b == p) *b = p->next; - else return (EHDNOF); /* Handler not found. */ + else return (EHDNOF); /* handler not found */ return (OK); } int attach_handlers(struct proto_handler *_p) { - int i, error = NOK; + int i, res = NOK; LIBALIAS_WLOCK(&handler_chain); for (i=0; 1; i++) { if (*((int *)&_p[i]) == EOH) break; - error = _attach_handler(&handler_chain, &_p[i]); - if (error != OK) break; + res = _attach_handler(&handler_chain, &_p[i]); + if (res != OK) break; } LIBALIAS_WUNLOCK(&handler_chain); - return (error); + return (res); } int detach_handlers(struct proto_handler *_p) { - int i, error = NOK; + int i, res = NOK; LIBALIAS_WLOCK(&handler_chain); for (i=0; 1; i++) { if (*((int *)&_p[i]) == EOH) break; - error = _detach_handler(&handler_chain, &_p[i]); - if (error != OK) break; + res = _detach_handler(&handler_chain, &_p[i]); + if (res != OK) break; } LIBALIAS_WUNLOCK(&handler_chain); - return (error); + return (res); } int detach_handler(struct proto_handler *_p) { - int error = NOK; + int res = NOK; LIBALIAS_WLOCK(&handler_chain); - error = _detach_handler(&handler_chain, _p); + res = _detach_handler(&handler_chain, _p); LIBALIAS_WUNLOCK(&handler_chain); - return (error); + return (res); } int find_handler(int8_t dir, int8_t proto, struct libalias *la, struct ip *pip, struct alias_data *ad) { struct proto_handler *p; - int error; + int err; LIBALIAS_RLOCK(&handler_chain); - for (p = handler_chain.chain, error = EHDNOF; p != NULL; p = p->next) + for (p = handler_chain.chain, err = EHDNOF; p != NULL; p = p->next) if ((p->dir & dir) && (p->proto & proto)) if (p->fingerprint(la, pip, ad) == OK) { - error = p->protohandler(la, pip, ad); + err = p->protohandler(la, pip, ad); break; } LIBALIAS_RUNLOCK(&handler_chain); - return (error); + return (err); } struct proto_handler * @@ -276,11 +331,11 @@ LIBALIAS_WLOCK_ASSERT(c); b = (struct dll **)&c->chain; - p->next = NULL; /* I'm paranoid... */ + p->next = NULL; /* i'm paranoid... */ for(; *b != NULL; b = &((*b)->next), i++) if (!strncmp((*b)->name, p->name, DLL_LEN)) - return (EHDCON); /* Dll name conflict. */ - /* End of list, insert here. */ + return (EHDCON); /* dll name conflict */ + /* end of list, insert here */ *b = p; return (OK); } @@ -288,17 +343,17 @@ static void * _detach_dll(struct chain *c, char *p) { struct dll **b; - void *error = NULL; + void *err = NULL; LIBALIAS_WLOCK_ASSERT(c); b = (struct dll **)&c->chain; for(; *b != NULL; b = &((*b)->next)) if (!strncmp((*b)->name, p, DLL_LEN)) { - error = *b; + err = *b; *b = (*b)->next; break; } - return (error); + return (err); } int ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_mod.h#3 (text+ko) ==== @@ -24,7 +24,7 @@ * SUCH DAMAGE. */ -/* +/*- * Alias_mod.h defines the outside world interfaces for the packet aliasing * modular framework */ @@ -32,14 +32,13 @@ #ifndef _ALIAS_MOD_H_ #define _ALIAS_MOD_H_ -/* Protocol handlers struct & function. */ +/* protocol handlers struct & function*/ -/* Packet flow direction. */ +/* packet flow direction */ #define IN 1 #define OUT 2 -// XXX - use ip.h? -/* Working protocol. */ +/* working protocol */ #define IP 1 #define TCP 2 #define UDP 4 @@ -48,16 +47,17 @@ /* * Data passed to protocol handler module, it must be filled * right before calling find_handler() to determine which - * module is elegible to be called. + * module is elegible to be called */ -struct alias_data { +struct alias_data { + struct alias_link *lnk; struct in_addr *original_address; struct in_addr *alias_address; - uint16_t *alias_port; - uint16_t *sport, *dport; - uint16_t maxpacketsize; + u_short *alias_port; + u_int16_t *sport, *dport; + int maxpacketsize; }; /* @@ -65,8 +65,8 @@ * a protocol handler correctly work. */ -// XXX - use queue(3) struct proto_handler { + u_int pri; /* handler priority */ int16_t dir; /* flow direction */ int16_t proto; /* working protocol */ @@ -77,14 +77,22 @@ struct proto_handler *next; }; -// XXX - use rwlock(9) +#if __FreeBSD_version >= 500000 struct chain { + void *chain; struct mtx mtx; /* lock guarding list */ int busy_count; /* busy count for rw locks */ int want_write; struct cv cv; }; +#else +struct chain { + + void *chain; + int spl; +}; +#endif /* * Used only in userland when libalias needs to keep track of all @@ -93,7 +101,8 @@ */ #define DLL_LEN 32 -struct dll { +struct dll { + char name[DLL_LEN]; /* name of module */ void *handle; /* * ptr to shared obj obtained through @@ -127,7 +136,6 @@ #define OK 1 #define NOK -1 -// XXX - convert all this stuff to use errno.h /* end of handlers */ #define EOH -1
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200607031522.k63FMsQP001281>