Consider the following Promela model for the Alternating Bit Protocol /* Alternating Bit Protocol, cf. Holzmann 1993, Tutorial */ #define N 2 #define MAX 8 #define FETCH mt = (mt+1)%MAX #define ACCEPT printf("ACCEPT %d\n", mr); assert(mr==(last_mr+1)%MAX) mtype = {data, ack, error} proctype lower_layer(chan fromS, toS, fromR, toR) { byte d; bit b; do ::fromS?data(d,b) -> progress0: if :: toR!data(d,b) /* correct */ :: toR!error(0,0) /* distorted */ fi ::fromR?ack(b) -> progress1: if :: toS!ack(b) :: toS!error(0) fi od } proctype Sender(chan in, out) { byte mt; /* message data */ bit at; /* alternation bit transmitted */ bit ar; /* alternation bit received */ FETCH; /* get a new message */ out!data(mt,at); /* send it */ do ::in?ack(ar) -> /* await response */ if ::(ar == at) -> /* correct send */ FETCH; /* get a new message */ at=1-at /* toggle bit */ ::else -> /* there was a send error */ skip /* don’t fetch */ fi; out!data(mt,at) ::in?error(ar) -> /* recv error */ out!data(mt,at) od } proctype Receiver(chan in, out) { byte mr; /* message data received */ byte last_mr; /* mr of last error-free msg */ bit ar; /* alternation bit received */ bit last_ar=1; /* ar of last error-free msg */ do ::in?error(mr,ar) -> out!ack(last_ar); ::in?data(mr,ar) -> out!ack(ar); if ::(ar == last_ar) -> skip ::(ar != last_ar) -> progress: ACCEPT; last_ar=ar; last_mr=mr fi od } init { chan fromS = [N] of { byte, byte, bit }; chan toR = [N] of { byte, byte, bit }; chan fromR = [N] of { byte, bit }; chan toS = [N] of { byte, bit }; atomic { run Sender(toS, fromS); run Receiver(toR, fromR); run lower_layer(fromS, toS, fromR, toR) } } Change the Promela model of the lower layer such that messages might get lost. Extend the communication protocol such that messages are retransmitted after they were lost. Simulate and verify your protocol. Extend your protocol such that it also works when messages are delivered out of order. Introduce sequence numbers and extend the channel model. Simulate and verify your protocol
Consider the following Promela model for the Alternating Bit Protocol
/* Alternating Bit Protocol,
cf. Holzmann 1993, Tutorial */
#define N 2
#define MAX 8
#define FETCH mt = (mt+1)%MAX
#define ACCEPT printf("ACCEPT %d\n", mr); assert(mr==(last_mr+1)%MAX)
mtype = {data, ack, error}
proctype lower_layer(chan fromS, toS, fromR, toR)
{ byte d; bit b;
do
::fromS?data(d,b) ->
progress0:
if
:: toR!data(d,b) /* correct */
:: toR!error(0,0) /* distorted */
fi
::fromR?ack(b) ->
progress1:
if
:: toS!ack(b)
:: toS!error(0)
fi
od
}
proctype Sender(chan in, out)
{ byte mt; /* message data */
bit at; /* alternation bit transmitted */
bit ar; /* alternation bit received */
FETCH; /* get a new message */
out!data(mt,at); /* send it */
do
::in?ack(ar) -> /* await response */
if
::(ar == at) -> /* correct send */
FETCH; /* get a new message */
at=1-at /* toggle bit */
::else -> /* there was a send error */
skip /* don’t fetch */
fi;
out!data(mt,at)
::in?error(ar) -> /* recv error */
out!data(mt,at)
od
}
proctype Receiver(chan in, out)
{ byte mr; /* message data received */
byte last_mr; /* mr of last error-free msg */
bit ar; /* alternation bit received */
bit last_ar=1; /* ar of last error-free msg */
do
::in?error(mr,ar) ->
out!ack(last_ar);
::in?data(mr,ar) ->
out!ack(ar);
if
::(ar == last_ar) ->
skip
::(ar != last_ar) ->
progress: ACCEPT;
last_ar=ar;
last_mr=mr
fi
od
}
init {
chan fromS = [N] of { byte, byte, bit };
chan toR = [N] of { byte, byte, bit };
chan fromR = [N] of { byte, bit };
chan toS = [N] of { byte, bit };
atomic {
run Sender(toS, fromS);
run Receiver(toR, fromR);
run lower_layer(fromS, toS, fromR, toR)
}
}
- Change the Promela model of the lower layer such that messages might get lost.
- Extend the communication protocol such that messages are retransmitted after they were lost. Simulate and verify your protocol.
- Extend your protocol such that it also works when messages are delivered out of order. Introduce sequence numbers and extend the channel model. Simulate and verify your protocol
Trending now
This is a popular solution!
Step by step
Solved in 2 steps