version 1.27.4.2, 2006/12/30 20:50:39 |
version 1.39, 2007/07/09 21:11:13 |
|
|
hbh_buf[3] = 0; |
hbh_buf[3] = 0; |
hbh_buf[4] = IP6OPT_RTALERT; |
hbh_buf[4] = IP6OPT_RTALERT; |
hbh_buf[5] = IP6OPT_RTALERT_LEN - 2; |
hbh_buf[5] = IP6OPT_RTALERT_LEN - 2; |
bcopy((caddr_t)&rtalert_code, &hbh_buf[6], sizeof(u_int16_t)); |
bcopy((void *)&rtalert_code, &hbh_buf[6], sizeof(u_int16_t)); |
|
|
ip6_opts.ip6po_hbh = hbh; |
ip6_opts.ip6po_hbh = hbh; |
/* We will specify the hoplimit by a multicast option. */ |
/* We will specify the hoplimit by a multicast option. */ |
|
|
} |
} |
|
|
static void |
static void |
mld_starttimer(in6m) |
mld_starttimer(struct in6_multi *in6m) |
struct in6_multi *in6m; |
|
{ |
{ |
struct timeval now; |
struct timeval now; |
|
|
Line 209 mld_starttimer(in6m) |
|
Line 208 mld_starttimer(in6m) |
|
} |
} |
|
|
static void |
static void |
mld_stoptimer(in6m) |
mld_stoptimer(struct in6_multi *in6m) |
struct in6_multi *in6m; |
|
{ |
{ |
if (in6m->in6m_timer == IN6M_TIMER_UNDEF) |
if (in6m->in6m_timer == IN6M_TIMER_UNDEF) |
return; |
return; |
Line 221 mld_stoptimer(in6m) |
|
Line 219 mld_stoptimer(in6m) |
|
} |
} |
|
|
static void |
static void |
mld_timeo(in6m) |
mld_timeo(struct in6_multi *in6m) |
struct in6_multi *in6m; |
|
{ |
{ |
int s = splsoftnet(); |
int s = splsoftnet(); |
|
|
|
|
} |
} |
|
|
static u_long |
static u_long |
mld_timerresid(in6m) |
mld_timerresid(struct in6_multi *in6m) |
struct in6_multi *in6m; |
|
{ |
{ |
struct timeval now, diff; |
struct timeval now, diff; |
|
|
Line 268 mld_timerresid(in6m) |
|
Line 264 mld_timerresid(in6m) |
|
} |
} |
|
|
static void |
static void |
mld_start_listening(in6m) |
mld_start_listening(struct in6_multi *in6m) |
struct in6_multi *in6m; |
|
{ |
{ |
struct in6_addr all_in6; |
struct in6_addr all_in6; |
|
|
Line 301 mld_start_listening(in6m) |
|
Line 296 mld_start_listening(in6m) |
|
} |
} |
|
|
static void |
static void |
mld_stop_listening(in6m) |
mld_stop_listening(struct in6_multi *in6m) |
struct in6_multi *in6m; |
|
{ |
{ |
struct in6_addr allnode, allrouter; |
struct in6_addr allnode, allrouter; |
|
|
Line 326 mld_stop_listening(in6m) |
|
Line 320 mld_stop_listening(in6m) |
|
} |
} |
|
|
void |
void |
mld_input(m, off) |
mld_input(struct mbuf *m, int off) |
struct mbuf *m; |
|
int off; |
|
{ |
{ |
struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *); |
struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *); |
struct mld_hdr *mldh; |
struct mld_hdr *mldh; |
Line 497 mld_input(m, off) |
|
Line 489 mld_input(m, off) |
|
} |
} |
|
|
static void |
static void |
mld_sendpkt(in6m, type, dst) |
mld_sendpkt(struct in6_multi *in6m, int type, |
struct in6_multi *in6m; |
const struct in6_addr *dst) |
int type; |
|
const struct in6_addr *dst; |
|
{ |
{ |
struct mbuf *mh; |
struct mbuf *mh; |
struct mld_hdr *mldh; |
struct mld_hdr *mldh; |
Line 620 mld_allocbuf(struct mbuf **mh, int len, |
|
Line 610 mld_allocbuf(struct mbuf **mh, int len, |
|
* Add an address to the list of IP6 multicast addresses for a given interface. |
* Add an address to the list of IP6 multicast addresses for a given interface. |
*/ |
*/ |
struct in6_multi * |
struct in6_multi * |
in6_addmulti(maddr6, ifp, errorp, timer) |
in6_addmulti(struct in6_addr *maddr6, struct ifnet *ifp, |
struct in6_addr *maddr6; |
int *errorp, int timer) |
struct ifnet *ifp; |
|
int *errorp, timer; |
|
{ |
{ |
struct in6_ifaddr *ia; |
struct in6_ifaddr *ia; |
struct in6_ifreq ifr; |
struct in6_ifreq ifr; |
Line 690 in6_addmulti(maddr6, ifp, errorp, timer) |
|
Line 678 in6_addmulti(maddr6, ifp, errorp, timer) |
|
*errorp = ENXIO; /* XXX: appropriate? */ |
*errorp = ENXIO; /* XXX: appropriate? */ |
else |
else |
*errorp = (*ifp->if_ioctl)(ifp, SIOCADDMULTI, |
*errorp = (*ifp->if_ioctl)(ifp, SIOCADDMULTI, |
(caddr_t)&ifr); |
(void *)&ifr); |
if (*errorp) { |
if (*errorp) { |
LIST_REMOVE(in6m, in6m_entry); |
LIST_REMOVE(in6m, in6m_entry); |
/* leaks in6m_timer_ch */ |
/* leaks in6m_timer_ch */ |
Line 700 in6_addmulti(maddr6, ifp, errorp, timer) |
|
Line 688 in6_addmulti(maddr6, ifp, errorp, timer) |
|
return (NULL); |
return (NULL); |
} |
} |
|
|
callout_init(in6m->in6m_timer_ch); |
callout_init(in6m->in6m_timer_ch, 0); |
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; |
Line 724 in6_addmulti(maddr6, ifp, errorp, timer) |
|
Line 712 in6_addmulti(maddr6, ifp, errorp, timer) |
|
* Delete a multicast address record. |
* Delete a multicast address record. |
*/ |
*/ |
void |
void |
in6_delmulti(in6m) |
in6_delmulti(struct in6_multi *in6m) |
struct in6_multi *in6m; |
|
{ |
{ |
struct in6_ifreq ifr; |
struct in6_ifreq ifr; |
struct in6_ifaddr *ia; |
struct in6_ifaddr *ia; |
Line 770 in6_delmulti(in6m) |
|
Line 757 in6_delmulti(in6m) |
|
ifr.ifr_addr.sin6_len = sizeof(struct sockaddr_in6); |
ifr.ifr_addr.sin6_len = sizeof(struct sockaddr_in6); |
ifr.ifr_addr.sin6_addr = in6m->in6m_addr; |
ifr.ifr_addr.sin6_addr = in6m->in6m_addr; |
(*in6m->in6m_ifp->if_ioctl)(in6m->in6m_ifp, |
(*in6m->in6m_ifp->if_ioctl)(in6m->in6m_ifp, |
SIOCDELMULTI, (caddr_t)&ifr); |
SIOCDELMULTI, (void *)&ifr); |
free(in6m->in6m_timer_ch, M_IPMADDR); |
free(in6m->in6m_timer_ch, M_IPMADDR); |
free(in6m, M_IPMADDR); |
free(in6m, M_IPMADDR); |
} |
} |
Line 779 in6_delmulti(in6m) |
|
Line 766 in6_delmulti(in6m) |
|
|
|
|
|
struct in6_multi_mship * |
struct in6_multi_mship * |
in6_joingroup(ifp, addr, errorp, timer) |
in6_joingroup(struct ifnet *ifp, struct in6_addr *addr, |
struct ifnet *ifp; |
int *errorp, int timer) |
struct in6_addr *addr; |
|
int *errorp, timer; |
|
{ |
{ |
struct in6_multi_mship *imm; |
struct in6_multi_mship *imm; |
|
|
Line 803 in6_joingroup(ifp, addr, errorp, timer) |
|
Line 788 in6_joingroup(ifp, addr, errorp, timer) |
|
} |
} |
|
|
int |
int |
in6_leavegroup(imm) |
in6_leavegroup(struct in6_multi_mship *imm) |
struct in6_multi_mship *imm; |
|
{ |
{ |
|
|
if (imm->i6mm_maddr) { |
if (imm->i6mm_maddr) { |
Line 822 in6_leavegroup(imm) |
|
Line 806 in6_leavegroup(imm) |
|
* such time as this interface is reconfigured for IPv6. |
* such time as this interface is reconfigured for IPv6. |
*/ |
*/ |
void |
void |
in6_savemkludge(oia) |
in6_savemkludge(struct in6_ifaddr *oia) |
struct in6_ifaddr *oia; |
|
{ |
{ |
struct in6_ifaddr *ia; |
struct in6_ifaddr *ia; |
struct in6_multi *in6m; |
struct in6_multi *in6m; |
Line 863 in6_savemkludge(oia) |
|
Line 846 in6_savemkludge(oia) |
|
* then we re-attach it to the first address configured on the i/f. |
* then we re-attach it to the first address configured on the i/f. |
*/ |
*/ |
void |
void |
in6_restoremkludge(ia, ifp) |
in6_restoremkludge(struct in6_ifaddr *ia, struct ifnet *ifp) |
struct in6_ifaddr *ia; |
|
struct ifnet *ifp; |
|
{ |
{ |
struct multi6_kludge *mk; |
struct multi6_kludge *mk; |
struct in6_multi *in6m; |
struct in6_multi *in6m; |
Line 896 in6_restoremkludge(ia, ifp) |
|
Line 877 in6_restoremkludge(ia, ifp) |
|
* it is a global function. |
* it is a global function. |
*/ |
*/ |
void |
void |
in6_createmkludge(ifp) |
in6_createmkludge(struct ifnet *ifp) |
struct ifnet *ifp; |
|
{ |
{ |
struct multi6_kludge *mk; |
struct multi6_kludge *mk; |
|
|
Line 916 in6_createmkludge(ifp) |
|
Line 896 in6_createmkludge(ifp) |
|
} |
} |
|
|
void |
void |
in6_purgemkludge(ifp) |
in6_purgemkludge(struct ifnet *ifp) |
struct ifnet *ifp; |
|
{ |
{ |
struct multi6_kludge *mk; |
struct multi6_kludge *mk; |
struct in6_multi *in6m, *next; |
struct in6_multi *in6m, *next; |