Fix a few oversights in the new multicast membership interface.

This commit is contained in:
Garrett Wollman 1997-01-08 13:20:25 +00:00
parent 07a7a2c487
commit 373f88ed5c
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=21434
2 changed files with 32 additions and 7 deletions

View File

@ -793,9 +793,10 @@ if_allmulti(ifp, onswitch)
* The link layer provides a routine which converts
*/
int
if_addmulti(ifp, sa)
if_addmulti(ifp, sa, retifma)
struct ifnet *ifp; /* interface to manipulate */
struct sockaddr *sa; /* address to add */
struct ifmultiaddr *retifma;
{
struct sockaddr *llsa, *dupsa;
int error, s;
@ -809,6 +810,7 @@ if_addmulti(ifp, sa)
if (ifma) {
ifma->ifma_refcount++;
if (retifma) *retifma = ifma;
return 0;
}
@ -832,6 +834,8 @@ if_addmulti(ifp, sa)
ifma->ifma_lladdr = llsa;
ifma->ifma_ifp = ifp;
ifma->ifma_refcount = 1;
ifma->ifma_protospec = 0;
/*
* Some network interfaces can scan the address list at
* interrupt time; lock them out.
@ -839,6 +843,7 @@ if_addmulti(ifp, sa)
s = splimp();
LIST_INSERT_HEAD(&ifp->if_multiaddrs, ifma, ifma_link);
splx(s);
*retifma = ifma;
if (llsa != 0) {
for (ifma = ifp->if_multiaddrs.lh_first; ifma;
@ -936,5 +941,20 @@ if_delmulti(ifp, sa)
return 0;
}
struct ifmultiaddr *
ifmaof_ifpforaddr(sa, ifp)
struct sockaddr *sa;
struct ifnet *ifp;
{
struct ifmultiaddr *ifma;
for (ifma = ifp->if_multiaddrs.lh_first; ifma;
ifma = ifma->ifma_link.le_next)
if (equal(ifma->ifma_addr, sa))
break;
return ifma;
}
SYSCTL_NODE(_net, PF_LINK, link, CTLFLAG_RW, 0, "Link layers");
SYSCTL_NODE(_net_link, 0, generic, CTLFLAG_RW, 0, "Generic link-management");

View File

@ -264,11 +264,12 @@ struct ifaddr {
* address, not a count of pointers to this structure.
*/
struct ifmultiaddr {
LIST_ENTRY(ifmultiaddr) ifma_link;
struct sockaddr *ifma_addr;
struct sockaddr *ifma_lladdr;
struct ifnet *ifma_ifp;
u_int ifma_refcount;
LIST_ENTRY(ifmultiaddr) ifma_link; /* queue macro glue */
struct sockaddr *ifma_addr; /* address this membership is for */
struct sockaddr *ifma_lladdr; /* link-layer translation, if any */
struct ifnet *ifma_ifp; /* back-pointer to interface */
u_int ifma_refcount; /* reference count */
void *ifma_protospec; /* protocol-specific state, if any */
};
#ifdef KERNEL
@ -290,7 +291,8 @@ int ether_output __P((struct ifnet *,
struct mbuf *, struct sockaddr *, struct rtentry *));
int ether_ioctl __P((struct ifnet *, int, caddr_t));
int if_addmulti __P((struct ifnet *, struct sockaddr *));
int if_addmulti __P((struct ifnet *, struct sockaddr *,
struct ifmultiaddr **));
int if_allmulti __P((struct ifnet *, int));
void if_attach __P((struct ifnet *));
int if_delmulti __P((struct ifnet *, struct sockaddr *));
@ -319,6 +321,9 @@ struct ifaddr *ifa_ifwithroute __P((int, struct sockaddr *,
struct ifaddr *ifaof_ifpforaddr __P((struct sockaddr *, struct ifnet *));
void ifafree __P((struct ifaddr *));
struct ifmultiaddr *ifmaof_ifpforaddr __P((struct sockaddr *,
struct ifnet *));
int looutput __P((struct ifnet *,
struct mbuf *, struct sockaddr *, struct rtentry *));
#endif /* KERNEL */