| 116 | } |
| 117 | |
| 118 | static rte_node_t |
| 119 | node_clone(struct node *node, const char *name) |
| 120 | { |
| 121 | rte_node_t rc = RTE_NODE_ID_INVALID; |
| 122 | struct rte_node_register *reg; |
| 123 | rte_edge_t i; |
| 124 | |
| 125 | /* Don't allow to clone a node from a cloned node */ |
| 126 | if (node->parent_id != RTE_NODE_ID_INVALID) { |
| 127 | rte_errno = EEXIST; |
| 128 | goto fail; |
| 129 | } |
| 130 | |
| 131 | reg = calloc(1, sizeof(*reg) + (sizeof(char *) * node->nb_edges)); |
| 132 | if (reg == NULL) { |
| 133 | rte_errno = ENOMEM; |
| 134 | goto fail; |
| 135 | } |
| 136 | |
| 137 | /* Clone the source node */ |
| 138 | reg->flags = node->flags; |
| 139 | reg->process = node->process; |
| 140 | reg->init = node->init; |
| 141 | reg->fini = node->fini; |
| 142 | reg->nb_edges = node->nb_edges; |
| 143 | reg->parent_id = node->id; |
| 144 | |
| 145 | for (i = 0; i < node->nb_edges; i++) |
| 146 | reg->next_nodes[i] = node->next_nodes[i]; |
| 147 | |
| 148 | /* Naming ceremony of the new node. name is node->name + "-" + name */ |
| 149 | if (clone_name(reg->name, node->name, name)) |
| 150 | goto free; |
| 151 | |
| 152 | rc = __rte_node_register(reg); |
| 153 | free: |
| 154 | free(reg); |
| 155 | fail: |
| 156 | return rc; |
| 157 | } |
| 158 | |
| 159 | rte_node_t |
| 160 | rte_node_clone(rte_node_t id, const char *name) |
no test coverage detected