Author: ae
Date: Mon Nov 23 22:06:55 2015
New Revision: 291222
URL: https://svnweb.freebsd.org/changeset/base/291222

Log:
  Add destroy_object callback to object rewriting framework.
  It is called when last reference to named object is going to be released
  and allows to do additional cleanup for implementation of named objects.
  
  Obtained from:        Yandex LLC
  Sponsored by: Yandex LLC

Modified:
  head/sys/netpfil/ipfw/ip_fw_private.h
  head/sys/netpfil/ipfw/ip_fw_sockopt.c

Modified: head/sys/netpfil/ipfw/ip_fw_private.h
==============================================================================
--- head/sys/netpfil/ipfw/ip_fw_private.h       Mon Nov 23 20:44:49 2015        
(r291221)
+++ head/sys/netpfil/ipfw/ip_fw_private.h       Mon Nov 23 22:06:55 2015        
(r291222)
@@ -564,7 +564,12 @@ typedef struct named_object *(ipfw_obj_f
  */
 typedef int (ipfw_obj_create_cb)(struct ip_fw_chain *ch, struct tid_info *ti,
     uint16_t *pkidx);
-
+/*
+ * Object destroy callback. Intended to free resources allocated by
+ * create_object callback.
+ */
+typedef void (ipfw_obj_destroy_cb)(struct ip_fw_chain *ch,
+    struct named_object *no);
 
 struct opcode_obj_rewrite {
        uint32_t                opcode;         /* Opcode to act upon */
@@ -574,6 +579,7 @@ struct opcode_obj_rewrite {
        ipfw_obj_fname_cb       *find_byname;   /* Find named object by name */
        ipfw_obj_fidx_cb        *find_bykidx;   /* Find named object by kidx */
        ipfw_obj_create_cb      *create_object; /* Create named object */
+       ipfw_obj_destroy_cb     *destroy_object;/* Destroy named object */
 };
 
 #define        IPFW_ADD_OBJ_REWRITER(f, c)     do {    \

Modified: head/sys/netpfil/ipfw/ip_fw_sockopt.c
==============================================================================
--- head/sys/netpfil/ipfw/ip_fw_sockopt.c       Mon Nov 23 20:44:49 2015        
(r291221)
+++ head/sys/netpfil/ipfw/ip_fw_sockopt.c       Mon Nov 23 22:06:55 2015        
(r291222)
@@ -2348,7 +2348,10 @@ unref_rule_objects(struct ip_fw_chain *c
                KASSERT(no->refcnt > 0, ("refcount for table %d is %d",
                    kidx, no->refcnt));
 
-               no->refcnt--;
+               if (no->refcnt == 1 && rw->destroy_object != NULL)
+                       rw->destroy_object(ch, no);
+               else
+                       no->refcnt--;
        }
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to