Commit 9c27977c authored by Aurelio Colosimo's avatar Aurelio Colosimo

timestamp handling in send_packet functions

Timestamp handling was not used while sending (ptpd made use of
multicast come back packets by checking is_from_self, see commit
04a4e74c)
parent 495a4e85
......@@ -125,8 +125,8 @@ int posix_recv_packet(struct pp_instance *ppi, void *pkt, int len,
return -1;
}
int posix_send_packet(struct pp_instance *ppi, void *pkt, int len, int chtype,
int use_pdelay_addr)
int posix_send_packet(struct pp_instance *ppi, void *pkt, int len,
TimeInternal *t, int chtype, int use_pdelay_addr)
{
struct sockaddr_in addr;
struct ethhdr *hdr;
......@@ -155,6 +155,9 @@ int posix_send_packet(struct pp_instance *ppi, void *pkt, int len, int chtype,
else
addr.sin_addr.s_addr = NP(ppi)->peer_mcast_addr;
if (t)
pp_get_tstamp(t);
return sendto(NP(ppi)->ch[chtype].fd, pkt, len, 0,
(struct sockaddr *)&addr, sizeof(struct sockaddr_in));
......@@ -163,8 +166,8 @@ int posix_send_packet(struct pp_instance *ppi, void *pkt, int len, int chtype,
int pp_recv_packet(struct pp_instance *ppi, void *pkt, int len, TimeInternal *t)
__attribute__((alias("posix_recv_packet")));
int pp_send_packet(struct pp_instance *ppi, void *pkt, int len, int chtype,
int use_pdelay_addr)
int pp_send_packet(struct pp_instance *ppi, void *pkt, int len, TimeInternal *t,
int chtype, int use_pdelay_addr)
__attribute__((alias("posix_send_packet")));
/* To open a channel we must bind to an interface and so on */
......
......@@ -20,6 +20,6 @@ extern int posix_open_ch(struct pp_instance *ppi, char *name, int chtype);
extern int posix_recv_packet(struct pp_instance *ppi, void *pkt, int len,
TimeInternal *t);
extern int posix_send_packet(struct pp_instance *ppi, void *pkt, int len,
int chtype, int use_pdelay_addr);
TimeInternal *t, int chtype, int use_pdelay_addr);
extern void posix_main_loop(struct pp_instance *ppi);
......@@ -50,11 +50,13 @@ int spec_recv_packet(struct pp_instance *ppi, void *pkt, int len,
return got;
}
int spec_send_packet(struct pp_instance *ppi, void *pkt, int len, int chtype,
int use_pdelay_addr)
int spec_send_packet(struct pp_instance *ppi, void *pkt, int len,
TimeInternal *t, int chtype, int use_pdelay_addr)
{
static int led;
struct spec_ethhdr hdr;
struct hw_timestamp hwts;
int got;
if (OPTS(ppi)->gptp_mode)
memcpy(hdr.h_dest, PP_PEER_MACADDRESS, ETH_ALEN);
......@@ -68,7 +70,18 @@ int spec_send_packet(struct pp_instance *ppi, void *pkt, int len, int chtype,
led ^= 1; /* blink the other led at each tx event */
gpio_out(GPIO_PIN_LED_STATUS, led);
return minic_tx_frame((uint8_t*)&hdr, pkt, len+ETH_HEADER_SIZE, NULL);
got = minic_tx_frame((uint8_t*)&hdr, pkt, len+ETH_HEADER_SIZE, &hwts);
if (t) {
/* add phase value and linearize function for WR support */
t->seconds = hwts.utc;
t->nanoseconds = hwts.nsec;
PP_VPRINTF("%s: got=%d, sec=%d, nsec=%d\n", __FUNCTION__, got,
t->seconds, t->nanoseconds);
}
return got;
}
int spec_net_init(struct pp_instance *ppi)
......@@ -98,6 +111,6 @@ int pp_net_shutdown(struct pp_instance *ppi)
__attribute__((alias("spec_net_shutdown")));
int pp_recv_packet(struct pp_instance *ppi, void *pkt, int len, TimeInternal *t)
__attribute__((alias("spec_recv_packet")));
int pp_send_packet(struct pp_instance *ppi, void *pkt, int len, int chtype,
int use_pdelay_addr)
int pp_send_packet(struct pp_instance *ppi, void *pkt, int len, TimeInternal *t,
int chtype, int use_pdelay_addr)
__attribute__((alias("spec_send_packet")));
......@@ -14,7 +14,7 @@ extern int spec_open_ch(struct pp_instance *ppi);
extern int spec_recv_packet(struct pp_instance *ppi, void *pkt, int len,
TimeInternal *t);
extern int spec_send_packet(struct pp_instance *ppi, void *pkt, int len,
int chtype, int use_pdelay_addr);
TimeInternal *t, int chtype, int use_pdelay_addr);
extern void spec_main_loop(struct pp_instance *ppi);
extern void _irq_entry(void); /* unused, to make crt0.S happy */
......
......@@ -189,6 +189,8 @@ struct pp_instance {
TimeInternal last_rcv_time; /* used to store timestamp retreived from
* received packet */
TimeInternal last_snt_time; /* used to store timestamp retreived from
* sent packet */
TimeInternal last_sync_corr_field;
TimeInternal last_pdelay_req_corr_field;
TimeInternal last_pdelay_resp_corr_field;
......@@ -250,7 +252,7 @@ extern int pp_net_shutdown(struct pp_instance *ppi);
extern int pp_recv_packet(struct pp_instance *ppi, void *pkt, int len,
TimeInternal *t);
extern int pp_send_packet(struct pp_instance *ppi, void *pkt, int len,
int chtype, int use_pdelay_addr);
TimeInternal *t, int chtype, int use_pdelay_addr);
/* chtype: PP_NP_GEN || PP_NP_EVT */
/* Timers */
......
......@@ -586,8 +586,8 @@ static const char const * pp_msg_names[] = {
};
#define MSG_SEND_AND_RET(x,y,z)\
if (pp_send_packet(ppi, ppi->buf_out, PP_## x ##_LENGTH, PP_NP_##y ,\
z) < PP_## x ##_LENGTH) {\
if (pp_send_packet(ppi, ppi->buf_out, PP_## x ##_LENGTH,\
&ppi->last_snt_time, PP_NP_##y , z) < PP_## x ##_LENGTH) {\
PP_PRINTF("%s(%d) Message can't be sent -> FAULTY state!\n",\
pp_msg_names[PPM_##x], PPM_##x);\
return -1;\
......
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