Author: zec
Date: Tue May 24 14:36:32 2011
New Revision: 222257
URL: http://svn.freebsd.org/changeset/base/222257

Log:
  Assume the link to be dead if bit error rate (BER) parameter is set to 1.
  When a transition from link alive to link dead configuration or vice
  versa occurs, notify any upstream and / or downstream peers using
  NGM_FLOW messagges.
  
  Link state notification using NGM_FLOW messages is modelled around
  around already existing code in ng_ether.c.
  
  MFC after:    3 days

Modified:
  head/sys/netgraph/ng_pipe.c

Modified: head/sys/netgraph/ng_pipe.c
==============================================================================
--- head/sys/netgraph/ng_pipe.c Tue May 24 14:12:31 2011        (r222256)
+++ head/sys/netgraph/ng_pipe.c Tue May 24 14:36:32 2011        (r222257)
@@ -298,11 +298,12 @@ ngp_rcvmsg(node_p node, item_p item, hoo
 {
        const priv_p priv = NG_NODE_PRIVATE(node);
        struct ng_mesg *resp = NULL;
-       struct ng_mesg *msg;
+       struct ng_mesg *msg, *flow_msg;
        struct ng_pipe_stats *stats;
        struct ng_pipe_run *run;
        struct ng_pipe_cfg *cfg;
        int error = 0;
+       int prev_down, now_down, cmd;
 
        NGI_GET_MSG(item, msg);
        switch (msg->header.typecookie) {
@@ -403,10 +404,38 @@ ngp_rcvmsg(node_p node, item_p item, hoo
                            cfg->header_offset < 64)
                                priv->header_offset = cfg->header_offset;
 
+                       prev_down = priv->upper.cfg.ber == 1 ||
+                           priv->lower.cfg.ber == 1;
                        parse_cfg(&priv->upper.cfg, &cfg->downstream,
                            &priv->upper, priv);
                        parse_cfg(&priv->lower.cfg, &cfg->upstream,
                            &priv->lower, priv);
+                       now_down = priv->upper.cfg.ber == 1 ||
+                           priv->lower.cfg.ber == 1;
+
+                       if (prev_down != now_down) {
+                               if (now_down)
+                                       cmd = NGM_LINK_IS_DOWN;
+                               else
+                                       cmd = NGM_LINK_IS_UP;
+
+                               if (priv->lower.hook != NULL) {
+                                       NG_MKMESSAGE(flow_msg, NGM_FLOW_COOKIE,
+                                           cmd, 0, M_NOWAIT);
+                                       if (flow_msg != NULL)
+                                               NG_SEND_MSG_HOOK(error, node,
+                                                   flow_msg, priv->lower.hook,
+                                                   0);
+                               }
+                               if (priv->upper.hook != NULL) {
+                                       NG_MKMESSAGE(flow_msg, NGM_FLOW_COOKIE,
+                                           cmd, 0, M_NOWAIT);
+                                       if (flow_msg != NULL)
+                                               NG_SEND_MSG_HOOK(error, node,
+                                                   flow_msg, priv->upper.hook,
+                                                   0);
+                               }
+                       }
                        break;
                default:
                        error = EINVAL;
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to