Commit e0b61c86 authored by Jean-Claude BAU's avatar Jean-Claude BAU Committed by Adam Wujek

Change the pp_msgtype_info structure

- This structure is changed in order to be able to use SIGNALING
messages with non-fowardable MAC address. This have an impact on many
places as we have to distinguish two kind of signaling messages
parent fb26d591
......@@ -80,17 +80,37 @@ struct pp_vlanhdr {
/* Factorize some random information in this table */
struct pp_msgtype_info {
char *name; /* For diagnostics */
enum pp_std_messages msg_type;
uint16_t msglen;
unsigned char chtype;
unsigned char is_pdelay;
unsigned char controlField; /* Table 23 */
unsigned char logMessageInterval; /* Table 24, see defines */
#define PP_LOG_ANNOUNCE 0
#define PP_LOG_SYNC 1
#define PP_LOG_REQUEST 2
#define PP_LOG_ANNOUNCE 0
#define PP_LOG_SYNC 1
#define PP_LOG_REQUEST 2
};
/* Used as index for the pp_msgtype_info array */
enum pp_msg_format {
PPM_SYNC_FMT = 0x0,
PPM_DELAY_REQ_FMT,
PPM_PDELAY_REQ_FMT,
PPM_PDELAY_RESP_FMT,
PPM_FOLLOW_UP_FMT,
PPM_DELAY_RESP_FMT,
PPM_PDELAY_R_FUP_FMT,
PPM_ANNOUNCE_FMT,
PPM_SIGNALING_FMT,
PPM_SIGNALING_NO_FWD_FMT,
PPM_MANAGEMENT_FMT,
PPM_MSG_FMT_MAX
};
extern struct pp_msgtype_info pp_msgtype_info[16];
extern struct pp_msgtype_info pp_msgtype_info[];
extern char *pp_msgtype_name[];
/* Helpers for the fsm (fsm-lib.c) */
extern int pp_lib_may_issue_sync(struct pp_instance *ppi);
......@@ -206,7 +226,7 @@ struct pp_network_operations {
int (*exit)(struct pp_instance *ppi);
int (*recv)(struct pp_instance *ppi, void *pkt, int len,
struct pp_time *t);
int (*send)(struct pp_instance *ppi, void *pkt, int len, int msgtype);
int (*send)(struct pp_instance *ppi, void *pkt, int len, enum pp_msg_format msg_fmt);
int (*check_packet)(struct pp_globals *ppg, int delay_ms);
};
......@@ -510,6 +530,12 @@ extern void msg_unpack_announce(struct pp_instance *ppi,void *buf, MsgAnnounce *
extern void msg_unpack_follow_up(void *buf, MsgFollowUp *flwup);
extern void msg_unpack_delay_req(void *buf, MsgDelayReq *delay_req);
extern void msg_unpack_delay_resp(void *buf, MsgDelayResp *resp);
extern int msg_pack_signaling(struct pp_instance *ppi,PortIdentity *target_port_identity,
UInteger16 tlv_type, UInteger16 tlv_length_field);
extern int msg_pack_signaling_no_fowardable(struct pp_instance *ppi,PortIdentity *target_port_identity,
UInteger16 tlv_type, UInteger16 tlv_length_field);
void msg_unpack_signaling(void *buf, MsgSignaling *signaling);
/* pdelay */
extern void msg_unpack_pdelay_resp_follow_up(void *buf,
MsgPDelayRespFollowUp *
......
......@@ -6,33 +6,50 @@
* the numeric 0..5 is the "controlField" (magic ptpV1 numbers in byte 32).
* PP_LOG is the kind of logInterval to put in byte 33.
*/
struct pp_msgtype_info pp_msgtype_info[16] = {
[PPM_SYNC] = {
"sync", PP_SYNC_LENGTH,
struct pp_msgtype_info pp_msgtype_info[] = {
[PPM_SYNC_FMT] = {
PPM_SYNC, PP_SYNC_LENGTH,
PP_NP_EVT, PP_E2E_MECH, 0, PP_LOG_SYNC },
[PPM_DELAY_REQ] = {
"delay_req", PP_DELAY_REQ_LENGTH,
[PPM_DELAY_REQ_FMT] = {
PPM_DELAY_REQ, PP_DELAY_REQ_LENGTH,
PP_NP_EVT, PP_E2E_MECH, 1, 0x7f },
[PPM_PDELAY_REQ] = {
"pdelay_req", PP_PDELAY_REQ_LENGTH,
[PPM_PDELAY_REQ_FMT] = {
PPM_PDELAY_REQ,PP_PDELAY_REQ_LENGTH,
PP_NP_EVT, PP_P2P_MECH, 5, 0x7f },
[PPM_PDELAY_RESP] = {
"pdelay_resp", PP_PDELAY_RESP_LENGTH,
[PPM_PDELAY_RESP_FMT] = {
PPM_PDELAY_RESP, PP_PDELAY_RESP_LENGTH,
PP_NP_EVT, PP_P2P_MECH, 5, 0x7f },
[PPM_FOLLOW_UP] = {
"follow_up", PP_FOLLOW_UP_LENGTH,
[PPM_FOLLOW_UP_FMT] = {
PPM_FOLLOW_UP, PP_FOLLOW_UP_LENGTH,
PP_NP_GEN, PP_E2E_MECH, 2, PP_LOG_SYNC },
[PPM_DELAY_RESP] = {
"delay_resp", PP_DELAY_RESP_LENGTH,
[PPM_DELAY_RESP_FMT] = {
PPM_DELAY_RESP, PP_DELAY_RESP_LENGTH,
PP_NP_GEN, PP_E2E_MECH, 3, PP_LOG_REQUEST },
[PPM_PDELAY_R_FUP] = {
"pdelay_resp_follow_up", PP_PDELAY_RESP_FOLLOW_UP_LENGTH,
[PPM_PDELAY_R_FUP_FMT] = {
PPM_PDELAY_R_FUP, PP_PDELAY_RESP_FOLLOW_UP_LENGTH,
PP_NP_GEN, PP_P2P_MECH, 5, 0x7f },
[PPM_ANNOUNCE] = {
"announce", PP_ANNOUNCE_LENGTH,
[PPM_ANNOUNCE_FMT] = {
PPM_ANNOUNCE, PP_ANNOUNCE_LENGTH,
PP_NP_GEN, PP_E2E_MECH, 5, PP_LOG_ANNOUNCE},
/* We don't use signaling and management, or not in the table-driven code */
[PPM_SIGNALING] = { "signaling", -1, PP_NP_GEN, PP_E2E_MECH, 5, 0x7f},
[PPM_MANAGEMENT] = { "management", -1, PP_NP_GEN, PP_E2E_MECH, 4, 0x7f},
[PPM_SIGNALING_FMT] = {
PPM_SIGNALING, -1,
PP_NP_GEN, PP_E2E_MECH, 5, 0x7f},
[PPM_SIGNALING_NO_FWD_FMT] = {
PPM_SIGNALING, -1,
PP_NP_GEN, PP_P2P_MECH, 5, 0x7f},
/* We don't use management, or not in the table-driven code */
[PPM_MANAGEMENT_FMT] = { PPM_MANAGEMENT, -1, PP_NP_GEN, PP_E2E_MECH, 4, 0x7f},
};
char *pp_msgtype_name[] = {
[PPM_SYNC] = "sync",
[PPM_DELAY_REQ] = "delay_req",
[PPM_PDELAY_REQ] = "pdelay_req",
[PPM_PDELAY_RESP] ="pdelay_resp",
[PPM_FOLLOW_UP] = "follow_up",
[PPM_DELAY_RESP] ="delay_resp",
[PPM_PDELAY_R_FUP] ="pdelay_resp_follow_up",
[PPM_ANNOUNCE] ="announce",
[PPM_SIGNALING] ="signaling",
[PPM_MANAGEMENT] ="management"
};
......@@ -24,16 +24,16 @@ static int bare_net_recv(struct pp_instance *ppi, void *pkt, int len,
return ret;
}
static int bare_net_send(struct pp_instance *ppi, void *pkt, int len,
int msgtype)
static int bare_net_send(struct pp_instance *ppi, void *pkt, int len,enum pp_msg_format msg_fmt)
{
struct pp_msgtype_info *mf = pp_msgtype_info + msg_fmt;
struct bare_ethhdr *hdr = pkt;
struct pp_time *t = &ppi->last_snt_time;
static const uint8_t macaddr[2][ETH_ALEN] = {
[PP_E2E_MECH] = PP_MCAST_MACADDRESS,
[PP_P2P_MECH] = PP_PDELAY_MACADDRESS,
};
int is_pdelay = pp_msgtype_info[msgtype].is_pdelay;
int is_pdelay = mf->is_pdelay;
int ret;
hdr->h_proto = htons(ETH_P_1588);
......
......@@ -161,10 +161,10 @@ static int sim_net_recv(struct pp_instance *ppi, void *pkt, int len,
return ret;
}
static int sim_net_send(struct pp_instance *ppi, void *pkt, int len,
int msgtype)
static int sim_net_send(struct pp_instance *ppi, void *pkt, int len,enum pp_msg_format msg_fmt)
{
int chtype = pp_msgtype_info[msgtype].chtype;
struct pp_msgtype_info *mf = pp_msgtype_info + msg_fmt;
int chtype = mf->chtype;
struct pp_time *t = &ppi->last_snt_time;
struct sim_ppi_arch_data *data = SIM_PPI_ARCH(ppi);
struct sockaddr_in addr;
......
......@@ -176,16 +176,16 @@ static int unix_net_recv(struct pp_instance *ppi, void *pkt, int len,
}
}
static int unix_net_send(struct pp_instance *ppi, void *pkt, int len,
int msgtype)
static int unix_net_send(struct pp_instance *ppi, void *pkt, int len,enum pp_msg_format msg_fmt)
{
int chtype = pp_msgtype_info[msgtype].chtype;
struct pp_msgtype_info *mf = pp_msgtype_info + msg_fmt;
int chtype = mf->chtype;
struct sockaddr_in addr;
struct ethhdr *hdr = pkt;
struct pp_vlanhdr *vhdr = pkt;
struct pp_channel *ch = ppi->ch + chtype;
struct pp_time *t = &ppi->last_snt_time;
int is_pdelay = pp_msgtype_info[msgtype].is_pdelay;
int is_pdelay = mf->is_pdelay;
static const uint16_t udpport[] = {
[PP_NP_GEN] = PP_GEN_PORT,
[PP_NP_EVT] = PP_EVT_PORT,
......
......@@ -115,15 +115,15 @@ static int wrpc_net_recv(struct pp_instance *ppi, void *pkt, int len,
return got;
}
static int wrpc_net_send(struct pp_instance *ppi, void *pkt, int len,
int msgtype)
static int wrpc_net_send(struct pp_instance *ppi, void *pkt, int len, enum pp_msg_format msg_fmt)
{
struct pp_msgtype_info *mf = pp_msgtype_info + msg_fmt;
int snt, drop;
struct wrpc_socket *sock;
struct wr_timestamp wr_ts;
struct wr_sockaddr addr;
struct pp_time *t = &ppi->last_snt_time;
int is_pdelay = pp_msgtype_info[msgtype].is_pdelay;
int is_pdelay = mf->is_pdelay;
static const uint8_t macaddr[2][ETH_ALEN] = {
[PP_E2E_MECH] = PP_MCAST_MACADDRESS,
[PP_P2P_MECH] = PP_PDELAY_MACADDRESS,
......
......@@ -452,16 +452,16 @@ static void poll_tx_timestamp(struct pp_instance *ppi, void *pkt, int len,
}
}
static int wrs_net_send(struct pp_instance *ppi, void *pkt, int len,
int msgtype)
static int wrs_net_send(struct pp_instance *ppi, void *pkt, int len,enum pp_msg_format msg_fmt)
{
int chtype = pp_msgtype_info[msgtype].chtype;
struct pp_msgtype_info *mf = pp_msgtype_info + msg_fmt;
int chtype = mf->chtype;
struct sockaddr_in addr;
struct ethhdr *hdr = pkt;
struct pp_vlanhdr *vhdr = pkt;
struct pp_channel *ch = ppi->ch + chtype;
struct pp_time *t = &ppi->last_snt_time;
int is_pdelay = pp_msgtype_info[msgtype].is_pdelay;
int is_pdelay = mf->is_pdelay;
static uint16_t udpport[] = {
[PP_NP_GEN] = PP_GEN_PORT,
[PP_NP_EVT] = PP_EVT_PORT,
......
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