| 1881 | #endif |
| 1882 | |
| 1883 | static int |
| 1884 | lagg_setmulti(struct lagg_port *lp) |
| 1885 | { |
| 1886 | struct lagg_softc *sc = lp->lp_softc; |
| 1887 | struct ifnet *ifp = lp->lp_ifp; |
| 1888 | struct ifnet *scifp = sc->sc_ifp; |
| 1889 | struct lagg_mc *mc; |
| 1890 | struct ifmultiaddr *ifma; |
| 1891 | int error; |
| 1892 | |
| 1893 | IF_ADDR_WLOCK(scifp); |
| 1894 | CK_STAILQ_FOREACH(ifma, &scifp->if_multiaddrs, ifma_link) { |
| 1895 | if (ifma->ifma_addr->sa_family != AF_LINK) |
| 1896 | continue; |
| 1897 | mc = malloc(sizeof(struct lagg_mc), M_LAGG, M_NOWAIT); |
| 1898 | if (mc == NULL) { |
| 1899 | IF_ADDR_WUNLOCK(scifp); |
| 1900 | return (ENOMEM); |
| 1901 | } |
| 1902 | bcopy(ifma->ifma_addr, &mc->mc_addr, |
| 1903 | ifma->ifma_addr->sa_len); |
| 1904 | mc->mc_addr.sdl_index = ifp->if_index; |
| 1905 | mc->mc_ifma = NULL; |
| 1906 | SLIST_INSERT_HEAD(&lp->lp_mc_head, mc, mc_entries); |
| 1907 | } |
| 1908 | IF_ADDR_WUNLOCK(scifp); |
| 1909 | SLIST_FOREACH (mc, &lp->lp_mc_head, mc_entries) { |
| 1910 | error = if_addmulti(ifp, |
| 1911 | (struct sockaddr *)&mc->mc_addr, &mc->mc_ifma); |
| 1912 | if (error) |
| 1913 | return (error); |
| 1914 | } |
| 1915 | return (0); |
| 1916 | } |
| 1917 | |
| 1918 | static int |
| 1919 | lagg_clrmulti(struct lagg_port *lp) |
no test coverage detected