Fix a few oversights in the new multicast membership interface.
This commit is contained in:
parent
07a7a2c487
commit
373f88ed5c
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=21434
22
sys/net/if.c
22
sys/net/if.c
@ -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");
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user