* Add a group to an interface */
| 1493 | * Add a group to an interface |
| 1494 | */ |
| 1495 | int |
| 1496 | if_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(); |
no test coverage detected