void ind_cxn_bundle_add_handle(connection_t *cxn, of_object_t *obj) { uint32_t bundle_id; uint16_t flags; of_octets_t data; of_bundle_add_msg_bundle_id_get(obj, &bundle_id); of_bundle_add_msg_flags_get(obj, &flags); of_bundle_add_msg_data_get(obj, &data); bundle_t *bundle = find_bundle(cxn, bundle_id); if (bundle == NULL) { indigo_cxn_send_error_reply( cxn->cxn_id, obj, OF_ERROR_TYPE_BUNDLE_FAILED, OFPBFC_BAD_ID); return; } /* Validate length */ if (data.bytes < OF_MESSAGE_HEADER_LENGTH || data.bytes != of_message_length_get(data.data)) { indigo_cxn_send_error_reply( cxn->cxn_id, obj, OF_ERROR_TYPE_BUNDLE_FAILED, OFPBFC_MSG_BAD_LEN); AIM_LOG_WARN("Inconsistent bundled message length", bundle->id); return; } /* Limit number of messages in the bundle */ if (bundle->count >= OFCONNECTIONMANAGER_CONFIG_MAX_BUNDLE_MSGS) { indigo_cxn_send_error_reply( cxn->cxn_id, obj, OF_ERROR_TYPE_BUNDLE_FAILED, OFPBFC_MSG_TOO_MANY); AIM_LOG_WARN("Exceeded maximum number (%u) of messages in bundle %u", OFCONNECTIONMANAGER_CONFIG_MAX_BUNDLE_MSGS, bundle->id); return; } /* Limit amount of memory used by the bundle */ if ((bundle->bytes + data.bytes) > OFCONNECTIONMANAGER_CONFIG_MAX_BUNDLE_BYTES) { indigo_cxn_send_error_reply( cxn->cxn_id, obj, OF_ERROR_TYPE_BUNDLE_FAILED, OFPBFC_MSG_TOO_MANY); AIM_LOG_WARN("Exceeded maximum size (%u bytes) of messages in bundle %u", OFCONNECTIONMANAGER_CONFIG_MAX_BUNDLE_BYTES, bundle->id); return; } if (bundle->count == bundle->allocated) { /* Resize array */ uint32_t new_allocated = (bundle->allocated == 0 ? 1 : bundle->allocated * 2); bundle->msgs = aim_realloc(bundle->msgs, sizeof(*bundle->msgs) * new_allocated); bundle->allocated = new_allocated; } bundle->msgs[bundle->count++] = aim_memdup(data.data, data.bytes); bundle->bytes += data.bytes; }
static vpi_qpacket_t* qpacket_alloc__(unsigned char* data, int size) { vpi_qpacket_t* qp = aim_zmalloc(sizeof(*qp)); qp->data = aim_memdup(data, size); qp->size = size; return qp; }
int ppe_packet_dup(ppe_packet_t* dst, ppe_packet_t* src) { ppe_packet_init(dst, aim_memdup(src->data, src->size), src->size); PPE_MEMCPY(dst->mh, src->mh, sizeof(dst->mh)); ppe_parse(dst); dst->realloc = 1; return 0; }