version 1.61.2.1, 2015/04/06 15:18:23 |
version 1.64, 2015/11/12 15:01:06 |
|
|
#include <sys/cdefs.h> |
#include <sys/cdefs.h> |
__KERNEL_RCSID(0, "$NetBSD$"); |
__KERNEL_RCSID(0, "$NetBSD$"); |
|
|
|
#ifdef _KERNEL_OPT |
#include "opt_inet.h" |
#include "opt_inet.h" |
|
#endif |
|
|
#include <sys/param.h> |
#include <sys/param.h> |
#include <sys/systm.h> |
#include <sys/systm.h> |
Line 656 in6_addmulti(struct in6_addr *maddr6, st |
|
Line 658 in6_addmulti(struct in6_addr *maddr6, st |
|
in6m->in6m_ifp = ifp; |
in6m->in6m_ifp = ifp; |
in6m->in6m_refcount = 1; |
in6m->in6m_refcount = 1; |
in6m->in6m_timer = IN6M_TIMER_UNDEF; |
in6m->in6m_timer = IN6M_TIMER_UNDEF; |
|
callout_init(&in6m->in6m_timer_ch, CALLOUT_MPSAFE); |
|
callout_setfunc(&in6m->in6m_timer_ch, mld_timeo, in6m); |
|
|
IFP_TO_IA6(ifp, ia); |
IFP_TO_IA6(ifp, ia); |
if (ia == NULL) { |
if (ia == NULL) { |
|
callout_destroy(&in6m->in6m_timer_ch); |
free(in6m, M_IPMADDR); |
free(in6m, M_IPMADDR); |
splx(s); |
splx(s); |
*errorp = EADDRNOTAVAIL; /* appropriate? */ |
*errorp = EADDRNOTAVAIL; /* appropriate? */ |
Line 674 in6_addmulti(struct in6_addr *maddr6, st |
|
Line 680 in6_addmulti(struct in6_addr *maddr6, st |
|
sockaddr_in6_init(&sin6, maddr6, 0, 0, 0); |
sockaddr_in6_init(&sin6, maddr6, 0, 0, 0); |
*errorp = if_mcast_op(ifp, SIOCADDMULTI, sin6tosa(&sin6)); |
*errorp = if_mcast_op(ifp, SIOCADDMULTI, sin6tosa(&sin6)); |
if (*errorp) { |
if (*errorp) { |
|
callout_destroy(&in6m->in6m_timer_ch); |
LIST_REMOVE(in6m, in6m_entry); |
LIST_REMOVE(in6m, in6m_entry); |
free(in6m, M_IPMADDR); |
free(in6m, M_IPMADDR); |
ifafree(&ia->ia_ifa); |
ifafree(&ia->ia_ifa); |
Line 681 in6_addmulti(struct in6_addr *maddr6, st |
|
Line 688 in6_addmulti(struct in6_addr *maddr6, st |
|
return (NULL); |
return (NULL); |
} |
} |
|
|
callout_init(&in6m->in6m_timer_ch, CALLOUT_MPSAFE); |
|
callout_setfunc(&in6m->in6m_timer_ch, mld_timeo, in6m); |
|
in6m->in6m_timer = timer; |
in6m->in6m_timer = timer; |
if (in6m->in6m_timer > 0) { |
if (in6m->in6m_timer > 0) { |
in6m->in6m_state = MLD_REPORTPENDING; |
in6m->in6m_state = MLD_REPORTPENDING; |