Author: hselasky
Date: Wed Dec 18 12:06:34 2019
New Revision: 355881
URL: https://svnweb.freebsd.org/changeset/base/355881

Log:
  Leave multicast group before reaping and committing state for both
  IPv4 and IPv6.
  
  This fixes a regression issue after r349369. When trying to exit a
  multicast group before closing the socket, a multicast leave packet
  should be sent.
  
  Differential Revision:        https://reviews.freebsd.org/D22848
  PR: 242677
  Reviewed by:  bz (network)
  Tested by:    Aleksandr Fedorov <aleksandr.fedo...@itglobal.com>
  MFC after:    1 week
  Sponsored by: Mellanox Technologies

Modified:
  head/sys/netinet/in_mcast.c
  head/sys/netinet6/in6_mcast.c

Modified: head/sys/netinet/in_mcast.c
==============================================================================
--- head/sys/netinet/in_mcast.c Wed Dec 18 11:48:50 2019        (r355880)
+++ head/sys/netinet/in_mcast.c Wed Dec 18 12:06:34 2019        (r355881)
@@ -2409,6 +2409,12 @@ inp_leave_group(struct inpcb *inp, struct sockopt *sop
        if (is_final) {
                ip_mfilter_remove(&imo->imo_head, imf);
                imf_leave(imf);
+
+               /*
+                * Give up the multicast address record to which
+                * the membership points.
+                */
+               (void) in_leavegroup_locked(imf->imf_inm, imf);
        } else {
                if (imf->imf_st[0] == MCAST_EXCLUDE) {
                        error = EADDRNOTAVAIL;
@@ -2463,14 +2469,8 @@ inp_leave_group(struct inpcb *inp, struct sockopt *sop
 out_inp_locked:
        INP_WUNLOCK(inp);
 
-       if (is_final && imf) {
-               /*
-                * Give up the multicast address record to which
-                * the membership points.
-                */
-               (void) in_leavegroup_locked(imf->imf_inm, imf);
+       if (is_final && imf)
                ip_mfilter_free(imf);
-       }
 
        IN_MULTI_UNLOCK();
        return (error);

Modified: head/sys/netinet6/in6_mcast.c
==============================================================================
--- head/sys/netinet6/in6_mcast.c       Wed Dec 18 11:48:50 2019        
(r355880)
+++ head/sys/netinet6/in6_mcast.c       Wed Dec 18 12:06:34 2019        
(r355881)
@@ -2328,6 +2328,12 @@ in6p_leave_group(struct inpcb *inp, struct sockopt *so
        if (is_final) {
                ip6_mfilter_remove(&imo->im6o_head, imf);
                im6f_leave(imf);
+
+               /*
+                * Give up the multicast address record to which
+                * the membership points.
+                */
+               (void)in6_leavegroup_locked(inm, imf);
        } else {
                if (imf->im6f_st[0] == MCAST_EXCLUDE) {
                        error = EADDRNOTAVAIL;
@@ -2384,14 +2390,8 @@ in6p_leave_group(struct inpcb *inp, struct sockopt *so
 out_in6p_locked:
        INP_WUNLOCK(inp);
 
-       if (is_final && imf) {
-               /*
-                * Give up the multicast address record to which
-                * the membership points.
-                */
-               (void)in6_leavegroup_locked(inm, imf);
+       if (is_final && imf)
                ip6_mfilter_free(imf);
-       }
 
        IN6_MULTI_UNLOCK();
        return (error);
_______________________________________________
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