356 grp);
357
358 grp->mbg_addr = kmem_zalloc(addr_len, KM_SLEEP);
359 bcopy(addr, grp->mbg_addr, addr_len);
360 grp->mbg_addrtype = addrtype;
361 grp->mbg_vid = vid;
362
363 /*
364 * Add a new flow to the underlying MAC.
365 */
366 bzero(&flow_desc, sizeof (flow_desc));
367 bcopy(addr, &flow_desc.fd_dst_mac, addr_len);
368 flow_desc.fd_mac_len = (uint32_t)addr_len;
369
370 flow_desc.fd_mask = FLOW_LINK_DST;
371 if (vid != 0) {
372 flow_desc.fd_vid = vid;
373 flow_desc.fd_mask |= FLOW_LINK_VID;
374 }
375
376 grp->mbg_id = atomic_add_32_nv(&mac_bcast_id, 1);
377 (void) sprintf(flow_name,
378 "mac/%s/mcast%d", mip->mi_name, grp->mbg_id);
379
380 rc = mac_flow_create(&flow_desc, NULL, flow_name,
381 grp, FLOW_MCAST, &grp->mbg_flow_ent);
382 if (rc != 0) {
383 kmem_free(grp->mbg_addr, addr_len);
384 kmem_cache_free(mac_bcast_grp_cache, grp);
385 goto fail;
386 }
387 grp->mbg_flow_ent->fe_mbg = grp;
388 mip->mi_bcast_ngrps++;
389
390 /*
391 * Initial creation reference on the flow. This is released
392 * in the corresponding delete action i_mac_bcast_delete()
393 */
394 FLOW_REFHOLD(grp->mbg_flow_ent);
395
396 /*
|
356 grp);
357
358 grp->mbg_addr = kmem_zalloc(addr_len, KM_SLEEP);
359 bcopy(addr, grp->mbg_addr, addr_len);
360 grp->mbg_addrtype = addrtype;
361 grp->mbg_vid = vid;
362
363 /*
364 * Add a new flow to the underlying MAC.
365 */
366 bzero(&flow_desc, sizeof (flow_desc));
367 bcopy(addr, &flow_desc.fd_dst_mac, addr_len);
368 flow_desc.fd_mac_len = (uint32_t)addr_len;
369
370 flow_desc.fd_mask = FLOW_LINK_DST;
371 if (vid != 0) {
372 flow_desc.fd_vid = vid;
373 flow_desc.fd_mask |= FLOW_LINK_VID;
374 }
375
376 grp->mbg_id = atomic_inc_32_nv(&mac_bcast_id);
377 (void) sprintf(flow_name,
378 "mac/%s/mcast%d", mip->mi_name, grp->mbg_id);
379
380 rc = mac_flow_create(&flow_desc, NULL, flow_name,
381 grp, FLOW_MCAST, &grp->mbg_flow_ent);
382 if (rc != 0) {
383 kmem_free(grp->mbg_addr, addr_len);
384 kmem_cache_free(mac_bcast_grp_cache, grp);
385 goto fail;
386 }
387 grp->mbg_flow_ent->fe_mbg = grp;
388 mip->mi_bcast_ngrps++;
389
390 /*
391 * Initial creation reference on the flow. This is released
392 * in the corresponding delete action i_mac_bcast_delete()
393 */
394 FLOW_REFHOLD(grp->mbg_flow_ent);
395
396 /*
|