int packet_multipart_process(struct packet_multipart *multipart, struct proto_process_stack *stack, unsigned int stack_index) { struct packet *p = packet_pool_get(); if (!p) { packet_multipart_cleanup(multipart); return PROTO_ERR; } // FIXME align offset if (packet_buffer_pool_get(p, multipart->cur, 0)) { packet_pool_release(p); packet_multipart_cleanup(multipart); pom_oom(multipart->cur); return PROTO_ERR; } struct packet_multipart_pkt *tmp = multipart->head; for (; tmp; tmp = tmp->next) { if (tmp->offset + tmp->len > multipart->cur) { pomlog(POMLOG_DEBUG "Offset in packet fragment is bigger than packet size."); packet_pool_release(p); packet_multipart_cleanup(multipart); return PROTO_INVALID; } memcpy(p->buff + tmp->offset, tmp->pkt->buff + tmp->pkt_buff_offset, tmp->len); } memcpy(&p->ts, &multipart->tail->pkt->ts, sizeof(struct timeval)); p->multipart = multipart; p->len = multipart->cur; p->datalink = multipart->proto; p->input = multipart->head->pkt->input; stack[stack_index].pload = p->buff; stack[stack_index].plen = p->len; stack[stack_index].proto = p->datalink; int res = core_process_multi_packet(stack, stack_index, p); packet_pool_release(p); return res; }
int packet_multipart_process(struct packet_multipart *multipart, struct proto_process_stack *stack, unsigned int stack_index) { struct packet *p = packet_alloc(); if (!p) { packet_multipart_cleanup(multipart); return PROTO_ERR; } if (packet_buffer_alloc(p, multipart->cur, multipart->align_offset)) { packet_release(p); packet_multipart_cleanup(multipart); return PROTO_ERR; } struct packet_multipart_pkt *tmp = multipart->head; for (; tmp; tmp = tmp->next) { if (tmp->offset + tmp->len > multipart->cur) { pomlog(POMLOG_DEBUG "Offset in packet fragment is bigger than packet size."); packet_release(p); packet_multipart_cleanup(multipart); return PROTO_INVALID; } memcpy(p->buff + tmp->offset, tmp->pkt->buff + tmp->pkt_buff_offset, tmp->len); } p->ts = multipart->tail->pkt->ts; p->multipart = multipart; p->len = multipart->cur; p->datalink = multipart->proto; p->input = multipart->head->pkt->input; stack[stack_index].pload = p->buff; stack[stack_index].plen = p->len; stack[stack_index].proto = p->datalink; int res = core_process_multi_packet(stack, stack_index, p); packet_release(p); return (res == PROTO_ERR ? POM_ERR : POM_OK); }
static int proto_tftp_process_payload(struct conntrack_entry *ce, struct packet *p, struct proto_process_stack *stack, unsigned int stack_index) { return core_process_multi_packet(stack, stack_index, p); }