This is optimization of ether and debug hooks determination. It
simplifies code and should speedup pppoe_findsession() function which is called for every incoming packet. Approved by: re (kensmith), glebius (mentor)
This commit is contained in:
parent
1e7d84b055
commit
99f4de905c
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=172270
@ -280,9 +280,7 @@ static int pppoe_send_event(sessp sp, enum cmd cmdid);
|
||||
static uint16_t
|
||||
get_new_sid(node_p node)
|
||||
{
|
||||
priv_p privp = NG_NODE_PRIVATE(node);
|
||||
static int pppoe_sid = 10;
|
||||
sessp sp;
|
||||
hook_p hook;
|
||||
uint16_t val;
|
||||
|
||||
@ -299,11 +297,11 @@ get_new_sid(node_p node)
|
||||
|
||||
/* Check it isn't already in use. */
|
||||
LIST_FOREACH(hook, &node->nd_hooks, hk_hooks) {
|
||||
/* Don't check special hooks. */
|
||||
if ((NG_HOOK_PRIVATE(hook) == &privp->debug_hook)
|
||||
|| (NG_HOOK_PRIVATE(hook) == &privp->ethernet_hook))
|
||||
sessp sp = NG_HOOK_PRIVATE(hook);
|
||||
|
||||
/* Skip any nonsession hook. */
|
||||
if (sp == NULL)
|
||||
continue;
|
||||
sp = NG_HOOK_PRIVATE(hook);
|
||||
if (sp->Session_ID == val)
|
||||
goto restart;
|
||||
}
|
||||
@ -446,16 +444,14 @@ make_packet(sessp sp) {
|
||||
static hook_p
|
||||
pppoe_match_svc(node_p node, const struct pppoe_tag *tag)
|
||||
{
|
||||
priv_p privp = NG_NODE_PRIVATE(node);
|
||||
hook_p hook;
|
||||
|
||||
LIST_FOREACH(hook, &node->nd_hooks, hk_hooks) {
|
||||
sessp sp = NG_HOOK_PRIVATE(hook);
|
||||
negp neg;
|
||||
|
||||
/* Skip any hook that is debug or ethernet. */
|
||||
if ((NG_HOOK_PRIVATE(hook) == &privp->debug_hook) ||
|
||||
(NG_HOOK_PRIVATE(hook) == &privp->ethernet_hook))
|
||||
/* Skip any nonsession hook. */
|
||||
if (sp == NULL)
|
||||
continue;
|
||||
|
||||
/* Skip any sessions which are not in LISTEN mode. */
|
||||
@ -494,7 +490,6 @@ pppoe_match_svc(node_p node, const struct pppoe_tag *tag)
|
||||
static int
|
||||
pppoe_broadcast_padi(node_p node, struct mbuf *m0)
|
||||
{
|
||||
priv_p privp = NG_NODE_PRIVATE(node);
|
||||
hook_p hook;
|
||||
int error = 0;
|
||||
|
||||
@ -506,8 +501,7 @@ pppoe_broadcast_padi(node_p node, struct mbuf *m0)
|
||||
* Go through all listening hooks and
|
||||
* broadcast the PADI packet up there
|
||||
*/
|
||||
if ((NG_HOOK_PRIVATE(hook) == &privp->debug_hook) ||
|
||||
(NG_HOOK_PRIVATE(hook) == &privp->ethernet_hook))
|
||||
if (sp == NULL)
|
||||
continue;
|
||||
|
||||
if (sp->state != PPPOE_LISTENING)
|
||||
@ -530,16 +524,14 @@ pppoe_broadcast_padi(node_p node, struct mbuf *m0)
|
||||
static hook_p
|
||||
pppoe_find_svc(node_p node, const char *svc_name, int svc_len)
|
||||
{
|
||||
priv_p privp = NG_NODE_PRIVATE(node);
|
||||
hook_p hook;
|
||||
|
||||
LIST_FOREACH(hook, &node->nd_hooks, hk_hooks) {
|
||||
sessp sp = NG_HOOK_PRIVATE(hook);
|
||||
negp neg;
|
||||
|
||||
/* Skip any hook that is debug or ethernet. */
|
||||
if ((NG_HOOK_PRIVATE(hook) == &privp->debug_hook) ||
|
||||
(NG_HOOK_PRIVATE(hook) == &privp->ethernet_hook))
|
||||
/* Skip any nonsession hook. */
|
||||
if (sp == NULL)
|
||||
continue;
|
||||
|
||||
/* Skip any sessions which are not in LISTEN mode. */
|
||||
@ -562,8 +554,6 @@ pppoe_find_svc(node_p node, const char *svc_name, int svc_len)
|
||||
static hook_p
|
||||
pppoe_findsession(node_p node, const struct pppoe_full_hdr *wh)
|
||||
{
|
||||
priv_p privp = NG_NODE_PRIVATE(node);
|
||||
sessp sp = NULL;
|
||||
hook_p hook = NULL;
|
||||
uint16_t session = ntohs(wh->ph.sid);
|
||||
|
||||
@ -571,18 +561,16 @@ pppoe_findsession(node_p node, const struct pppoe_full_hdr *wh)
|
||||
* Find matching peer/session combination.
|
||||
*/
|
||||
LIST_FOREACH(hook, &node->nd_hooks, hk_hooks) {
|
||||
/* don't check special hooks */
|
||||
if ((NG_HOOK_PRIVATE(hook) == &privp->debug_hook)
|
||||
|| (NG_HOOK_PRIVATE(hook) == &privp->ethernet_hook)) {
|
||||
sessp sp = NG_HOOK_PRIVATE(hook);
|
||||
|
||||
/* Skip any nonsession hook. */
|
||||
if (sp == NULL)
|
||||
continue;
|
||||
}
|
||||
sp = NG_HOOK_PRIVATE(hook);
|
||||
if ( ( (sp->state == PPPOE_CONNECTED)
|
||||
|| (sp->state == PPPOE_NEWCONNECTED) )
|
||||
&& (sp->Session_ID == session)
|
||||
&& (bcmp(sp->pkt_hdr.eh.ether_dhost,
|
||||
wh->eh.ether_shost,
|
||||
ETHER_ADDR_LEN)) == 0) {
|
||||
if (sp->Session_ID == session &&
|
||||
(sp->state == PPPOE_CONNECTED ||
|
||||
sp->state == PPPOE_NEWCONNECTED) &&
|
||||
bcmp(sp->pkt_hdr.eh.ether_dhost,
|
||||
wh->eh.ether_shost, ETHER_ADDR_LEN) == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -594,16 +582,14 @@ pppoe_findsession(node_p node, const struct pppoe_full_hdr *wh)
|
||||
static hook_p
|
||||
pppoe_finduniq(node_p node, const struct pppoe_tag *tag)
|
||||
{
|
||||
priv_p privp = NG_NODE_PRIVATE(node);
|
||||
hook_p hook = NULL;
|
||||
union uniq uniq;
|
||||
|
||||
bcopy(tag->tag_data, uniq.bytes, sizeof(void *));
|
||||
/* Cycle through all known hooks. */
|
||||
LIST_FOREACH(hook, &node->nd_hooks, hk_hooks) {
|
||||
/* Don't check special hooks. */
|
||||
if ((NG_HOOK_PRIVATE(hook) == &privp->debug_hook)
|
||||
|| (NG_HOOK_PRIVATE(hook) == &privp->ethernet_hook))
|
||||
/* Skip any nonsession hook. */
|
||||
if (NG_HOOK_PRIVATE(hook) == NULL)
|
||||
continue;
|
||||
if (uniq.pointer == NG_HOOK_PRIVATE(hook))
|
||||
break;
|
||||
@ -661,10 +647,8 @@ ng_pppoe_newhook(node_p node, hook_p hook, const char *name)
|
||||
|
||||
if (strcmp(name, NG_PPPOE_HOOK_ETHERNET) == 0) {
|
||||
privp->ethernet_hook = hook;
|
||||
NG_HOOK_SET_PRIVATE(hook, &privp->ethernet_hook);
|
||||
} else if (strcmp(name, NG_PPPOE_HOOK_DEBUG) == 0) {
|
||||
privp->debug_hook = hook;
|
||||
NG_HOOK_SET_PRIVATE(hook, &privp->debug_hook);
|
||||
} else {
|
||||
/*
|
||||
* Any other unique name is OK.
|
||||
@ -781,12 +765,11 @@ ng_pppoe_rcvmsg(node_p node, item_p item, hook_p lasthook)
|
||||
if (hook == NULL)
|
||||
LEAVE(ENOENT);
|
||||
|
||||
if ((NG_HOOK_PRIVATE(hook) == &privp->debug_hook) ||
|
||||
(NG_HOOK_PRIVATE(hook) == &privp->ethernet_hook))
|
||||
LEAVE(EINVAL);
|
||||
|
||||
sp = NG_HOOK_PRIVATE(hook);
|
||||
|
||||
if (sp == NULL)
|
||||
LEAVE(EINVAL);
|
||||
|
||||
if (msg->header.cmd == NGM_PPPOE_LISTEN) {
|
||||
/*
|
||||
* Ensure we aren't already listening for this
|
||||
@ -1146,14 +1129,14 @@ ng_pppoe_rcvdata(hook_p hook, item_p item)
|
||||
__func__, node->nd_ID, node, item, hook->hk_name, hook);
|
||||
|
||||
NGI_GET_M(item, m);
|
||||
if (NG_HOOK_PRIVATE(hook) == &privp->debug_hook) {
|
||||
if (hook == privp->debug_hook) {
|
||||
/*
|
||||
* Data from the debug hook gets sent without modification
|
||||
* straight to the ethernet.
|
||||
*/
|
||||
NG_FWD_ITEM_HOOK( error, item, privp->ethernet_hook);
|
||||
privp->packets_out++;
|
||||
} else if (NG_HOOK_PRIVATE(hook) == &privp->ethernet_hook) {
|
||||
} else if (hook == privp->ethernet_hook) {
|
||||
/*
|
||||
* Incoming data.
|
||||
* Dig out various fields from the packet.
|
||||
@ -1681,9 +1664,9 @@ ng_pppoe_disconnect(hook_p hook)
|
||||
int hooks;
|
||||
|
||||
hooks = NG_NODE_NUMHOOKS(node); /* This one already not counted. */
|
||||
if (NG_HOOK_PRIVATE(hook) == &privp->debug_hook) {
|
||||
if (hook == privp->debug_hook) {
|
||||
privp->debug_hook = NULL;
|
||||
} else if (NG_HOOK_PRIVATE(hook) == &privp->ethernet_hook) {
|
||||
} else if (hook == privp->ethernet_hook) {
|
||||
privp->ethernet_hook = NULL;
|
||||
if (NG_NODE_IS_VALID(node))
|
||||
ng_rmnode_self(node);
|
||||
|
Loading…
Reference in New Issue
Block a user