示例#1
0
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;
}
示例#2
0
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);
}
示例#3
0
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);
}