Learn to count!
This commit is contained in:
parent
cf027261c8
commit
bc202c07eb
2 changed files with 10 additions and 6 deletions
12
src/packet.c
12
src/packet.c
|
@ -93,14 +93,13 @@ enum FD_STATE write_packet_to_tcp(struct evt_core_fdinfo* fdinfo, struct buffer_
|
|||
enum FD_STATE write_packet_to_udp(struct evt_core_fdinfo* fdinfo, struct buffer_packet* bp, struct udp_target* udp_t) {
|
||||
ssize_t nwrite;
|
||||
union abstract_packet* ap = (union abstract_packet*) (&bp->ip + bp->awrite);
|
||||
union abstract_packet* end = buffer_free_ap(bp);
|
||||
if (bp->mode != BP_WRITING) return FDS_ERR;
|
||||
|
||||
while (ap != end) {
|
||||
do {
|
||||
if (ap->fmt.headers.cmd != CMD_UDP_ENCAPSULATED) continue;
|
||||
|
||||
size_t bytes_to_send;
|
||||
size_t pkt_header_size = sizeof(ap->fmt.headers);
|
||||
size_t pkt_header_size = sizeof(ap->fmt.headers) + sizeof(ap->fmt.content.udp_encapsulated) - sizeof(ap->fmt.content.udp_encapsulated.payload);
|
||||
struct sockaddr* addr = NULL;
|
||||
socklen_t addrlen = 0;
|
||||
if (udp_t->set) {
|
||||
|
@ -110,7 +109,7 @@ enum FD_STATE write_packet_to_udp(struct evt_core_fdinfo* fdinfo, struct buffer_
|
|||
|
||||
bytes_to_send = ap->fmt.headers.size - pkt_header_size;
|
||||
nwrite = sendto(fdinfo->fd,
|
||||
&(ap->fmt.content.udp_encapsulated),
|
||||
&(ap->fmt.content.udp_encapsulated.payload),
|
||||
bytes_to_send,
|
||||
0,
|
||||
addr,
|
||||
|
@ -119,7 +118,8 @@ enum FD_STATE write_packet_to_udp(struct evt_core_fdinfo* fdinfo, struct buffer_
|
|||
if (nwrite == -1 && errno == EAGAIN) return FDS_AGAIN;
|
||||
if (nwrite != bytes_to_send) return FDS_ERR;
|
||||
bp->awrite += nwrite;
|
||||
}
|
||||
|
||||
} while((ap = ap_next(ap)) != NULL);
|
||||
|
||||
bp->mode = BP_READING;
|
||||
bp->aread = 0;
|
||||
|
@ -137,7 +137,7 @@ enum FD_STATE read_packet_from_udp (struct evt_core_fdinfo* fdinfo, struct buffe
|
|||
return FDS_ERR;
|
||||
}
|
||||
|
||||
size_t pkt_header_size = sizeof(ap->fmt.headers);
|
||||
size_t pkt_header_size = sizeof(ap->fmt.headers) + sizeof(ap->fmt.content.udp_encapsulated) - sizeof(ap->fmt.content.udp_encapsulated.payload);
|
||||
size_t udp_packet_size = sizeof(bp->ip) - pkt_header_size;
|
||||
socklen_t addrlen = sizeof(struct sockaddr_in);
|
||||
|
||||
|
|
|
@ -127,18 +127,22 @@ int main_on_udp_write (struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo)
|
|||
int write_res = FDS_READY;
|
||||
|
||||
// 1. Get current write buffer OR a buffer from the waiting queue OR leave
|
||||
if (ctx->verbose > 1) fprintf(stderr, " [proxy] Find write buffer\n");
|
||||
if ((bp = get_write_buffer(&app_ctx->br, fdinfo)) == NULL) return 1;
|
||||
|
||||
// 2. Write buffer
|
||||
if (ctx->verbose > 1) fprintf(stderr, " [proxy] Write UDP packet\n");
|
||||
write_res = write_packet_to_udp(fdinfo, bp, fdinfo->other);
|
||||
if (write_res == FDS_ERR) goto co_error;
|
||||
if (write_res == FDS_AGAIN) return 1;
|
||||
|
||||
// 3. Notify helpers
|
||||
if (ctx->verbose > 1) fprintf(stderr, " [proxy] Notify traffic capture\n");
|
||||
traffic_capture_notify (&app_ctx->cap, bp, "out");
|
||||
|
||||
// 4. A whole packet has been written
|
||||
// Release the buffer and notify
|
||||
if (ctx->verbose > 1) fprintf(stderr, " [proxy] Release buffer and notify\n");
|
||||
mv_buffer_wtof(&app_ctx->br, fdinfo);
|
||||
notify_read(ctx, &app_ctx->br);
|
||||
|
||||
|
|
Loading…
Reference in a new issue