MCPcopy Create free account
hub / github.com/F-Stack/f-stack / if_addgroup

Function if_addgroup

freebsd/net/if.c:1495–1559  ·  view source on GitHub ↗

* Add a group to an interface */

Source from the content-addressed store, hash-verified

1493 * Add a group to an interface
1494 */
1495int
1496if_addgroup(struct ifnet *ifp, const char *groupname)
1497{
1498 struct ifg_list *ifgl;
1499 struct ifg_group *ifg = NULL;
1500 struct ifg_member *ifgm;
1501 int new = 0;
1502
1503 if (groupname[0] && groupname[strlen(groupname) - 1] >= '0' &&
1504 groupname[strlen(groupname) - 1] <= '9')
1505 return (EINVAL);
1506
1507 IFNET_WLOCK();
1508 CK_STAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next)
1509 if (!strcmp(ifgl->ifgl_group->ifg_group, groupname)) {
1510 IFNET_WUNLOCK();
1511 return (EEXIST);
1512 }
1513
1514 if ((ifgl = malloc(sizeof(*ifgl), M_TEMP, M_NOWAIT)) == NULL) {
1515 IFNET_WUNLOCK();
1516 return (ENOMEM);
1517 }
1518
1519 if ((ifgm = malloc(sizeof(*ifgm), M_TEMP, M_NOWAIT)) == NULL) {
1520 free(ifgl, M_TEMP);
1521 IFNET_WUNLOCK();
1522 return (ENOMEM);
1523 }
1524
1525 CK_STAILQ_FOREACH(ifg, &V_ifg_head, ifg_next)
1526 if (!strcmp(ifg->ifg_group, groupname))
1527 break;
1528
1529 if (ifg == NULL) {
1530 if ((ifg = malloc(sizeof(*ifg), M_TEMP, M_NOWAIT)) == NULL) {
1531 free(ifgl, M_TEMP);
1532 free(ifgm, M_TEMP);
1533 IFNET_WUNLOCK();
1534 return (ENOMEM);
1535 }
1536 strlcpy(ifg->ifg_group, groupname, sizeof(ifg->ifg_group));
1537 ifg->ifg_refcnt = 0;
1538 CK_STAILQ_INIT(&ifg->ifg_members);
1539 CK_STAILQ_INSERT_TAIL(&V_ifg_head, ifg, ifg_next);
1540 new = 1;
1541 }
1542
1543 ifg->ifg_refcnt++;
1544 ifgl->ifgl_group = ifg;
1545 ifgm->ifgm_ifp = ifp;
1546
1547 IF_ADDR_WLOCK(ifp);
1548 CK_STAILQ_INSERT_TAIL(&ifg->ifg_members, ifgm, ifgm_next);
1549 CK_STAILQ_INSERT_TAIL(&ifp->if_groups, ifgl, ifgl_next);
1550 IF_ADDR_WUNLOCK(ifp);
1551
1552 IFNET_WUNLOCK();

Callers 5

if_attach_internalFunction · 0.85
ifhwioctlFunction · 0.85
if_clone_addifFunction · 0.85
if_clone_destroyifFunction · 0.85
if_clone_addgroupFunction · 0.85

Calls 4

strcmpFunction · 0.85
mallocFunction · 0.85
freeFunction · 0.50
strlcpyFunction · 0.50

Tested by

no test coverage detected