static int u32_clone(void *_dst, void *_src) { struct rtnl_u32 *dst = _dst, *src = _src; if (src->cu_selector && !(dst->cu_selector = nl_data_clone(src->cu_selector))) return -NLE_NOMEM; if (src->cu_mark && !(dst->cu_mark = nl_data_clone(src->cu_mark))) return -NLE_NOMEM; if (src->cu_act) { if (!(dst->cu_act = rtnl_act_alloc())) return -NLE_NOMEM; memcpy(dst->cu_act, src->cu_act, sizeof(struct rtnl_act)); } if (src->cu_police && !(dst->cu_police = nl_data_clone(src->cu_police))) return -NLE_NOMEM; if (src->cu_pcnt && !(dst->cu_pcnt = nl_data_clone(src->cu_pcnt))) return -NLE_NOMEM; return 0; }
static int fw_clone(struct rtnl_cls *_dst, struct rtnl_cls *_src) { struct rtnl_fw *dst = rtnl_cls_data(_dst); struct rtnl_fw *src = rtnl_cls_data(_src); if (src->cf_act && !(dst->cf_act = nl_data_clone(src->cf_act))) return -NLE_NOMEM; if (src->cf_police && !(dst->cf_police = nl_data_clone(src->cf_police))) return -NLE_NOMEM; return 0; }
static int u32_clone(void *_dst, void *_src) { struct rtnl_u32 *dst = _dst, *src = _src; if (src->cu_selector && !(dst->cu_selector = nl_data_clone(src->cu_selector))) return -NLE_NOMEM; if (src->cu_act && !(dst->cu_act = nl_data_clone(src->cu_act))) return -NLE_NOMEM; if (src->cu_police && !(dst->cu_police = nl_data_clone(src->cu_police))) return -NLE_NOMEM; if (src->cu_pcnt && !(dst->cu_pcnt = nl_data_clone(src->cu_pcnt))) return -NLE_NOMEM; return 0; }
static int u32_clone(struct rtnl_cls *_dst, struct rtnl_cls *_src) { struct rtnl_u32 *dst = rtnl_cls_data(_dst); struct rtnl_u32 *src = rtnl_cls_data(_src); if (src->cu_selector && !(dst->cu_selector = nl_data_clone(src->cu_selector))) return -NLE_NOMEM; if (src->cu_act && !(dst->cu_act = nl_data_clone(src->cu_act))) return -NLE_NOMEM; if (src->cu_police && !(dst->cu_police = nl_data_clone(src->cu_police))) return -NLE_NOMEM; if (src->cu_pcnt && !(dst->cu_pcnt = nl_data_clone(src->cu_pcnt))) return -NLE_NOMEM; return 0; }
int tca_clone(struct rtnl_tc *dst, struct rtnl_tc *src) { if (src->tc_link) { dst->tc_link = (struct rtnl_link *) nl_object_clone(OBJ_CAST(src->tc_link)); if (!dst->tc_link) return -NLE_NOMEM; } if (src->tc_opts) { dst->tc_opts = nl_data_clone(src->tc_opts); if (!dst->tc_opts) return -NLE_NOMEM; } if (src->tc_xstats) { dst->tc_xstats = nl_data_clone(src->tc_xstats); if (!dst->tc_xstats) return -NLE_NOMEM; } return 0; }
static int cls_clone(struct nl_object *_dst, struct nl_object *_src) { struct rtnl_cls *dst = nl_object_priv(_dst); struct rtnl_cls *src = nl_object_priv(_src); struct rtnl_cls_ops *cops; int err; err = tca_clone((struct rtnl_tca *) dst, (struct rtnl_tca *) src); if (err < 0) goto errout; if (src->c_subdata) { if (!(dst->c_subdata = nl_data_clone(src->c_subdata))) { err = -NLE_NOMEM; goto errout; } } cops = rtnl_cls_lookup_ops(src); if (cops && cops->co_clone) err = cops->co_clone(dst, src); errout: return err; }