/** * return -1 incomplete command; * current index; */ int parseBulkString(struct WData *wdata, int start){ log4c_category_log(mycat, LOG4C_PRIORITY_ERROR, "parse bulk string at line %d in file %s, %s", __LINE__, __FILE__, wdata->data); int index = start; index++; int item_len = 0; int data_start; while(wdata->data[index] != '\r' && index < wdata->len){ item_len = item_len * 10 + wdata->data[index] - '0'; index++; } if(index >= wdata->len){ saveToBuf(wdata, start, &buf_slave_answer); return -1; } index++; data_start = index + 1; index += item_len + 2; index++; if(index > wdata->len){ saveToBuf(wdata, start, &buf_slave_answer); return -1; } char *saveData = (char*)calloc(item_len + 1, sizeof(char)); strncpy(saveData, wdata->data+ data_start, item_len); if(saveData == 0){ log4c_category_log(mycat, LOG4C_PRIORITY_ERROR, "post data empty at line %d in file %s", __LINE__, __FILE__); } popHandle(saveData); return index; }
/* * return -1 incomplete command */ int parseSimple(struct WData *wdata, int start){ int index = start; index++; int error_start = index; int exist = 0; while( index < wdata->len){ if(wdata->data[index] == '\n'){ exist = 1; break; } index++; } if(exist == 1){ char *cmd = (char*)calloc(index - start + 1, sizeof(char)); strncpy(cmd, &wdata->data[error_start], index + 1 - start); if(wdata->data[index] == '-' ){ DataType e = pop_cir_queue(&q); log4c_category_log(mycat, LOG4C_PRIORITY_ERROR, "pop %s receive error %s at line %d in file %s", e, cmd, __LINE__, __FILE__); } else{ if(index - start > 5){ DataType e = pop_cir_queue(&q); log4c_category_log(mycat, LOG4C_PRIORITY_ERROR, "pop %s receive string %s at line %d in file %s", e, cmd, __LINE__, __FILE__); } } free(cmd); return index + 1; } else{ saveToBuf(wdata, start, &buf_slave_answer); return -1; } }
/** * @brief RX routine */ void DPDKAdapter::rxRoutine() { uint8_t pkt = 0; uint8_t rxPktCount = 0; uint8_t devId = 0; uint8_t lcoreId = rte_lcore_id(); LcoreInfo& coreInfo = cores[lcoreId]; for(PortList_t::iterator itor = coreInfo.rxPortList.begin(); itor != coreInfo.rxPortList.end(); itor++) { devId = *itor; DeviceInfo& devInfo = devices[devId]; struct rte_eth_dev *dev = &rte_eth_devices[devId]; if(!dev || !dev->data->dev_started) { continue; } rxPktCount = rte_eth_rx_burst(devId, 0, devInfo.rxBurstBuf, DPDK_RX_MAX_PKT_BURST); if(isRxStarted(devId)) { saveToBuf(devId, devInfo.rxBurstBuf, rxPktCount); } for(pkt = 0; pkt < rxPktCount; pkt++) { rte_pktmbuf_free(devInfo.rxBurstBuf[pkt]); } } }
/* * return current index; * -1 incomplete command; */ int parseArray(struct WData *wdata, int start){ int index = start; index++; if(index >= wdata->len){ saveToBuf(wdata, start, &buf_slave_answer); return -1; } int array_len = 0; int enter = 0; while(wdata->data[index] != '\r' && index < wdata->len){ array_len = array_len * 10 + wdata->data[index] - '0'; index++; enter = 1; if(index >= wdata->len){ saveToBuf(wdata, start, &buf_slave_answer); return -1; } } index += 2; if(index > wdata->len || (index == wdata->len && array_len > 0)){ saveToBuf(wdata, start, &buf_slave_answer); return -1; } char *item_key; char *item_value; json_t *object = json_object(); while(array_len > 0){ if(wdata->data[index] != '$'){ log4c_category_log(mycat, LOG4C_PRIORITY_ERROR, "unexpected data, index %d, start %d, wdata->len %d, index value %c at line %d in file %s, data %s",index, start, wdata->len, wdata->data[index], __LINE__, __FILE__, wdata->data); printf("2unexpected data, index %d, start %d, wdata->len %d, index %d\n", index, start, wdata->len, wdata->data[index]); int i; for(i = start; i <= index; i++) printf("%c", wdata->data[i]); for(i = index + 1; i< wdata->len; i++) printf("%c", wdata->data[i]); exit(1); } index++; if(index >= wdata->len){ saveToBuf(wdata, start, &buf_slave_answer); json_decref(object); return -1; } int item_len = 0; int item_start; while(wdata->data[index] != '\r' && index < wdata->len){ item_len = item_len * 10 + wdata->data[index] - '0'; index++; } if(index >= wdata->len){ saveToBuf(wdata, start, &buf_slave_answer); json_decref(object); return -1; } index++; item_start = index + 1; index += item_len + 2; index++; if(index > wdata->len || (index == wdata->len && array_len > 1)){ saveToBuf(wdata, start, &buf_slave_answer); json_decref(object); return -1; } if(item_len > 0){ if(array_len %2 == 0){ item_key = (char*)calloc(item_len + 1, sizeof(char)); strncpy(item_key, wdata->data + item_start, item_len); } else{ item_value = (char*)calloc(item_len + 1, sizeof(char)); strncpy(item_value, wdata->data + item_start, item_len); if(item_key && item_value){ json_t *item_json; item_json = json_string(item_value); free(item_value); json_object_set(object, item_key, item_json); json_decref(item_json); free(item_key); } else{ log4c_category_log(mycat, LOG4C_PRIORITY_ERROR, "item key is null or item value is null at line %d in file %s", __LINE__, __FILE__); } } } array_len--; } popHandle(object); return index; }