Author: bz
Date: Sun Jan  5 19:14:16 2020
New Revision: 356386
URL: https://svnweb.freebsd.org/changeset/base/356386

Log:
  netgraph/ng_bridge: Reestablish old ABI
  
  In order to be able to merge r353026 bring back support for the old
  cookie API for a transition period in 12.x releases (and possibly 13)
  before the old API can be removed again entirely.
  
  Suggested by: julian
  Submitted by: Lutz Donnerhacke (lutz donnerhacke.de)
  PR:           240787
  Reviewed by:  julian
  MFC after:    2 weeks
  X-MFC with:   r353026
  Differential Revision:        https://reviews.freebsd.org/D21961

Modified:
  head/sys/netgraph/ng_bridge.c
  head/sys/netgraph/ng_bridge.h

Modified: head/sys/netgraph/ng_bridge.c
==============================================================================
--- head/sys/netgraph/ng_bridge.c       Sun Jan  5 18:15:41 2020        
(r356385)
+++ head/sys/netgraph/ng_bridge.c       Sun Jan  5 19:14:16 2020        
(r356386)
@@ -393,6 +393,72 @@ ng_bridge_rcvmsg(node_p node, item_p item, hook_p last
 
        NGI_GET_MSG(item, msg);
        switch (msg->header.typecookie) {
+#ifdef NGM_BRIDGE_TABLE_ABI
+       case NGM_BRIDGE_COOKIE_TBL:
+               switch (msg->header.cmd) {
+               case NGM_BRIDGE_GET_CONFIG:
+                   {
+                       struct ng_bridge_config_tbl *conf;
+
+                       NG_MKRESPONSE(resp, msg, sizeof(*conf),
+                           M_NOWAIT|M_ZERO);
+                       if (resp == NULL) {
+                               error = ENOMEM;
+                               break;
+                       }
+                       conf = (struct ng_bridge_config_tbl *)resp->data;
+                       conf->cfg = priv->conf;
+                       break;
+                   }
+               case NGM_BRIDGE_SET_CONFIG:
+                   {
+                       struct ng_bridge_config_tbl *conf;
+
+                       if (msg->header.arglen != sizeof(*conf)) {
+                               error = EINVAL;
+                               break;
+                       }
+                       conf = (struct ng_bridge_config_tbl *)msg->data;
+                       priv->conf = conf->cfg;
+                       break;
+                   }
+               case NGM_BRIDGE_GET_TABLE:
+                   {
+                       struct ng_bridge_host_tbl_ary *ary;
+                       struct ng_bridge_hent *hent;
+                       int i, bucket;
+
+                       NG_MKRESPONSE(resp, msg, sizeof(*ary) +
+                           (priv->numHosts * sizeof(*ary->hosts)), M_NOWAIT);
+                       if (resp == NULL) {
+                               error = ENOMEM;
+                               break;
+                       }
+                       ary = (struct ng_bridge_host_tbl_ary *)resp->data;
+                       ary->numHosts = priv->numHosts;
+                       i = 0;
+                       for (bucket = 0; bucket < priv->numBuckets; bucket++) {
+                               SLIST_FOREACH(hent, &priv->tab[bucket], next) {
+                                       memcpy(ary->hosts[i].addr,
+                                           hent->host.addr,
+                                           sizeof(ary->hosts[i].addr));
+                                       ary->hosts[i].age = hent->host.age;
+                                       ary->hosts[i].staleness =
+                                            hent->host.staleness;
+                                       ary->hosts[i].linkNum = strtol(
+                                           NG_HOOK_NAME(hent->host.link->hook) 
+
+                                           strlen(NG_BRIDGE_HOOK_LINK_PREFIX),
+                                           NULL, 10);
+                                       i++;
+                               }
+                       }
+                       break;
+                   }
+               }
+               /* If already handled break, otherwise use new ABI. */
+               if (resp != NULL || error != 0)
+                   break;
+#endif /* NGM_BRIDGE_TABLE_ABI */
        case NGM_BRIDGE_COOKIE:
                switch (msg->header.cmd) {
                case NGM_BRIDGE_GET_CONFIG:

Modified: head/sys/netgraph/ng_bridge.h
==============================================================================
--- head/sys/netgraph/ng_bridge.h       Sun Jan  5 18:15:41 2020        
(r356385)
+++ head/sys/netgraph/ng_bridge.h       Sun Jan  5 19:14:16 2020        
(r356386)
@@ -43,10 +43,24 @@
 #ifndef _NETGRAPH_NG_BRIDGE_H_
 #define _NETGRAPH_NG_BRIDGE_H_
 
+/*
+ * Support the older ABI based on fixed size tables.
+ * ABI is deprecated, to be removed in releases > 12
+ * Please note: There is no API support!
+ * You canno create new messages using the old API but messages conforming the
+ * old ABI are understood.
+ */
+#define        NGM_BRIDGE_TABLE_ABI
+
 /* Node type name and magic cookie */
 #define NG_BRIDGE_NODE_TYPE            "bridge"
 #define NGM_BRIDGE_COOKIE              1569321993
 
+#ifdef NGM_BRIDGE_TABLE_ABI
+#define        NGM_BRIDGE_COOKIE_TBL           967239368
+#define        NG_BRIDGE_MAX_LINKS             32
+#endif /* NGM_BRIDGE_TABLE_ABI */
+
 /* Hook names */
 #define NG_BRIDGE_HOOK_LINK_PREFIX     "link"   /* append decimal integer */
 #define NG_BRIDGE_HOOK_LINK_FMT                "link%d" /* for use with 
printf(3) */
@@ -59,6 +73,13 @@ struct ng_bridge_config {
        u_int32_t       minStableAge;           /* min time for a stable host */
 };
 
+#ifdef NGM_BRIDGE_TABLE_ABI
+struct ng_bridge_config_tbl {
+       u_char          ipfw[NG_BRIDGE_MAX_LINKS];
+       struct ng_bridge_config cfg;
+};
+#endif /* NGM_BRIDGE_TABLE_ABI */
+
 /* Keep this in sync with the above structure definition */
 #define NG_BRIDGE_CONFIG_TYPE_INFO     {                       \
          { "debugLevel",       &ng_parse_uint8_type    },      \
@@ -115,6 +136,15 @@ struct ng_bridge_host {
        u_int16_t       staleness;      /* seconds ago host last heard from */
 };
 
+#ifdef NGM_BRIDGE_TABLE_ABI
+struct ng_bridge_host_tbl {
+       u_char          addr[6];        /* ethernet address */
+       u_int16_t       linkNum;        /* link where addr can be found */
+       u_int16_t       age;            /* seconds ago entry was created */
+       u_int16_t       staleness;      /* seconds ago host last heard from */
+};
+#endif /* NGM_BRIDGE_TABLE_ABI */
+
 /* external representation of the host */
 struct ng_bridge_hostent {
        u_char          addr[6];                /* ethernet address */
@@ -144,6 +174,19 @@ struct ng_bridge_host_ary {
          { "hosts",            (harytype)              },      \
          { NULL }                                              \
 }
+
+#ifdef NGM_BRIDGE_TABLE_ABI
+struct ng_bridge_hostent_tbl {
+       u_char          addr[6];                /* ethernet address */
+       u_int16_t       linkNum;                /* link where addr can be found 
*/
+       u_int16_t       age;                    /* seconds ago entry was 
created */
+       u_int16_t       staleness;              /* seconds ago host last heard 
from */
+};
+struct ng_bridge_host_tbl_ary {
+       u_int32_t                       numHosts;
+       struct ng_bridge_hostent_tbl    hosts[];
+};
+#endif /* NGM_BRIDGE_TABLE_ABI */
 
 /* Netgraph control messages */
 enum {
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to