40 |
char *data; |
char *data; |
41 |
size_t data_size; |
size_t data_size; |
42 |
{ |
{ |
43 |
p3_put_packet ( TYPE_DATA, data, data_size); |
p3_put_packet (TYPE_DATA, data, data_size); |
44 |
} |
} |
45 |
|
|
46 |
void |
void |
56 |
if (!data) |
if (!data) |
57 |
data_size = 0; |
data_size = 0; |
58 |
|
|
59 |
buf = malloc ( data_size + P3_DATA_OFFSET + 1); |
buf = malloc (data_size + P3_DATA_OFFSET + 1); |
60 |
header = (struct p3hdr *) buf; |
header = (struct p3hdr *) buf; |
61 |
pdata = &buf[P3_DATA_OFFSET]; |
pdata = &buf[P3_DATA_OFFSET]; |
62 |
|
|
63 |
/* Fill header */ |
/* Fill header */ |
64 |
header->magic = P3_MAGIC; |
header->magic = P3_MAGIC; |
65 |
header->size = htons (data_size + P3_SIZE_OFFSET); |
header->size = htons (data_size + P3_SIZE_OFFSET); |
67 |
cli.lastseq = p3_next_seq (cli.lastseq); |
cli.lastseq = p3_next_seq (cli.lastseq); |
68 |
header->seq = cli.lastseq; |
header->seq = cli.lastseq; |
69 |
if (type == TYPE_NACK) |
if (type == TYPE_NACK) |
70 |
header->ack = p3_add_seq (srv.lastseq, (PACKET_MAX_SEQ - PACKET_MIN_SEQ) - 1); |
header->ack = |
71 |
else |
p3_add_seq (srv.lastseq, (PACKET_MAX_SEQ - PACKET_MIN_SEQ) - 1); |
72 |
header->ack =srv.lastseq; |
else |
73 |
|
header->ack = srv.lastseq; |
74 |
header->client = 1; |
header->client = 1; |
75 |
header->type = type; |
header->type = type; |
76 |
/* Copy data */ |
/* Copy data */ |
77 |
memcpy (pdata, data, data_size); |
memcpy (pdata, data, data_size); |
78 |
|
|
79 |
/* Calculate the checksum */ |
/* Calculate the checksum */ |
80 |
header->checksum = |
header->checksum = htons (p3_crc16 ((char *) &header->size, data_size + 5)); |
|
htons (p3_crc16 ((char *) &header->size, data_size + 5)); |
|
81 |
pdata[data_size] = P3_STOP; |
pdata[data_size] = P3_STOP; |
82 |
|
|
83 |
if (type == TYPE_DATA || type == TYPE_INIT) |
if (type == TYPE_DATA || type == TYPE_INIT) |
84 |
{ |
{ |
85 |
dump_raw ("P3 - output", (char *) header, data_size + P3_DATA_OFFSET + 1); |
dump_raw ("P3 - output", (char *) header, |
86 |
|
data_size + P3_DATA_OFFSET + 1); |
87 |
/* Put the packet into the not yet acknowledged packet window */ |
/* Put the packet into the not yet acknowledged packet window */ |
88 |
win_add(&wunack, buf, data_size + P3_DATA_OFFSET + 1); |
win_add (&wunack, buf, data_size + P3_DATA_OFFSET + 1); |
89 |
} |
} |
90 |
|
|
91 |
/* Put the packet into the send window */ |
/* Put the packet into the send window */ |
92 |
win_add(&wsend, buf, data_size + P3_DATA_OFFSET + 1); |
win_add (&wsend, buf, data_size + P3_DATA_OFFSET + 1); |
93 |
free(buf); |
free (buf); |
94 |
} |
} |