Remove the home-grown metadata facility in favour of the now generic

mbuf tags facility. Netgraph modules will all need a recompile.

Submitted by:	Gleb Smirnoff <glebius@cell.sick.ru>
This commit is contained in:
julian 2004-06-30 22:51:29 +00:00
parent 309dbc34d2
commit a90f5b9dba
3 changed files with 40 additions and 120 deletions

View File

@ -17,6 +17,15 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 5.x IS SLOW:
developers choose to disable these features on build machines
to maximize performance.
20040630:
The netgraph ABI version number has been incremented to indicate
an incompatible change in the ABI. Old netgraph nodes will refuse
to attach until recompiled. Netgraph no uses tehmbuf TAGS feature
to move metadata and this commit removes its home-grown metadata
facility. Nodes should just recompile unless they use metadata
in which case the changes are simple and shown in ng_ksocket.c
which can be used as an example.
20040630:
ACPI has been updated to disable known-bad BIOS revisions. A message
will be printed on console indicating that ACPI has been disabled

View File

@ -62,7 +62,7 @@
* Change it for NETGRAPH_DEBUG version so we cannot mix debug and non debug
* modules.
*/
#define _NG_ABI_VERSION 8
#define _NG_ABI_VERSION 9
#ifdef NETGRAPH_DEBUG /*----------------------------------------------*/
#define NG_ABI_VERSION (_NG_ABI_VERSION + 0x10000)
#else /* NETGRAPH_DEBUG */ /*----------------------------------------------*/
@ -553,42 +553,6 @@ _ng_node_foreach_hook(node_p node, ng_fn_eachhook *fn, void *arg,
_NG_NODE_FOREACH_HOOK(node, fn, arg, rethook)
#endif /* NETGRAPH_DEBUG */ /*----------------------------------------------*/
/***********************************************************************
***************** Meta Data Structures and Methods ********************
***********************************************************************
*
* The structure that holds meta_data about a data packet (e.g. priority)
* Nodes might add or subtract options as needed if there is room.
* They might reallocate the struct to make more room if they need to.
* Meta-data is still experimental.
*/
struct meta_field_header {
u_long cookie; /* cookie for the field. Skip fields you don't
* know about (same cookie as in messgaes) */
u_short type; /* field ID */
u_short len; /* total len of this field including extra
* data */
char data[0]; /* data starts here */
};
/* To zero out an option 'in place' set it's cookie to this */
#define NGM_INVALID_COOKIE 865455152
/* This part of the metadata is always present if the pointer is non NULL */
struct ng_meta {
char priority; /* -ve is less priority, 0 is default */
char discardability; /* higher is less valuable.. discard first */
u_short allocated_len; /* amount malloc'd */
u_short used_len; /* sum of all fields, options etc. */
u_short flags; /* see below.. generic flags */
struct meta_field_header options[0]; /* add as (if) needed */
};
typedef struct ng_meta *meta_p;
/* Flags for meta-data */
#define NGMF_TEST 0x01 /* discard at the last moment before sending */
#define NGMF_TRACE 0x02 /* trace when handing this data to a node */
/***********************************************************************
************* Node Queue and Item Structures and Methods **************
***********************************************************************
@ -601,10 +565,7 @@ struct ng_item {
node_p el_dest; /* The node it will be applied against (or NULL) */
hook_p el_hook; /* Entering hook. Optional in Control messages */
union {
struct {
struct mbuf *da_m;
meta_p da_meta;
} data;
struct {
struct ng_mesg *msg_msg;
ng_ID_t msg_retaddr;
@ -644,8 +605,7 @@ struct ng_item {
* The debug versions must be either all used everywhere or not at all.
*/
#define _NGI_M(i) ((i)->body.data.da_m)
#define _NGI_META(i) ((i)->body.data.da_meta)
#define _NGI_M(i) ((i)->body.da_m)
#define _NGI_MSG(i) ((i)->body.msg.msg_msg)
#define _NGI_RETADDR(i) ((i)->body.msg.msg_retaddr)
#define _NGI_FN(i) ((i)->body.fn.fn_fn)
@ -674,7 +634,6 @@ struct ng_item {
void dumpitem(item_p item, char *file, int line);
static __inline void _ngi_check(item_p item, char *file, int line) ;
static __inline struct mbuf ** _ngi_m(item_p item, char *file, int line) ;
static __inline meta_p * _ngi_meta(item_p item, char *file, int line) ;
static __inline ng_ID_t * _ngi_retaddr(item_p item, char *file, int line);
static __inline struct ng_mesg ** _ngi_msg(item_p item, char *file, int line) ;
static __inline ng_item_fn ** _ngi_fn(item_p item, char *file, int line) ;
@ -701,13 +660,6 @@ _ngi_m(item_p item, char *file, int line)
return (&_NGI_M(item));
}
static __inline meta_p *
_ngi_meta(item_p item, char *file, int line)
{
_ngi_check(item, file, line);
return (&_NGI_META(item));
}
static __inline struct ng_mesg **
_ngi_msg(item_p item, char *file, int line)
{
@ -758,7 +710,6 @@ _ngi_hook(item_p item, char *file, int line)
}
#define NGI_M(i) (*_ngi_m(i, _NN_))
#define NGI_META(i) (*_ngi_meta(i, _NN_))
#define NGI_MSG(i) (*_ngi_msg(i, _NN_))
#define NGI_RETADDR(i) (*_ngi_retaddr(i, _NN_))
#define NGI_FN(i) (*_ngi_fn(i, _NN_))
@ -790,7 +741,6 @@ _ngi_hook(item_p item, char *file, int line)
#else /* NETGRAPH_DEBUG */ /*----------------------------------------------*/
#define NGI_M(i) _NGI_M(i)
#define NGI_META(i) _NGI_META(i)
#define NGI_MSG(i) _NGI_MSG(i)
#define NGI_RETADDR(i) _NGI_RETADDR(i)
#define NGI_FN(i) _NGI_FN(i)
@ -814,12 +764,6 @@ _ngi_hook(item_p item, char *file, int line)
_NGI_M(i) = NULL; \
} while (0)
#define NGI_GET_META(i,m) \
do { \
(m) = NGI_META(i); \
_NGI_META(i) = NULL; \
} while (0)
#define NGI_GET_MSG(i,m) \
do { \
(m) = NGI_MSG(i); \
@ -857,12 +801,11 @@ _ngi_hook(item_p item, char *file, int line)
} while (0)
/*
* Forward a data packet with no new meta-data.
* old metadata is passed along without change.
* Mbuf pointer is updated to new value. We presume you dealt with the
* old one when you update it to the new one (or it maybe the old one).
* We got a packet and possibly had to modify the mbuf.
* You should probably use NGI_GET_M() if you are going to use this too
* Forward a data packet. Mbuf pointer is updated to new value. We
* presume you dealt with the old one when you update it to the new one
* (or it maybe the old one). We got a packet and possibly had to modify
* the mbuf. You should probably use NGI_GET_M() if you are going to use
* this too.
*/
#define NG_FWD_NEW_DATA(error, item, hook, m) \
do { \
@ -871,7 +814,10 @@ _ngi_hook(item_p item, char *file, int line)
NG_FWD_ITEM_HOOK(error, item, hook); \
} while (0)
/* Send a previously unpackaged mbuf when we have no metadata to send */
/* Send a previously unpackaged mbuf. XXX: This should be called
* NG_SEND_DATA in future, but this name is kept for compatibility
* reasons.
*/
#define NG_SEND_DATA_ONLY(error, hook, m) \
do { \
item_p _item; \
@ -883,18 +829,7 @@ _ngi_hook(item_p item, char *file, int line)
(m) = NULL; \
} while (0)
/* Send previously unpackeged data and metadata. */
#define NG_SEND_DATA(error, hook, m, meta) \
do { \
item_p _item; \
if ((_item = ng_package_data((m), (meta)))) { \
NG_FWD_ITEM_HOOK(error, _item, hook); \
} else { \
(error) = ENOMEM; \
} \
(m) = NULL; \
(meta) = NULL; \
} while (0)
#define NG_SEND_DATA(error, hook, m, x) NG_SEND_DATA_ONLY(error, hook, m)
#define NG_FREE_MSG(msg) \
do { \
@ -904,14 +839,6 @@ _ngi_hook(item_p item, char *file, int line)
} \
} while (0)
#define NG_FREE_META(meta) \
do { \
if ((meta)) { \
FREE((meta), M_NETGRAPH_META); \
(meta) = NULL; \
} \
} while (0)
#define NG_FREE_M(m) \
do { \
if ((m)) { \
@ -1098,7 +1025,6 @@ MODULE_DEPEND(ng_##typename, netgraph, NG_ABI_VERSION, \
/* Only these two types should be visible to nodes */
MALLOC_DECLARE(M_NETGRAPH);
MALLOC_DECLARE(M_NETGRAPH_MSG);
MALLOC_DECLARE(M_NETGRAPH_META);
/* declare the base of the netgraph sysclt hierarchy */
/* but only if this file cares about sysctls */
@ -1115,13 +1041,12 @@ int ng_address_ID(node_p here, item_p item, ng_ID_t ID, ng_ID_t retaddr);
int ng_address_hook(node_p here, item_p item, hook_p hook, ng_ID_t retaddr);
int ng_address_path(node_p here, item_p item, char *address, ng_ID_t raddr);
int ng_bypass(hook_p hook1, hook_p hook2);
meta_p ng_copy_meta(meta_p meta);
hook_p ng_findhook(node_p node, const char *name);
int ng_make_node_common(struct ng_type *typep, node_p *nodep);
int ng_name_node(node_p node, const char *name);
int ng_newtype(struct ng_type *tp);
ng_ID_t ng_node2ID(node_p node);
item_p ng_package_data(struct mbuf *m, meta_p meta);
item_p ng_package_data(struct mbuf *m, void *dummy);
item_p ng_package_msg(struct ng_mesg *msg);
item_p ng_package_msg_self(node_p here, hook_p hook, struct ng_mesg *msg);
void ng_replace_retaddr(node_p here, item_p item, ng_ID_t retaddr);
@ -1157,4 +1082,14 @@ struct ng_tag_prio {
#define NG_PRIO_CUTOFF 32
#define NG_PRIO_LINKSTATE 64
/* Macros and declarations to keep compatibility with metadata, which
* is obsoleted now. To be deleted.
*/
typedef void *meta_p;
#define _NGI_META(i) NULL
#define NGI_META(i) NULL
#define NG_FREE_META(meta)
#define NGI_GET_META(i,m)
#define ng_copy_meta(meta) NULL
#endif /* _NETGRAPH_NETGRAPH_H_ */

View File

@ -216,7 +216,6 @@ MALLOC_DEFINE(M_NETGRAPH, "netgraph", "netgraph structures and ctrl messages");
MALLOC_DEFINE(M_NETGRAPH_HOOK, "netgraph_hook", "netgraph hook structures");
MALLOC_DEFINE(M_NETGRAPH_NODE, "netgraph_node", "netgraph node structures");
MALLOC_DEFINE(M_NETGRAPH_ITEM, "netgraph_item", "netgraph item structures");
MALLOC_DEFINE(M_NETGRAPH_META, "netgraph_meta", "netgraph name storage");
MALLOC_DEFINE(M_NETGRAPH_MSG, "netgraph_msg", "netgraph name storage");
/* Should not be visible outside this file */
@ -1151,6 +1150,9 @@ ng_newtype(struct ng_type *tp)
|| (namelen == 0)
|| (namelen >= NG_TYPESIZ)) {
TRAP_ERROR();
if (tp->version != NG_ABI_VERSION) {
printf("Netgraph: Node type rejected. ABI mismatch. Suggest recompile\n");
}
return (EINVAL);
}
@ -2095,7 +2097,6 @@ ng_flush_input_queue(struct ng_queue * ngq)
* Reference to destination rcv hook if relevant.
* Data:
* pointer to mbuf
* pointer to metadata
* Control_Message:
* pointer to msg.
* ID of original sender node. (return address)
@ -2890,26 +2891,6 @@ ng_generic_msg(node_p here, item_p item, hook_p lasthook)
return (error);
}
/*
* Copy a 'meta'.
*
* Returns new meta, or NULL if original meta is NULL or ENOMEM.
*/
meta_p
ng_copy_meta(meta_p meta)
{
meta_p meta2;
if (meta == NULL)
return (NULL);
MALLOC(meta2, meta_p, meta->used_len, M_NETGRAPH_META, M_NOWAIT);
if (meta2 == NULL)
return (NULL);
meta2->allocated_len = meta->used_len;
bcopy(meta, meta2, meta->used_len);
return (meta2);
}
/************************************************************************
Module routines
************************************************************************/
@ -3122,9 +3103,8 @@ ng_free_item(item_p item)
}
switch (item->el_flags & NGQF_TYPE) {
case NGQF_DATA:
/* If we have an mbuf and metadata still attached.. */
/* If we have an mbuf still attached.. */
NG_FREE_M(_NGI_M(item));
NG_FREE_META(_NGI_META(item));
break;
case NGQF_MESG:
_NGI_RETADDR(item) = 0;
@ -3400,7 +3380,7 @@ ng_setisr(node_p node)
#endif
/*
* Put elements into the item.
* Put mbuf into the item.
* Hook and node references will be removed when the item is dequeued.
* (or equivalent)
* (XXX) Unsafe because no reference held by peer on remote node.
@ -3413,20 +3393,18 @@ ng_setisr(node_p node)
* This is possibly in the critical path for new data.
*/
item_p
ng_package_data(struct mbuf *m, meta_p meta)
ng_package_data(struct mbuf *m, void *dummy)
{
item_p item;
if ((item = ng_getqblk()) == NULL) {
NG_FREE_M(m);
NG_FREE_META(meta);
return (NULL);
}
ITEM_DEBUG_CHECKS;
item->el_flags = NGQF_DATA;
item->el_next = NULL;
NGI_M(item) = m;
NGI_META(item) = meta;
return (item);
}
@ -3708,16 +3686,14 @@ ng_macro_test(item_p item)
node_p node = NULL;
hook_p hook = NULL;
struct mbuf *m;
meta_p meta;
struct ng_mesg *msg;
ng_ID_t retaddr;
int error;
NGI_GET_M(item, m);
NGI_GET_META(item, meta);
NGI_GET_MSG(item, msg);
retaddr = NGI_RETADDR(item);
NG_SEND_DATA(error, hook, m, meta);
NG_SEND_DATA(error, hook, m, NULL);
NG_SEND_DATA_ONLY(error, hook, m);
NG_FWD_NEW_DATA(error, item, hook, m);
NG_FWD_ITEM_HOOK(error, item, hook);