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.fedorov@itglobal.com> MFC after: 1 week Sponsored by: Mellanox Technologies
This commit is contained in:
parent
cc79ea3a26
commit
a4c5668d12
@ -2409,6 +2409,12 @@ inp_leave_group(struct inpcb *inp, struct sockopt *sopt)
|
||||
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 *sopt)
|
||||
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);
|
||||
|
@ -2328,6 +2328,12 @@ in6p_leave_group(struct inpcb *inp, struct sockopt *sopt)
|
||||
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 *sopt)
|
||||
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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user