diff --git a/dp-core/vr_interface.c b/dp-core/vr_interface.c index 1d5cfea1c..eb6e2394d 100644 --- a/dp-core/vr_interface.c +++ b/dp-core/vr_interface.c @@ -2106,7 +2106,7 @@ __vr_interface_make_req(vr_interface_req *req, struct vr_interface *intf, req->vifr_oerrors = 0; /* queue counters */ req->vifr_queue_ipackets = 0; - for (i = 0; i < VR_MAX_CPUS; i++) + for (i = 0; i < vr_num_cpus; i++) req->vifr_queue_ierrors_to_lcore[i] = 0; req->vifr_queue_ierrors = 0; req->vifr_queue_opackets = 0; @@ -2219,13 +2219,19 @@ vr_interface_make_req(vr_interface_req *req, struct vr_interface *vif, unsigned int vr_interface_req_get_size(void *req_p) { + unsigned int size; vr_interface_req *req = (vr_interface_req *)req_p; + /* * Standard interface request size + both ingress and egress * metadata size */ - return ((4 * sizeof(*req)) + (2 * VIF_MAX_MIRROR_MD_SIZE)); + size = ((4 * sizeof(*req)) + (2 * VIF_MAX_MIRROR_MD_SIZE)); + if (req->vifr_queue_ierrors_to_lcore) + size += (vr_num_cpus * sizeof(int64_t)); + + return size; } static vr_interface_req * @@ -2247,7 +2253,7 @@ vr_interface_req_get(void) req->vifr_name = vr_zalloc(VR_INTERFACE_NAME_LEN, VR_INTERFACE_REQ_NAME_OBJECT); - req->vifr_queue_ierrors_to_lcore = vr_zalloc(VR_MAX_CPUS * sizeof(uint64_t), + req->vifr_queue_ierrors_to_lcore = vr_zalloc(vr_num_cpus * sizeof(uint64_t), VR_INTERFACE_REQ_TO_LCORE_ERRORS_OBJECT); if (req->vifr_queue_ierrors_to_lcore) req->vifr_queue_ierrors_to_lcore_size = 0; diff --git a/include/vr_interface.h b/include/vr_interface.h index 646e34ac6..8698b49b4 100644 --- a/include/vr_interface.h +++ b/include/vr_interface.h @@ -330,4 +330,5 @@ extern void vr_set_vif_ptr(struct net_device *dev, void *vif); #endif extern fat_flow_port_mask_t vif_fat_flow_lookup(struct vr_interface *, uint8_t, uint16_t, uint16_t); +extern unsigned int vr_interface_req_get_size(void *); #endif /* __VR_INTERFACE_H__ */ diff --git a/include/vrouter.h b/include/vrouter.h index bae322bab..27fb22df0 100644 --- a/include/vrouter.h +++ b/include/vrouter.h @@ -15,6 +15,7 @@ extern "C" { #include "vr_interface.h" #include "vr_qos.h" #include "vr_flow.h" +#include "vr_interface.h" #include "vr_nexthop.h" #include "vr_route.h" #include "vr_response.h" diff --git a/utils/vif.c b/utils/vif.c index 31bdd7b2a..ed4f6f18a 100644 --- a/utils/vif.c +++ b/utils/vif.c @@ -666,6 +666,13 @@ rate_process(vr_interface_req *req, vr_interface_req *prev_req) temp_prev_req_ptr = prev_req->vifr_queue_ierrors_to_lcore; *prev_req = *req; prev_req->vifr_queue_ierrors_to_lcore = temp_prev_req_ptr; + if (!prev_req->vifr_queue_ierrors_to_lcore) { + prev_req->vifr_queue_ierrors_to_lcore = + malloc(req->vifr_queue_ierrors_to_lcore_size * sizeof(uint64_t)); + if (!prev_req->vifr_queue_ierrors_to_lcore) + return; + } + memcpy(prev_req->vifr_queue_ierrors_to_lcore, req->vifr_queue_ierrors_to_lcore, req->vifr_queue_ierrors_to_lcore_size * sizeof(uint64_t)); @@ -674,7 +681,8 @@ rate_process(vr_interface_req *req, vr_interface_req *prev_req) } rate_req_temp = *req; - rate_req_temp.vifr_queue_ierrors_to_lcore = calloc(VR_MAX_CPUS, sizeof(uint64_t)); + rate_req_temp.vifr_queue_ierrors_to_lcore = + calloc(req->vifr_queue_ierrors_to_lcore_size, sizeof(uint64_t)); if (!rate_req_temp.vifr_queue_ierrors_to_lcore) { fprintf(stderr, "Fail, memory allocation. (%s:%d).", __FILE__ , __LINE__); @@ -1552,17 +1560,6 @@ main(int argc, char *argv[]) vr_intf_op(cl, vr_op); } else { - for (i = 0; i < VR_MAX_INTERFACES; i++) { - - prev_req[i].vifr_queue_ierrors_to_lcore = - (calloc(VR_MAX_CPUS, sizeof(uint64_t))); - - if (!(prev_req[i].vifr_queue_ierrors_to_lcore)) { - fprintf(stderr, "Fail, memory allocation. (%s:%d).", __FILE__ , __LINE__); - exit(1); - } - } - fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL) | O_NONBLOCK); /* * tc[get/set]attr functions are for changing terminal behavior.