Commit 33821404 authored by Aurelio Colosimo's avatar Aurelio Colosimo

msg sending implemented

msg_issue_xxx functions declared, implemented and used
See that pp_get_tstamp now returns a TimeInternal struct.
Actually timestamp struct might be defined outside of ieee_1588_types.h
file, since it is not defined in the spec. For the moment, I leave
it there, but in the future it must be redefined for our purposes (and
in standard_c_notation)
parent 2e755840
......@@ -28,9 +28,9 @@ void *pp_memcpy(void *dest, const void *src, int count)
return dest;
}
void pp_get_stamp(uint32_t *sptr)
void pp_get_tstamp(TimeInternal *t)
{
*sptr = htonl(sys_time(0));
/* FIXME tstamp *sptr = htonl(sys_time(0));*/
}
int pp_memcmp(const void *cs, const void *ct, int count)
......
......@@ -32,7 +32,7 @@ void *pp_memset(void *s, int c, int count)
return memset(s, c, count);
}
void pp_get_stamp(uint32_t *sptr)
void pp_get_tstamp(TimeInternal *t)
{
*sptr = htonl(time(NULL));
/*FIXME tstamp *sptr = htonl(time(NULL)); */
}
......@@ -3,8 +3,7 @@
*/
/* Timer interface for GNU/Linux (and most likely other posix systems */
#include <sys/time.h>
#include <time.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
......@@ -44,7 +43,7 @@ extern int posix_timer_init(struct pp_instance *ppi)
extern int posix_timer_start(uint32_t interval, struct pp_timer *tm)
{
pp_get_stamp(&tm->start);
time((time_t*)&tm->start);
tm->interval = interval;
return 0;
......@@ -67,7 +66,7 @@ extern int posix_timer_expired(struct pp_timer *tm)
return 0;
}
pp_get_stamp(&now);
time((time_t*)&now);
if (tm->start + tm->interval < now)
return 1;
......
......@@ -29,7 +29,7 @@ void *pp_memcpy(void *dest, const void *src, int count)
return dest;
}
void pp_get_stamp(uint32_t *sptr)
void pp_get_tstamp(uint32_t *sptr)
{
*sptr = htonl(spec_time());
}
......
......@@ -220,34 +220,45 @@ extern UInteger8 bmc(struct pp_instance *ppi,
extern void msg_pack_header(struct pp_instance *ppi, void *buf);
extern void msg_unpack_header(struct pp_instance *ppi, void *buf);
void *msg_copy_header(MsgHeader *dest, MsgHeader *src);
extern void msg_pack_sync(struct pp_instance *ppi, void *buf,
Timestamp *orig_tstamp);
extern void msg_pack_sync(struct pp_instance *ppi, Timestamp *orig_tstamp);
extern void msg_unpack_sync(void *buf, MsgSync *sync);
extern void msg_pack_announce(struct pp_instance *ppi, void *buf);
extern void msg_pack_announce(struct pp_instance *ppi);
extern void msg_unpack_announce(void *buf, MsgAnnounce *ann);
extern void msg_pack_follow_up(struct pp_instance *ppi, void *buf,
extern void msg_pack_follow_up(struct pp_instance *ppi,
Timestamp *prec_orig_tstamp);
extern void msg_unpack_follow_up(void *buf, MsgFollowUp *flwup);
extern void msg_pack_pdelay_req(struct pp_instance *ppi, void *buf,
extern void msg_pack_pdelay_req(struct pp_instance *ppi,
Timestamp *orig_tstamp);
extern void msg_unpack_pdelay_req(void *buf, MsgPDelayReq *pdelay_req);
extern void msg_pack_delay_req(struct pp_instance *ppi, void *buf,
extern void msg_pack_delay_req(struct pp_instance *ppi,
Timestamp *orig_tstamp);
extern void msg_unpack_delay_req(void *buf, MsgDelayReq *delay_req);
extern void msg_pack_delay_resp(struct pp_instance *ppi, void *buf,
extern void msg_pack_delay_resp(struct pp_instance *ppi,
MsgHeader *hdr, Timestamp *rcv_tstamp);
extern void msg_unpack_delay_resp(void *buf, MsgDelayResp *resp);
extern void msg_pack_pdelay_resp(struct pp_instance *ppi, void *buf,
extern void msg_pack_pdelay_resp(struct pp_instance *ppi,
MsgHeader *hdr, Timestamp *req_rec_tstamp);
extern void msg_unpack_pdelay_resp(void *buf, MsgPDelayResp *presp);
extern void msg_pack_pdelay_resp_followup(struct pp_instance *ppi, void *buf,
extern void msg_pack_pdelay_resp_followup(struct pp_instance *ppi,
MsgHeader *hdr,
Timestamp *resp_orig_tstamp);
extern void msg_unpack_pdelay_resp_followup(void *buf,
MsgPDelayRespFollowUp *presp_follow);
/* each of them returns 0 if no error and -1 in case of error in send */
extern int msg_issue_announce(struct pp_instance *ppi);
extern int msg_issue_sync(struct pp_instance *ppi);
extern int msg_issue_followup(struct pp_instance *ppi, TimeInternal *time);
extern int msg_issue_delay_req(struct pp_instance *ppi);
extern int msg_issue_pdelay_req(struct pp_instance *ppi);
extern int msg_issue_pdelay_resp(struct pp_instance *ppi, TimeInternal *time,
MsgHeader *hdr);
extern int msg_issue_delay_resp(struct pp_instance *ppi, TimeInternal *time);
extern int msg_issue_pdelay_resp_follow_up(struct pp_instance *ppi,
TimeInternal *time);
/* arith.c */
/* Functions for timestamp handling (internal to protocol format conversion*/
/* FIXME: add prefix in function name? */
extern void int64_to_TimeInternal(Integer64 bigint, TimeInternal *internal);
extern int from_TimeInternal(TimeInternal *internal, Timestamp *external);
......@@ -255,9 +266,8 @@ extern int to_TimeInternal(TimeInternal *internal, Timestamp *external);
extern void add_TimeInternal(TimeInternal *r, TimeInternal *x, TimeInternal *y);
extern void sub_TimeInternal(TimeInternal *r, TimeInternal *x, TimeInternal *y);
/* Get a timestamp */
extern void pp_get_stamp(uint32_t *sptr);
extern void pp_get_tstamp(TimeInternal *t);
/*
* The state machine itself is an array of these structures.
......
......@@ -7,7 +7,7 @@
#include <pptp/diag.h>
#include "common-fun.h"
void st_com_execute_slave(struct pp_instance *ppi)
int st_com_execute_slave(struct pp_instance *ppi)
{
if (pp_timer_expired(ppi->timers[PP_TIMER_ANN_RECEIPT])) {
DBGV("event ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES\n");
......@@ -26,15 +26,16 @@ void st_com_execute_slave(struct pp_instance *ppi)
if (ppi->rt_opts->e2e_mode) {
if (pp_timer_expired(ppi->timers[PP_TIMER_DELAYREQ])) {
DBGV("TODO: event DELAYREQ_INTERVAL_TIMEOUT_EXPIRES\n");
/* TODO issueDelayReq(rtOpts,ptpClock); */
return msg_issue_delay_req(ppi);
}
} else {
if (pp_timer_expired(ppi->timers[PP_TIMER_PDELAYREQ]))
{
DBGV("TODO: event PDELAYREQ_INTERVAL_TOUT_EXPIRES\n");
/* TODO issuePDelayReq(rtOpts,ptpClock); */
return msg_issue_pdelay_req(ppi);
}
}
return 0;
}
void st_com_restart_annrec_timer(struct pp_instance *ppi)
......@@ -286,9 +287,7 @@ int st_com_handle_pdelay_req(struct pp_instance *ppi, unsigned char *buf,
} else {
msg_copy_header(&ppi->pdelay_req_hdr, hdr);
/* TODO issuePDelayResp(time, header, rtOpts,
ptpClock);
*/
return msg_issue_pdelay_resp(ppi, &time, hdr);
}
return 0;
}
......@@ -324,6 +323,6 @@ int st_com_master_handle_sync(struct pp_instance *ppi, unsigned char *buf,
/* Add latency */
add_TimeInternal(time, time, &ppi->rt_opts->outbound_latency);
/* TODO issueFollowup(time,rtOpts,ptpClock);*/
msg_issue_followup(ppi, time);
return 0;
}
......@@ -7,7 +7,8 @@
/* Contains all functions common to more than one state */
void st_com_execute_slave(struct pp_instance *ppi);
/* returns -1 in case of error, see below */
int st_com_execute_slave(struct pp_instance *ppi);
void st_com_restart_annrec_timer(struct pp_instance *ppi);
......
......@@ -86,8 +86,12 @@ void *msg_copy_header(MsgHeader *dest, MsgHeader *src)
/* Pack Sync message into out buffer of ppi */
void msg_pack_sync(struct pp_instance *ppi, void *buf, Timestamp *orig_tstamp)
void msg_pack_sync(struct pp_instance *ppi, Timestamp *orig_tstamp)
{
void *buf;
buf = ppi->buf_out;
/* changes in header */
*(char *)(buf + 0) = *(char *)(buf + 0) & 0xF0;
/* RAZ messageType */
......@@ -126,8 +130,11 @@ void msg_unpack_sync(void *buf, MsgSync *sync)
}
/* Pack Announce message into out buffer of ppi */
void msg_pack_announce(struct pp_instance *ppi, void *buf)
void msg_pack_announce(struct pp_instance *ppi)
{
void *buf;
buf = ppi->buf_out;
/* changes in header */
*(char *)(buf + 0) = *(char *)(buf + 0) & 0xF0;
/* RAZ messageType */
......@@ -186,9 +193,12 @@ void msg_unpack_announce(void *buf, MsgAnnounce *ann)
/* Pack Follow Up message into out buffer of ppi*/
void msg_pack_follow_up(struct pp_instance *ppi, void *buf,
Timestamp *prec_orig_tstamp)
void msg_pack_follow_up(struct pp_instance *ppi, Timestamp *prec_orig_tstamp)
{
void *buf;
buf = ppi->buf_out;
/* changes in header */
*(char *)(buf + 0) = *(char *)(buf + 0) & 0xF0;
/* RAZ messageType */
......@@ -198,7 +208,7 @@ void msg_pack_follow_up(struct pp_instance *ppi, void *buf,
*(UInteger16 *) (buf + 2) = htons(PP_FOLLOW_UP_LENGTH);
*(UInteger16 *) (buf + 30) = htons(ppi->sent_seq_id[PPM_SYNC] - 1);
/* sentSyncSequenceId has already been incremented in "issueSync" */
/* sentSyncSequenceId has already been incremented in msg_issue_sync */
*(UInteger8 *) (buf + 32) = 0x02;
/* Table 23 */
......@@ -231,9 +241,12 @@ void msg_unpack_follow_up(void *buf, MsgFollowUp *flwup)
}
/* pack PdelayReq message into out buffer of ppi */
void msg_pack_pdelay_req(struct pp_instance *ppi, void *buf,
Timestamp *orig_tstamp)
void msg_pack_pdelay_req(struct pp_instance *ppi, Timestamp *orig_tstamp)
{
void *buf;
buf = ppi->buf_out;
/* changes in header */
*(char *)(buf + 0) = *(char *)(buf + 0) & 0xF0;
/* RAZ messageType */
......@@ -261,10 +274,13 @@ void msg_pack_pdelay_req(struct pp_instance *ppi, void *buf,
}
/*pack DelayReq message into out buffer of ppi*/
void msg_pack_delay_req(struct pp_instance *ppi, void *buf,
Timestamp *orig_tstamp)
/* pack DelayReq message into out buffer of ppi */
void msg_pack_delay_req(struct pp_instance *ppi, Timestamp *orig_tstamp)
{
void *buf;
buf = ppi->buf_out;
/* changes in header */
*(char *)(buf + 0) = *(char *)(buf + 0) & 0xF0;
/* RAZ messageType */
......@@ -288,10 +304,14 @@ void msg_pack_delay_req(struct pp_instance *ppi, void *buf,
}
/*pack delayResp message into OUT buffer of ppi*/
void msg_pack_delay_resp(struct pp_instance *ppi, void *buf,
/* pack DelayResp message into OUT buffer of ppi */
void msg_pack_delay_resp(struct pp_instance *ppi,
MsgHeader *hdr, Timestamp *rcv_tstamp)
{
void *buf;
buf = ppi->buf_out;
/* changes in header */
*(char *)(buf + 0) = *(char *)(buf + 0) & 0xF0;
/* RAZ messageType */
......@@ -329,9 +349,13 @@ void msg_pack_delay_resp(struct pp_instance *ppi, void *buf,
/* Pack PdelayResp message into out buffer of ppi */
void msg_pack_pdelay_resp(struct pp_instance *ppi, void *buf, MsgHeader *hdr,
void msg_pack_pdelay_resp(struct pp_instance *ppi, MsgHeader *hdr,
Timestamp *req_rec_tstamp)
{
void *buf;
buf = ppi->buf_out;
/* changes in header */
*(char *)(buf + 0) = *(char *)(buf + 0) & 0xF0;
/* RAZ messageType */
......@@ -437,10 +461,14 @@ void msg_unpack_pdelay_resp(void *buf, MsgPDelayResp *presp)
}
/* Pack PdelayRespFollowUp message into out buffer of ppi */
void msg_pack_pdelay_resp_followup(struct pp_instance *ppi, void *buf,
void msg_pack_pdelay_resp_followup(struct pp_instance *ppi,
MsgHeader *hdr,
Timestamp *resp_orig_tstamp)
{
void *buf;
buf = ppi->buf_out;
/* changes in header */
*(char *)(buf + 0) = *(char *)(buf + 0) & 0xF0;
/* RAZ messageType */
......@@ -488,3 +516,104 @@ void msg_unpack_pdelay_resp_followup(void *buf,
presp_follow->requestingPortIdentity.portNumber =
htons(*(UInteger16 *) (buf + 52));
}
/* FIXME diag in the following macro */
#define MSG_SEND_AND_RET(x,y)\
if (pp_send_packet(ppi, ppi->buf_out, PP_## x ##_LENGTH, PP_NP_## y) <\
PP_## x ##_LENGTH) {\
return -1;\
}\
ppi->sent_seq_id[PPM_## x]++;\
return 0;
/* Pack and send on general multicast ip adress an Announce message */
int msg_issue_announce(struct pp_instance *ppi)
{
msg_pack_announce(ppi);
MSG_SEND_AND_RET(ANNOUNCE, GEN);
}
/* Pack and send on event multicast ip adress a Sync message */
int msg_issue_sync(struct pp_instance *ppi)
{
Timestamp orig_tstamp;
TimeInternal now;
pp_get_tstamp(&now);
from_TimeInternal(&now, &orig_tstamp);
msg_pack_sync(ppi,&orig_tstamp);
MSG_SEND_AND_RET(SYNC, EVT);
}
/* Pack and send on general multicast ip adress a FollowUp message */
int msg_issue_followup(struct pp_instance *ppi, TimeInternal *time)
{
Timestamp prec_orig_tstamp;
from_TimeInternal(time, &prec_orig_tstamp);
msg_pack_follow_up(ppi, &prec_orig_tstamp);
MSG_SEND_AND_RET(FOLLOW_UP, GEN);
}
/* Pack and send on event multicast ip adress a DelayReq message */
int msg_issue_delay_req(struct pp_instance *ppi)
{
Timestamp orig_tstamp;
TimeInternal now;
pp_get_tstamp(&now);
from_TimeInternal(&now, &orig_tstamp);
msg_pack_delay_req(ppi, &orig_tstamp);
MSG_SEND_AND_RET(DELAY_REQ, EVT);
}
/* Pack and send on event multicast ip adress a PDelayReq message */
int msg_issue_pdelay_req(struct pp_instance *ppi)
{
Timestamp orig_tstamp;
TimeInternal now;
pp_get_tstamp(&now);
from_TimeInternal(&now, &orig_tstamp);
msg_pack_pdelay_req(ppi, &orig_tstamp);
MSG_SEND_AND_RET(PDELAY_REQ, EVT);
}
/* Pack and send on event multicast ip adress a PDelayResp message */
int msg_issue_pdelay_resp(struct pp_instance *ppi, TimeInternal *time,
MsgHeader *hdr)
{
Timestamp req_rec_tstamp;
from_TimeInternal(time, &req_rec_tstamp);
msg_pack_pdelay_resp(ppi, hdr, &req_rec_tstamp);
MSG_SEND_AND_RET(PDELAY_RESP, EVT);
}
/* Pack and send on event multicast ip adress a DelayResp message */
int msg_issue_delay_resp(struct pp_instance *ppi, TimeInternal *time)
{
Timestamp rcv_tstamp;
from_TimeInternal(time, &rcv_tstamp);
msg_pack_delay_resp(ppi, &ppi->delay_req_hdr, &rcv_tstamp);
MSG_SEND_AND_RET(PDELAY_RESP, GEN);
}
/* Pack and send on event multicast ip adress a DelayResp message */
int msg_issue_pdelay_resp_follow_up(struct pp_instance *ppi, TimeInternal *time)
{
Timestamp resp_orig_tstamp;
from_TimeInternal(time, &resp_orig_tstamp);
msg_pack_pdelay_resp_followup(ppi, &ppi->pdelay_req_hdr,
&resp_orig_tstamp);
MSG_SEND_AND_RET(PDELAY_RESP_FOLLOW_UP, GEN);
}
......@@ -28,8 +28,9 @@ int pp_listening(struct pp_instance *ppi, unsigned char *pkt, int plen)
}
if (e == 0)
st_com_execute_slave(ppi);
else
e = st_com_execute_slave(ppi);
if (e != 0)
ppi->next_state = PPS_FAULTY;
state_updated:
......
......@@ -32,19 +32,28 @@ int pp_master(struct pp_instance *ppi, unsigned char *pkt, int plen)
goto state_updated;
if (pp_timer_expired(ppi->timers[PP_TIMER_SYNC])) {
/* FIXME diag
DBGV("TODO: event SYNC_INTERVAL_TIMEOUT_EXPIRES\n");
/* TODO issueSync(rtOpts, ptpClock); */
*/
if (msg_issue_sync(ppi) < 0)
goto failure;
}
if (pp_timer_expired(ppi->timers[PP_TIMER_ANN_INTERVAL])) {
DBGV("TODO: event ANNOUNCE_INTERVAL_TIMEOUT_EXPIRES\n");
/* TODO issueAnnounce(rtOpts, ptpClock); */
/* FIXME diag
DBGV("event ANNOUNCE_INTERVAL_TIMEOUT_EXPIRES\n");
*/
if (msg_issue_announce(ppi) < 0)
goto failure;
}
if (!ppi->rt_opts->e2e_mode) {
if (pp_timer_expired(ppi->timers[PP_TIMER_PDELAYREQ])) {
DBGV("TODO: event PDELAYREQ_INTERVAL_TOUT_EXPIRES\n");
/* TODO issuePDelayReq(rtOpts,ptpClock); */
/* FIXME diag
DBGV("event PDELAYREQ_INTERVAL_TOUT_EXPIRES\n");
*/
if (msg_issue_pdelay_req(ppi) < 0)
goto failure;
}
}
......@@ -60,8 +69,7 @@ int pp_master(struct pp_instance *ppi, unsigned char *pkt, int plen)
case PPM_DELAY_REQ:
msg_copy_header(&ppi->delay_req_hdr, hdr);
/*TODO issueDelayResp(time,&ptpClock->delayReqHeader,rtOpts,ptpClock);
*/
msg_issue_delay_resp(ppi, &time);
break;
case PPM_PDELAY_REQ:
......@@ -78,11 +86,7 @@ int pp_master(struct pp_instance *ppi, unsigned char *pkt, int plen)
add_TimeInternal(&time, &time,
&ppi->rt_opts->outbound_latency);
/* TODO issuePDelayRespFollowUp(
time,
&ptpClock->PdelayReqHeader,
rtOpts, ptpClock);
*/
e = msg_issue_pdelay_resp_follow_up(ppi,&time);
break;
}
msg_unpack_pdelay_resp(pkt, &ppi->msg_tmp.presp);
......@@ -175,6 +179,7 @@ int pp_master(struct pp_instance *ppi, unsigned char *pkt, int plen)
break;
}
failure:
if (e == 0) {
if (DSDEF(ppi)->slaveOnly ||
DSDEF(ppi)->clockQuality.clockClass == 255)
......
......@@ -38,8 +38,9 @@ int pp_passive(struct pp_instance *ppi, unsigned char *pkt, int plen)
}
if (e == 0)
st_com_execute_slave(ppi);
else
e = st_com_execute_slave(ppi);
if (e != 0)
ppi->next_state = PPS_FAULTY;
......
......@@ -140,10 +140,7 @@ int pp_slave(struct pp_instance *ppi, unsigned char *pkt, int plen)
if (ppi->is_from_self) {
add_TimeInternal(&time, &time,
&ppi->rt_opts->outbound_latency);
/* TODO issuePDelayRespFollowUp(time,
&ptpClock->PdelayReqHeader,
rtOpts,ptpClock);
*/
msg_issue_pdelay_resp_follow_up(ppi, &time);
break;
}
msg_unpack_pdelay_resp(pkt,
......@@ -250,8 +247,9 @@ int pp_slave(struct pp_instance *ppi, unsigned char *pkt, int plen)
}
if (e == 0)
st_com_execute_slave(ppi);
else
e = st_com_execute_slave(ppi);
if (e != 0)
ppi->next_state = PPS_FAULTY;
state_updated:
......
......@@ -31,8 +31,9 @@ int pp_uncalibrated(struct pp_instance *ppi, unsigned char *pkt, int plen)
}
if (e == 0)
st_com_execute_slave(ppi);
else
e = st_com_execute_slave(ppi);
if (e != 0)
ppi->next_state = PPS_FAULTY;
ppi->next_delay = PP_DEFAULT_NEXT_DELAY_MS;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment