Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
LARN
PRRT
Commits
4c5f38ef
Commit
4c5f38ef
authored
Nov 30, 2015
by
Andreas Schmidt
Browse files
Consistent naming. Small fixes.
parent
526cb9fc
Changes
8
Hide whitespace changes
Inline
Side-by-side
prrt/data_transmitter.c
View file @
4c5f38ef
...
...
@@ -6,18 +6,18 @@
#include
"socket.h"
void
*
send_data_loop
(
void
*
ptr
)
{
p
rrt
_s
ocket
*
sock_ptr
=
ptr
;
P
rrt
S
ocket
*
sock_ptr
=
ptr
;
while
(
1
)
{
pthread_mutex_lock
(
&
sock_ptr
->
out_queue_filled_mutex
);
while
(
List_count
(
sock_ptr
->
out_queue
)
==
0
)
{
pthread_cond_wait
(
&
sock_ptr
->
out_queue_filled_cv
,
&
sock_ptr
->
out_queue_filled_mutex
);
}
p
rrt
_p
acket
*
packet
=
List_shift
(
sock_ptr
->
out_queue
);
P
rrt
P
acket
*
packet
=
List_shift
(
sock_ptr
->
out_queue
);
uint8_t
buf
[
MAX_PAYLOAD_LENGTH
];
uint32_t
length
=
p
acket_size
(
packet
);
if
(
encode_packet
(
buf
,
MAX_PAYLOAD_LENGTH
,
packet
)
<
0
)
{
uint32_t
length
=
PrrtP
acket_size
(
packet
);
if
(
PrrtPacket_encode
(
buf
,
MAX_PAYLOAD_LENGTH
,
packet
)
<
0
)
{
perror
(
"BUF too small."
);
exit
(
0
);
}
...
...
@@ -25,7 +25,7 @@ void * send_data_loop(void *ptr) {
// SENDING TO ALL RECEIVERS
int
i
;
for
(
i
=
0
;
i
<
sock_ptr
->
receiver_len
;
i
++
)
{
p
rrt
_r
eceiver
recv
=
sock_ptr
->
receivers
[
i
];
P
rrt
R
eceiver
recv
=
sock_ptr
->
receivers
[
i
];
struct
hostent
*
hp
;
...
...
@@ -43,7 +43,7 @@ void * send_data_loop(void *ptr) {
break
;
}
}
delete_packet
(
packet
);
PrrtPacket_destroy
(
packet
);
pthread_mutex_unlock
(
&
sock_ptr
->
out_queue_filled_mutex
);
usleep
(
1
);
...
...
prrt/feedback_receiver.c
View file @
4c5f38ef
...
...
@@ -7,13 +7,13 @@
void
*
receive_feedback_loop
(
void
*
ptr
)
{
char
bufin
[
MAX_PAYLOAD_LENGTH
];
p
rrt
_s
ocket
*
sock_ptr
=
ptr
;
P
rrt
S
ocket
*
sock_ptr
=
ptr
;
while
(
1
)
{
memset
(
bufin
,
0
,
MAX_PAYLOAD_LENGTH
);
p
rrt
_p
acket
*
t
=
p
rrt_recv_feedback
(
sock_ptr
,
bufin
,
MAX_PAYLOAD_LENGTH
);
P
rrt
P
acket
*
t
=
P
rrt
Socket
_recv_feedback
(
sock_ptr
,
bufin
,
MAX_PAYLOAD_LENGTH
);
if
(
t
!=
NULL
)
{
delete_packet
(
t
);
PrrtPacket_destroy
(
t
);
}
usleep
(
1000
);
}
...
...
prrt/packet.c
View file @
4c5f38ef
...
...
@@ -5,7 +5,7 @@
#include
<netinet/in.h>
#include
"packet.h"
void
*
encode_general_header
(
void
*
buf_ptr
,
const
p
rrt
_p
acket
*
packet
);
void
*
encode_general_header
(
void
*
buf_ptr
,
const
P
rrt
P
acket
*
packet
);
void
*
encode_data_header
(
void
*
buf_ptr
,
void
*
payload
);
...
...
@@ -15,36 +15,36 @@ void *decode_data_header(void *buf_ptr, const void *payload_ptr);
void
*
decode_feedback_header
(
void
*
buf_ptr
,
void
*
payload_ptr
);
uint8_t
p
acket_type
(
p
rrt
_p
acket
*
packet_ptr
)
{
uint8_t
PrrtP
acket_type
(
P
rrt
P
acket
*
packet_ptr
)
{
return
(
uint8_t
)
((
packet_ptr
->
type_priority
>>
4
)
&
0x0F
);
}
uint8_t
p
acket_priority
(
p
rrt
_p
acket
*
packet_ptr
)
{
uint8_t
PrrtP
acket_priority
(
P
rrt
P
acket
*
packet_ptr
)
{
return
(
uint8_t
)
(
packet_ptr
->
type_priority
&
0x0F
);
}
uint16_t
p
acket_size
(
p
rrt
_p
acket
*
packet_ptr
)
{
uint16_t
PrrtP
acket_size
(
P
rrt
P
acket
*
packet_ptr
)
{
return
(
uint16_t
)
(
packet_ptr
->
payload_len
+
PRRT_PACKET_GENERAL_HEADER_SIZE
);
}
int
print_packet
(
p
rrt
_p
acket
*
packet_ptr
)
{
int
PrrtPacket_print
(
P
rrt
P
acket
*
packet_ptr
)
{
printf
(
" 0 1 2 3
\n
"
" 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
\n
"
"+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\n
"
);
uint8_t
type
=
p
acket_type
(
packet_ptr
);
uint8_t
type
=
PrrtP
acket_type
(
packet_ptr
);
printf
(
"| %5u | %5u | %13u | %29u |
\n
"
,
type
,
p
acket_priority
(
packet_ptr
),
packet_ptr
->
index
,
packet_ptr
->
seqno
);
printf
(
"| %5u | %5u | %13u | %29u |
\n
"
,
type
,
PrrtP
acket_priority
(
packet_ptr
),
packet_ptr
->
index
,
packet_ptr
->
seqno
);
printf
(
"+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\n
"
);
if
(
type
==
PACKET_TYPE_DATA
)
{
p
rrt
_p
acket
_d
ata
_p
ayload
*
payload
=
packet_ptr
->
payload
;
P
rrt
P
acket
D
ata
P
ayload
*
payload
=
packet_ptr
->
payload
;
printf
(
"| %61u |
\n
"
,
payload
->
timestamp
);
printf
(
"+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\n
"
);
printf
(
"| %29u | %29u |
\n
"
,
payload
->
group_round_trip_time
,
payload
->
packet_timeout
);
printf
(
"+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\n
"
);
}
else
if
(
type
==
PACKET_TYPE_FEEDBACK
)
{
p
rrt
_p
acket
_f
eedback
_p
ayload
*
payload
=
packet_ptr
->
payload
;
P
rrt
P
acket
F
eedback
P
ayload
*
payload
=
packet_ptr
->
payload
;
printf
(
"| %61u |
\n
"
,
payload
->
group_round_trip_time
);
printf
(
"+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\n
"
);
printf
(
"| %61u |
\n
"
,
payload
->
forward_trip_time
);
...
...
@@ -67,7 +67,7 @@ int print_packet(prrt_packet *packet_ptr) {
return
0
;
}
int
encode_packet
(
void
*
buf_ptr
,
uint16_t
buf_size
,
p
rrt
_p
acket
*
packet_ptr
)
{
int
PrrtPacket_encode
(
void
*
buf_ptr
,
uint16_t
buf_size
,
P
rrt
P
acket
*
packet_ptr
)
{
void
*
payload
=
packet_ptr
->
payload
;
if
(
buf_size
<
packet_ptr
->
payload_len
+
PRRT_PACKET_GENERAL_HEADER_SIZE
)
{
...
...
@@ -77,7 +77,7 @@ int encode_packet(void *buf_ptr, uint16_t buf_size, prrt_packet *packet_ptr) {
buf_ptr
=
encode_general_header
(
buf_ptr
,
packet_ptr
);
uint8_t
type
=
p
acket_type
(
packet_ptr
);
uint8_t
type
=
PrrtP
acket_type
(
packet_ptr
);
if
(
type
==
PACKET_TYPE_DATA
)
{
buf_ptr
=
encode_data_header
(
buf_ptr
,
payload
);
memcpy
(
buf_ptr
,
payload
+
PRRT_PACKET_DATA_HEADER_SIZE
,
packet_ptr
->
payload_len
-
PRRT_PACKET_DATA_HEADER_SIZE
);
...
...
@@ -92,7 +92,7 @@ int encode_packet(void *buf_ptr, uint16_t buf_size, prrt_packet *packet_ptr) {
}
void
*
encode_feedback_header
(
void
*
buf_ptr
,
void
*
payload
)
{
p
rrt
_p
acket
_f
eedback
_p
ayload
*
feedback_payload
=
payload
;
P
rrt
P
acket
F
eedback
P
ayload
*
feedback_payload
=
payload
;
uint32_t
*
receiver_ip
=
(
uint32_t
*
)
buf_ptr
;
*
receiver_ip
=
htonl
(
feedback_payload
->
receiver_addr
);
...
...
@@ -138,7 +138,7 @@ void *encode_feedback_header(void *buf_ptr, void *payload) {
}
void
*
encode_data_header
(
void
*
buf_ptr
,
void
*
payload
)
{
p
rrt
_p
acket
_d
ata
_p
ayload
*
data_payload
=
payload
;
P
rrt
P
acket
D
ata
P
ayload
*
data_payload
=
payload
;
uint32_t
*
timestamp
=
(
uint32_t
*
)
buf_ptr
;
*
timestamp
=
htonl
(
data_payload
->
timestamp
);
...
...
@@ -162,7 +162,7 @@ void *encode_data_header(void *buf_ptr, void *payload) {
return
buf_ptr
;
}
void
*
encode_general_header
(
void
*
buf_ptr
,
const
p
rrt
_p
acket
*
packet
)
{
void
*
encode_general_header
(
void
*
buf_ptr
,
const
P
rrt
P
acket
*
packet
)
{
uint8_t
*
type_priority
=
(
uint8_t
*
)
buf_ptr
;
*
type_priority
=
packet
->
type_priority
;
buf_ptr
+=
1
;
...
...
@@ -178,7 +178,7 @@ void *encode_general_header(void *buf_ptr, const prrt_packet *packet) {
return
buf_ptr
;
}
int
decode_packet
(
void
*
buf_ptr
,
uint16_t
buf_size
,
p
rrt
_p
acket
*
packet_ptr
)
{
int
PrrtPacket_decode
(
void
*
buf_ptr
,
uint16_t
buf_size
,
P
rrt
P
acket
*
packet_ptr
)
{
uint32_t
payload_len
=
(
uint32_t
)
(
buf_size
-
PRRT_PACKET_GENERAL_HEADER_SIZE
);
packet_ptr
->
type_priority
=
*
(
uint8_t
*
)
buf_ptr
;
buf_ptr
+=
1
;
...
...
@@ -193,10 +193,10 @@ int decode_packet(void *buf_ptr, uint16_t buf_size, prrt_packet *packet_ptr) {
packet_ptr
->
payload
=
payload_buffer
;
packet_ptr
->
payload_len
=
payload_len
;
if
(
p
acket_type
(
packet_ptr
)
==
PACKET_TYPE_DATA
)
{
if
(
PrrtP
acket_type
(
packet_ptr
)
==
PACKET_TYPE_DATA
)
{
buf_ptr
=
decode_data_header
(
buf_ptr
,
payload_buffer
);
memcpy
(
payload_buffer
+
PRRT_PACKET_DATA_HEADER_SIZE
,
buf_ptr
,
payload_len
-
PRRT_PACKET_DATA_HEADER_SIZE
);
}
else
if
(
p
acket_type
(
packet_ptr
)
==
PACKET_TYPE_FEEDBACK
)
{
}
else
if
(
PrrtP
acket_type
(
packet_ptr
)
==
PACKET_TYPE_FEEDBACK
)
{
buf_ptr
=
decode_feedback_header
(
buf_ptr
,
payload_buffer
);
memcpy
(
payload_buffer
+
PRRT_PACKET_FEEDBACK_HEADER_SIZE
,
buf_ptr
,
payload_len
-
PRRT_PACKET_FEEDBACK_HEADER_SIZE
);
}
else
{
...
...
@@ -206,7 +206,7 @@ int decode_packet(void *buf_ptr, uint16_t buf_size, prrt_packet *packet_ptr) {
}
void
*
decode_feedback_header
(
void
*
buf_ptr
,
void
*
payload_ptr
)
{
p
rrt
_p
acket
_f
eedback
_p
ayload
*
feedback_payload
=
(
p
rrt
_p
acket
_f
eedback
_p
ayload
*
)
payload_ptr
;
P
rrt
P
acket
F
eedback
P
ayload
*
feedback_payload
=
(
P
rrt
P
acket
F
eedback
P
ayload
*
)
payload_ptr
;
uint32_t
*
receiver_addr
=
(
uint32_t
*
)
buf_ptr
;
feedback_payload
->
receiver_addr
=
ntohl
(
*
receiver_addr
);
...
...
@@ -252,7 +252,7 @@ void *decode_feedback_header(void *buf_ptr, void *payload_ptr) {
}
void
*
decode_data_header
(
void
*
buf_ptr
,
const
void
*
payload_ptr
)
{
p
rrt
_p
acket
_d
ata
_p
ayload
*
data_payload
=
(
p
rrt
_p
acket
_d
ata
_p
ayload
*
)
payload_ptr
;
P
rrt
P
acket
D
ata
P
ayload
*
data_payload
=
(
P
rrt
P
acket
D
ata
P
ayload
*
)
payload_ptr
;
uint32_t
*
timestamp
=
(
uint32_t
*
)
buf_ptr
;
data_payload
->
timestamp
=
ntohl
(
*
timestamp
);
...
...
@@ -276,7 +276,7 @@ void *decode_data_header(void *buf_ptr, const void *payload_ptr) {
return
buf_ptr
;
}
int
delete_packet
(
p
rrt
_p
acket
*
packet_ptr
)
{
int
PrrtPacket_destroy
(
P
rrt
P
acket
*
packet_ptr
)
{
if
(
packet_ptr
->
payload
!=
NULL
)
{
free
(
packet_ptr
->
payload
);
}
...
...
@@ -285,17 +285,18 @@ int delete_packet(prrt_packet *packet_ptr) {
}
// PACKET SPECIFIC CODE
int
create_packet_data
(
prrt_packet
*
packet_ptr
,
uint8_t
priority
,
const
void
*
data_ptr
,
unsigned
long
data_len
)
{
uint32_t
payload_length
=
(
uint32_t
)
(
data_len
+
sizeof
(
prrt_packet_data_payload
));
int
PrrtPacket_create_data_packet
(
PrrtPacket
*
packet_ptr
,
uint8_t
priority
,
const
void
*
data_ptr
,
unsigned
long
data_len
)
{
uint32_t
payload_length
=
(
uint32_t
)
(
data_len
+
sizeof
(
PrrtPacketDataPayload
));
packet_ptr
->
type_priority
=
PACKET_TYPE_DATA
<<
4
;
packet_ptr
->
type_priority
|=
priority
&
0x0F
;
packet_ptr
->
index
=
17
;
// TODO: replace with sensible value
packet_ptr
->
seqno
=
4711
;
// TODO: replace with sensible value
void
*
content_buf
=
malloc
(
sizeof
(
p
rrt
_p
acket
_d
ata
_p
ayload
)
+
data_len
);
void
*
content_buf
=
malloc
(
sizeof
(
P
rrt
P
acket
D
ata
P
ayload
)
+
data_len
);
p
rrt
_p
acket
_d
ata
_p
ayload
*
source_payload
=
content_buf
;
P
rrt
P
acket
D
ata
P
ayload
*
source_payload
=
content_buf
;
struct
timeval
tv
;
gettimeofday
(
&
tv
,
NULL
);
...
...
@@ -308,22 +309,24 @@ int create_packet_data(prrt_packet *packet_ptr, uint8_t priority, const void *da
source_payload
->
feedback_timeout
=
170
;
// TODO: payload->feedback_timer
packet_ptr
->
payload
=
content_buf
;
memcpy
(
content_buf
+
sizeof
(
p
rrt
_p
acket
_d
ata
_p
ayload
),
data_ptr
,
data_len
);
memcpy
(
content_buf
+
sizeof
(
P
rrt
P
acket
D
ata
P
ayload
),
data_ptr
,
data_len
);
packet_ptr
->
payload_len
=
payload_length
;
return
0
;
}
prrt_packet
*
create_packet_feedback
(
uint8_t
priority
,
uint8_t
index
,
uint16_t
seqno
,
uint32_t
round_trip_time
,
uint32_t
forward_trip_time
,
uint32_t
packet_loss_rate
,
uint16_t
gap
,
uint16_t
ngap
,
uint16_t
burst
,
uint16_t
nburst
,
uint32_t
bandwidth
,
uint32_t
buffer_feedback
)
{
prrt_packet
*
packet_ptr
=
malloc
(
sizeof
(
prrt_packet
));
PrrtPacket
*
PrrtPacket_create_feedback_packet
(
uint8_t
priority
,
uint8_t
index
,
uint16_t
seqno
,
uint32_t
round_trip_time
,
uint32_t
forward_trip_time
,
uint32_t
packet_loss_rate
,
uint16_t
gap
,
uint16_t
ngap
,
uint16_t
burst
,
uint16_t
nburst
,
uint32_t
bandwidth
,
uint32_t
buffer_feedback
)
{
PrrtPacket
*
packet_ptr
=
malloc
(
sizeof
(
PrrtPacket
));
packet_ptr
->
type_priority
=
PACKET_TYPE_FEEDBACK
<<
4
;
packet_ptr
->
type_priority
|=
priority
&
0x0F
;
packet_ptr
->
index
=
index
;
packet_ptr
->
seqno
=
seqno
;
p
rrt
_p
acket
_f
eedback
_p
ayload
*
payload
=
malloc
(
sizeof
(
p
rrt
_p
acket
_f
eedback
_p
ayload
));
P
rrt
P
acket
F
eedback
P
ayload
*
payload
=
malloc
(
sizeof
(
P
rrt
P
acket
F
eedback
P
ayload
));
payload
->
group_round_trip_time
=
round_trip_time
;
payload
->
forward_trip_time
=
forward_trip_time
;
...
...
@@ -336,7 +339,7 @@ prrt_packet *create_packet_feedback(uint8_t priority, uint8_t index, uint16_t se
payload
->
buffer_feedback
=
buffer_feedback
;
packet_ptr
->
payload
=
(
void
*
)
payload
;
packet_ptr
->
payload_len
=
(
uint32_t
)
(
sizeof
(
p
rrt
_p
acket
_f
eedback
_p
ayload
));
packet_ptr
->
payload_len
=
(
uint32_t
)
(
sizeof
(
P
rrt
P
acket
F
eedback
P
ayload
));
return
packet_ptr
;
}
\ No newline at end of file
prrt/packet.h
View file @
4c5f38ef
...
...
@@ -5,8 +5,10 @@
#define PACKET_TYPE_DATA 0
#define PACKET_TYPE_REPETITION 1
#define PACKET_TYPE_
PARIT
Y 2
#define PACKET_TYPE_
REDUNDANC
Y 2
#define PACKET_TYPE_FEEDBACK 3
#define PACKET_TYPE_PRE_REDUNDANCY 4
#define PACKET_TYPE_CHANNEL_FEEDBACK 5
#define PRRT_PACKET_GENERAL_HEADER_SIZE 4
typedef
struct
{
...
...
@@ -15,7 +17,7 @@ typedef struct {
uint16_t
seqno
;
void
*
payload
;
uint32_t
payload_len
;
}
p
rrt
_p
acket
;
}
P
rrt
P
acket
;
#define PRRT_PACKET_DATA_HEADER_SIZE 12
typedef
struct
{
...
...
@@ -24,7 +26,7 @@ typedef struct {
uint16_t
packet_timeout
;
uint16_t
decoding_timeout
;
uint16_t
feedback_timeout
;
}
p
rrt
_p
acket
_d
ata
_p
ayload
;
}
P
rrt
P
acket
D
ata
P
ayload
;
# define PRRT_PACKET_FEEDBACK_HEADER_SIZE 32
typedef
struct
{
...
...
@@ -38,33 +40,29 @@ typedef struct {
uint16_t
nburst
;
uint32_t
bandwidth_estimate
;
uint32_t
buffer_feedback
;
}
p
rrt
_p
acket
_f
eedback
_p
ayload
;
}
P
rrt
P
acket
F
eedback
P
ayload
;
uint8_t
p
acket_type
(
p
rrt
_p
acket
*
packet_ptr
);
uint8_t
p
acket_priority
(
p
rrt
_p
acket
*
packet_ptr
);
uint16_t
p
acket_size
(
p
rrt
_p
acket
*
packet_ptr
);
int
print_packet
(
p
rrt
_p
acket
*
packet_ptr
);
uint8_t
PrrtP
acket_type
(
P
rrt
P
acket
*
packet_ptr
);
uint8_t
PrrtP
acket_priority
(
P
rrt
P
acket
*
packet_ptr
);
uint16_t
PrrtP
acket_size
(
P
rrt
P
acket
*
packet_ptr
);
int
PrrtPacket_print
(
P
rrt
P
acket
*
packet_ptr
);
// CREATE: PRRT_PACKET
// ENCODE: PRRT_PACKET -> BYTES
// DECODE: BYTES -> PRRT_PACKET
// DE
LETE
:
// DE
STROY
:
int
decode_packet
(
void
*
buf_ptr
,
uint16_t
buf_size
,
prrt_packet
*
packet_ptr
);
int
PrrtPacket_create_data_packet
(
PrrtPacket
*
packet_ptr
,
uint8_t
priority
,
const
void
*
data_ptr
,
unsigned
long
data_len
);
int
create_packet_data
(
prrt_packet
*
packet_ptr
,
uint8_t
priority
,
const
void
*
data_ptr
,
unsigned
long
data_len
);
int
encode_packet
(
void
*
buf_ptr
,
uint16_t
buf_size
,
prrt_packet
*
packet_ptr
);
int
delete_packet
(
prrt_packet
*
packet_ptr
);
PrrtPacket
*
PrrtPacket_create_feedback_packet
(
uint8_t
priority
,
uint8_t
index
,
uint16_t
seqno
,
uint32_t
round_trip_time
,
uint32_t
forward_trip_time
,
uint32_t
packet_loss_rate
,
uint16_t
gap
,
uint16_t
ngap
,
uint16_t
burst
,
uint16_t
nburst
,
uint32_t
bandwidth
,
uint32_t
buffer_feedback
);
int
create_packet_repetition
(
prrt_packet
packet
,
uint8_t
priority
);
int
create_packet_parity
(
prrt_packet
packet
,
uint8_t
priority
);
prrt_packet
*
create_packet_feedback
(
uint8_t
priority
,
uint8_t
index
,
uint16_t
seqno
,
uint32_t
round_trip_time
,
uint32_t
forward_trip_time
,
uint32_t
packet_loss_rate
,
uint16_t
gap
,
uint16_t
ngap
,
uint16_t
burst
,
uint16_t
nburst
,
uint32_t
bandwidth
,
uint32_t
buffer_feedback
);
int
encode_packet_feedback
(
void
*
buf_ptr
,
uint16_t
buf_size
,
prrt_packet
*
pkt_ptr
);
int
decode_packet_feedback
(
void
*
buf_ptr
,
uint16_t
buf_size
,
prrt_packet
*
packet_ptr
);
int
PrrtPacket_decode
(
void
*
buf_ptr
,
uint16_t
buf_size
,
PrrtPacket
*
packet_ptr
);
int
PrrtPacket_encode
(
void
*
buf_ptr
,
uint16_t
buf_size
,
PrrtPacket
*
packet_ptr
);
int
PrrtPacket_destroy
(
PrrtPacket
*
packet_ptr
);
#endif //PRRT_FRAME_H
prrt/socket.c
View file @
4c5f38ef
...
...
@@ -10,7 +10,7 @@
#include
"feedback_receiver.h"
#include
"data_transmitter.h"
int
p
rrt
_create_socket
(
p
rrt
_s
ocket
*
sock_ptr
,
uint16_t
port
,
uint8_t
is_sender
)
{
int
P
rrt
Socket_create
(
P
rrt
S
ocket
*
sock_ptr
,
uint16_t
port
,
uint8_t
is_sender
)
{
// Create Data Socket
if
((
sock_ptr
->
fd_data
=
socket
(
AF_INET
,
SOCK_DGRAM
,
0
))
<
0
)
{
perror
(
"cannot create socket"
);
...
...
@@ -70,8 +70,8 @@ int prrt_create_socket(prrt_socket *sock_ptr, uint16_t port, uint8_t is_sender)
return
0
;
}
int
p
rrt_connect
(
p
rrt
_s
ocket
*
sock_ptr
,
char
*
host
,
uint16_t
port
)
{
p
rrt
_r
eceiver
recv
=
{
host
,
port
};
int
P
rrt
Socket
_connect
(
P
rrt
S
ocket
*
sock_ptr
,
char
*
host
,
uint16_t
port
)
{
P
rrt
R
eceiver
recv
=
{
host
,
port
};
if
(
sock_ptr
->
receiver_len
<
PRRT_MAX_RECEIVER_COUNT
)
{
sock_ptr
->
receivers
[
sock_ptr
->
receiver_len
]
=
recv
;
...
...
@@ -83,11 +83,11 @@ int prrt_connect(prrt_socket *sock_ptr, char *host, uint16_t port) {
return
0
;
}
int
p
rrt_send
(
p
rrt
_s
ocket
*
sock_ptr
,
const
void
*
data
,
size_t
data_len
)
{
int
P
rrt
Socket
_send
(
P
rrt
S
ocket
*
sock_ptr
,
const
void
*
data
,
size_t
data_len
)
{
pthread_mutex_lock
(
&
sock_ptr
->
out_queue_filled_mutex
);
p
rrt
_p
acket
*
packet
=
malloc
(
sizeof
(
p
rrt
_p
acket
));
create_packet
_data
(
packet
,
5
,
data
,
data_len
);
P
rrt
P
acket
*
packet
=
malloc
(
sizeof
(
P
rrt
P
acket
));
PrrtPacket_
create_
data_
packet
(
packet
,
5
,
data
,
data_len
);
List_push
(
sock_ptr
->
out_queue
,
packet
);
pthread_cond_signal
(
&
sock_ptr
->
out_queue_filled_cv
);
...
...
@@ -96,7 +96,7 @@ int prrt_send(prrt_socket *sock_ptr, const void *data, size_t data_len) {
return
0
;
}
p
rrt
_p
acket
*
p
rrt_recv
(
p
rrt
_s
ocket
*
sock_ptr
)
{
P
rrt
P
acket
*
P
rrt
Socket
_recv
(
P
rrt
S
ocket
*
sock_ptr
)
{
unsigned
char
buffer
[
MAX_PAYLOAD_LENGTH
];
// RECEIVE DATA
...
...
@@ -108,8 +108,8 @@ prrt_packet *prrt_recv(prrt_socket *sock_ptr) {
uint16_t
remote_port
=
ntohs
(
remote
.
sin_port
);
char
*
remote_host
=
inet_ntoa
(
remote
.
sin_addr
);
p
rrt
_p
acket
*
packet
=
malloc
(
sizeof
(
p
rrt
_p
acket
));
decode_packet
(
buffer
,
(
uint16_t
)
n
,
packet
);
P
rrt
P
acket
*
packet
=
malloc
(
sizeof
(
P
rrt
P
acket
));
PrrtPacket_decode
(
buffer
,
(
uint16_t
)
n
,
packet
);
// REPLY
struct
sockaddr_in
targetaddr
;
...
...
@@ -121,11 +121,11 @@ prrt_packet *prrt_recv(prrt_socket *sock_ptr) {
hp
=
gethostbyname
(
remote_host
);
memcpy
((
void
*
)
&
targetaddr
.
sin_addr
,
hp
->
h_addr_list
[
0
],
(
size_t
)
hp
->
h_length
);
p
rrt
_p
acket
*
feedback_pkt_ptr
=
create_packet
_feedback
(
0
,
19
,
4715
,
7
,
3
,
50
,
4
,
6
,
8
,
9
,
5
,
1
);
P
rrt
P
acket
*
feedback_pkt_ptr
=
PrrtPacket_create
_feedback
_packet
(
0
,
19
,
4715
,
7
,
3
,
50
,
4
,
6
,
8
,
9
,
5
,
1
);
uint8_t
buf
[
MAX_PAYLOAD_LENGTH
];
uint32_t
length
=
p
acket_size
(
feedback_pkt_ptr
);
uint32_t
length
=
PrrtP
acket_size
(
feedback_pkt_ptr
);
if
(
encode_packet
(
buf
,
MAX_PAYLOAD_LENGTH
,
feedback_pkt_ptr
)
<
0
)
{
if
(
PrrtPacket_encode
(
buf
,
MAX_PAYLOAD_LENGTH
,
feedback_pkt_ptr
)
<
0
)
{
perror
(
"BUF too small."
);
}
else
{
if
((
sendto
(
sock_ptr
->
fd_feedback
,
buf
,
length
,
0
,
(
struct
sockaddr
*
)
&
targetaddr
,
sizeof
(
targetaddr
))
<
0
))
{
...
...
@@ -137,7 +137,7 @@ prrt_packet *prrt_recv(prrt_socket *sock_ptr) {
return
packet
;
}
int
p
rrt
_close_socket
(
p
rrt
_s
ocket
*
sock_ptr
)
{
int
P
rrt
Socket_close
(
P
rrt
S
ocket
*
sock_ptr
)
{
// TODO: shut down threads;
// TODO: clean up all receivers
...
...
@@ -151,7 +151,7 @@ int prrt_close_socket(prrt_socket *sock_ptr) {
return
0
;
}
p
rrt
_p
acket
*
p
rrt_recv_feedback
(
p
rrt
_s
ocket
*
sock_ptr
,
void
*
bufin
,
size_t
length
)
{
P
rrt
P
acket
*
P
rrt
Socket
_recv_feedback
(
P
rrt
S
ocket
*
sock_ptr
,
void
*
bufin
,
size_t
length
)
{
ssize_t
n
;
struct
sockaddr_in
remote
;
socklen_t
addrlen
=
sizeof
(
remote
);
...
...
@@ -165,7 +165,7 @@ prrt_packet * prrt_recv_feedback(prrt_socket *sock_ptr, void *bufin, size_t leng
char
*
remote_host
=
inet_ntoa
(
remote
.
sin_addr
);
printf
(
"RECV FEEDBACK: %s:%d
\n
"
,
remote_host
,
remote_port
);
p
rrt
_p
acket
*
packet_ptr
=
malloc
(
sizeof
(
p
rrt
_p
acket
));
decode_packet
(
bufin
,
(
uint16_t
)
n
,
packet_ptr
);
P
rrt
P
acket
*
packet_ptr
=
malloc
(
sizeof
(
P
rrt
P
acket
));
PrrtPacket_decode
(
bufin
,
(
uint16_t
)
n
,
packet_ptr
);
return
packet_ptr
;
}
prrt/socket.h
View file @
4c5f38ef
...
...
@@ -12,7 +12,7 @@
typedef
struct
{
char
*
host_name
;
uint16_t
port
;
}
p
rrt
_r
eceiver
;
}
P
rrt
R
eceiver
;
typedef
struct
{
int
fd_data
;
...
...
@@ -24,21 +24,21 @@ typedef struct {
pthread_cond_t
out_queue_filled_cv
;
List
*
out_queue
;
p
rrt
_r
eceiver
receivers
[
PRRT_MAX_RECEIVER_COUNT
];
P
rrt
R
eceiver
receivers
[
PRRT_MAX_RECEIVER_COUNT
];
int
receiver_len
;
uint16_t
packets_count
;
uint16_t
seqno_source
;
uint16_t
seqno_repetition
;
uint16_t
seqno_parity
;
uint16_t
seqno_feedback
;
}
p
rrt
_s
ocket
;
}
P
rrt
S
ocket
;
int
p
rrt
_create_socket
(
p
rrt
_s
ocket
*
sock_ptr
,
uint16_t
port
,
uint8_t
is_sender
);
int
p
rrt
_close_socket
(
p
rrt
_s
ocket
*
sock_ptr
);
int
p
rrt_connect
(
p
rrt
_s
ocket
*
sock_ptr
,
char
*
host
,
uint16_t
port
);
int
p
rrt_send
(
p
rrt
_s
ocket
*
sock_ptr
,
const
void
*
data
,
size_t
data_len
);
p
rrt
_p
acket
*
p
rrt_recv
(
p
rrt
_s
ocket
*
sock_ptr
);
p
rrt
_p
acket
*
p
rrt_recv_feedback
(
p
rrt
_s
ocket
*
sock_ptr
,
void
*
bufin
,
size_t
length
);
int
P
rrt
Socket_create
(
P
rrt
S
ocket
*
sock_ptr
,
uint16_t
port
,
uint8_t
is_sender
);
int
P
rrt
Socket_close
(
P
rrt
S
ocket
*
sock_ptr
);
int
P
rrt
Socket
_connect
(
P
rrt
S
ocket
*
sock_ptr
,
char
*
host
,
uint16_t
port
);
int
P
rrt
Socket
_send
(
P
rrt
S
ocket
*
sock_ptr
,
const
void
*
data
,
size_t
data_len
);
P
rrt
P
acket
*
P
rrt
Socket
_recv
(
P
rrt
S
ocket
*
sock_ptr
);
P
rrt
P
acket
*
P
rrt
Socket
_recv_feedback
(
P
rrt
S
ocket
*
sock_ptr
,
void
*
bufin
,
size_t
length
);
#endif // PRRT_SOCKET_H
receiver.c
View file @
4c5f38ef
...
...
@@ -12,17 +12,17 @@ int main(int argc, char* const argv[]) {
uint16_t
port
=
(
uint16_t
)
atoi
(
argv
[
1
]);
p
rrt
_s
ocket
sock
;
p
rrt
_p
acket
*
pkt
;
P
rrt
S
ocket
sock
;
P
rrt
P
acket
*
pkt
;
printf
(
"PRRT - RECEIVER
\n
"
);
if
(
p
rrt_create
_socket
(
&
sock
,
port
,
0
)
<
0
)
{
if
(
P
rrt
Socket
_create
(
&
sock
,
port
,
0
)
<
0
)
{
perror
(
"could not create socket"
);
return
0
;
}
while
(
1
)
{
pkt
=
p
rrt_recv
(
&
sock
);
pkt
=
P
rrt
Socket
_recv
(
&
sock
);
if
(
pkt
==
NULL
)
{
perror
(
"Error receiving data"
);
break
;
...
...
@@ -36,7 +36,7 @@ int main(int argc, char* const argv[]) {
usleep
(
1
);
}
p
rrt_close
_socket
(
&
sock
);
P
rrt
Socket
_close
(
&
sock
);
pthread_exit
(
NULL
);
...
...
sender.c
View file @
4c5f38ef
...
...
@@ -11,31 +11,31 @@ int main(int argc, char* const argv) {
}
uint16_t
local_port
=
6000
;
p
rrt
_s
ocket
sock
=
{};
P
rrt
S
ocket
sock
=
{};
printf
(
"PRRT - SENDER
\n
"
);
if
(
p
rrt_create
_socket
(
&
sock
,
local_port
,
TRUE
)
<
0
)
{
if
(
P
rrt
Socket
_create
(
&
sock
,
local_port
,
TRUE
)
<
0
)
{
perror
(
"socket failed"
);
return
0
;
}
char
*
remote_host
=
"localhost"
;
uint16_t
remote_port
=
5000
;
p
rrt_connect
(
&
sock
,
remote_host
,
remote_port
);
P
rrt
Socket
_connect
(
&
sock
,
remote_host
,
remote_port
);
char
*
remote_host2
=
"localhost"
;
uint16_t
remote_port2
=
5004
;
p
rrt_connect
(
&
sock
,
remote_host2
,
remote_port2
);
P
rrt
Socket
_connect
(
&
sock
,
remote_host2
,
remote_port2
);
printf
(
"SENDING
\n
"
);
for
(
i
=
0
;
i
<
5
;
i
++
)
{
char
buf
[
30
];
sprintf
(
buf
,
"this is a message %d"
,
i
);
p
rrt_send
(
&
sock
,
buf
,
strlen
(
buf
));
P
rrt
Socket
_send
(
&
sock
,
buf
,
strlen
(
buf
));
}
usleep
(
1000
*
1000
);
p
rrt_close
_socket
(
&
sock
);
P
rrt
Socket
_close
(
&
sock
);
printf
(
"COMPLETELY CLOSED
\n
"
);
return
0
;
}
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment