int lib_interface_gmp_address_family_static_group_create(
struct nb_cb_create_args *args)
{
-#if PIM_IPV == 4
struct interface *ifp;
- struct ipaddr source_addr;
- struct ipaddr group_addr;
+ pim_addr source_addr;
+ pim_addr group_addr;
int result;
const char *ifp_name;
const struct lyd_node *if_dnode;
return NB_ERR_VALIDATION;
}
- yang_dnode_get_ip(&group_addr, args->dnode, "./group-addr");
- if (pim_is_group_224_0_0_0_24(group_addr.ip._v4_addr)) {
+ yang_dnode_get_pimaddr(&group_addr, args->dnode,
+ "./group-addr");
+#if PIM_IPV == 4
+ if (pim_is_group_224_0_0_0_24(group_addr)) {
snprintf(
args->errmsg, args->errmsg_len,
"Groups within 224.0.0.0/24 are reserved and cannot be joined");
return NB_ERR_VALIDATION;
}
+#else
+ if (ipv6_mcast_reserved(&group_addr)) {
+ snprintf(
+ args->errmsg, args->errmsg_len,
+ "Groups within ffx2::/16 are reserved and cannot be joined");
+ return NB_ERR_VALIDATION;
+ }
+#endif
break;
case NB_EV_PREPARE:
case NB_EV_ABORT:
break;
case NB_EV_APPLY:
ifp = nb_running_get_entry(args->dnode, NULL, true);
- yang_dnode_get_ip(&source_addr, args->dnode, "./source-addr");
- yang_dnode_get_ip(&group_addr, args->dnode, "./group-addr");
-
- result = pim_if_igmp_join_add(ifp, group_addr.ip._v4_addr,
- source_addr.ip._v4_addr);
+ yang_dnode_get_pimaddr(&source_addr, args->dnode,
+ "./source-addr");
+ yang_dnode_get_pimaddr(&group_addr, args->dnode,
+ "./group-addr");
+ result = pim_if_gm_join_add(ifp, group_addr, source_addr);
if (result) {
snprintf(args->errmsg, args->errmsg_len,
- "Failure joining IGMP group");
+ "Failure joining " GM " group");
return NB_ERR_INCONSISTENCY;
}
}
-#else
- /* TBD Depends on MLD data structure changes */
-#endif /* PIM_IPV == 4 */
return NB_OK;
}
struct nb_cb_destroy_args *args)
{
struct interface *ifp;
- struct ipaddr source_addr;
- struct ipaddr group_addr;
+ pim_addr source_addr;
+ pim_addr group_addr;
int result;
switch (args->event) {
break;
case NB_EV_APPLY:
ifp = nb_running_get_entry(args->dnode, NULL, true);
- yang_dnode_get_ip(&source_addr, args->dnode, "./source-addr");
- yang_dnode_get_ip(&group_addr, args->dnode, "./group-addr");
-
- result = pim_if_igmp_join_del(ifp, group_addr.ip._v4_addr,
- source_addr.ip._v4_addr);
+ yang_dnode_get_pimaddr(&source_addr, args->dnode,
+ "./source-addr");
+ yang_dnode_get_pimaddr(&group_addr, args->dnode,
+ "./group-addr");
+ result = pim_if_gm_join_del(ifp, group_addr, source_addr);
if (result) {
- char src_str[INET_ADDRSTRLEN];
- char grp_str[INET_ADDRSTRLEN];
-
- ipaddr2str(&source_addr, src_str, sizeof(src_str));
- ipaddr2str(&group_addr, grp_str, sizeof(grp_str));
-
snprintf(args->errmsg, args->errmsg_len,
- "%% Failure leaving IGMP group %s %s on interface %s: %d",
- src_str, grp_str, ifp->name, result);
+ "%% Failure leaving " GM
+ " group %pPAs %pPAs on interface %s: %d",
+ &source_addr, &group_addr, ifp->name, result);
return NB_ERR_INCONSISTENCY;
}