mirror of
https://git.FreeBSD.org/src.git
synced 2025-02-08 11:43:36 +00:00
shave about 7% off the overhead of ng_ether by using per-hook
receive data methods.
This commit is contained in:
parent
0d186272b4
commit
f664dcde7c
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=186488
@ -102,8 +102,8 @@ static void ng_ether_detach(struct ifnet *ifp);
|
||||
static void ng_ether_link_state(struct ifnet *ifp, int state);
|
||||
|
||||
/* Other functions */
|
||||
static int ng_ether_rcv_lower(node_p node, struct mbuf *m);
|
||||
static int ng_ether_rcv_upper(node_p node, struct mbuf *m);
|
||||
static int ng_ether_rcv_lower(hook_p node, item_p item);
|
||||
static int ng_ether_rcv_upper(hook_p node, item_p item);
|
||||
|
||||
/* Netgraph node methods */
|
||||
static ng_constructor_t ng_ether_constructor;
|
||||
@ -389,13 +389,16 @@ ng_ether_newhook(node_p node, hook_p hook, const char *name)
|
||||
name = NG_ETHER_HOOK_LOWER;
|
||||
|
||||
/* Which hook? */
|
||||
if (strcmp(name, NG_ETHER_HOOK_UPPER) == 0)
|
||||
if (strcmp(name, NG_ETHER_HOOK_UPPER) == 0) {
|
||||
hookptr = &priv->upper;
|
||||
else if (strcmp(name, NG_ETHER_HOOK_LOWER) == 0)
|
||||
NG_HOOK_SET_RCVDATA(hook, ng_ether_rcv_upper);
|
||||
} else if (strcmp(name, NG_ETHER_HOOK_LOWER) == 0) {
|
||||
hookptr = &priv->lower;
|
||||
else if (strcmp(name, NG_ETHER_HOOK_ORPHAN) == 0)
|
||||
NG_HOOK_SET_RCVDATA(hook, ng_ether_rcv_lower);
|
||||
} else if (strcmp(name, NG_ETHER_HOOK_ORPHAN) == 0) {
|
||||
hookptr = &priv->orphan;
|
||||
else
|
||||
NG_HOOK_SET_RCVDATA(hook, ng_ether_rcv_lower);
|
||||
} else
|
||||
return (EINVAL);
|
||||
|
||||
/* Check if already connected (shouldn't be, but doesn't hurt) */
|
||||
@ -571,21 +574,13 @@ ng_ether_rcvmsg(node_p node, item_p item, hook_p lasthook)
|
||||
|
||||
/*
|
||||
* Receive data on a hook.
|
||||
* Since we use per-hook recveive methods this should never be called.
|
||||
*/
|
||||
static int
|
||||
ng_ether_rcvdata(hook_p hook, item_p item)
|
||||
{
|
||||
const node_p node = NG_HOOK_NODE(hook);
|
||||
const priv_p priv = NG_NODE_PRIVATE(node);
|
||||
struct mbuf *m;
|
||||
|
||||
NGI_GET_M(item, m);
|
||||
NG_FREE_ITEM(item);
|
||||
|
||||
if (hook == priv->lower || hook == priv->orphan)
|
||||
return ng_ether_rcv_lower(node, m);
|
||||
if (hook == priv->upper)
|
||||
return ng_ether_rcv_upper(node, m);
|
||||
panic("%s: weird hook", __func__);
|
||||
#ifdef RESTARTABLE_PANICS /* so we don't get an error msg in LINT */
|
||||
return (0);
|
||||
@ -596,12 +591,18 @@ ng_ether_rcvdata(hook_p hook, item_p item)
|
||||
* Handle an mbuf received on the "lower" or "orphan" hook.
|
||||
*/
|
||||
static int
|
||||
ng_ether_rcv_lower(node_p node, struct mbuf *m)
|
||||
ng_ether_rcv_lower(hook_p hook, item_p item)
|
||||
{
|
||||
struct mbuf *m;
|
||||
const node_p node = NG_HOOK_NODE(hook);
|
||||
const priv_p priv = NG_NODE_PRIVATE(node);
|
||||
struct ifnet *const ifp = priv->ifp;
|
||||
|
||||
NGI_GET_M(item, m);
|
||||
NG_FREE_ITEM(item);
|
||||
|
||||
/* Check whether interface is ready for packets */
|
||||
|
||||
if (!((ifp->if_flags & IFF_UP) &&
|
||||
(ifp->if_drv_flags & IFF_DRV_RUNNING))) {
|
||||
NG_FREE_M(m);
|
||||
@ -639,11 +640,16 @@ ng_ether_rcv_lower(node_p node, struct mbuf *m)
|
||||
* Handle an mbuf received on the "upper" hook.
|
||||
*/
|
||||
static int
|
||||
ng_ether_rcv_upper(node_p node, struct mbuf *m)
|
||||
ng_ether_rcv_upper(hook_p hook, item_p item)
|
||||
{
|
||||
struct mbuf *m;
|
||||
const node_p node = NG_HOOK_NODE(hook);
|
||||
const priv_p priv = NG_NODE_PRIVATE(node);
|
||||
struct ifnet *ifp = priv->ifp;
|
||||
|
||||
NGI_GET_M(item, m);
|
||||
NG_FREE_ITEM(item);
|
||||
|
||||
/* Check length and pull off header */
|
||||
if (m->m_pkthdr.len < sizeof(struct ether_header)) {
|
||||
NG_FREE_M(m);
|
||||
|
Loading…
x
Reference in New Issue
Block a user