Commit 5ad45baf authored by Aurelio Colosimo's avatar Aurelio Colosimo

evt_ch and gen_ch substituted by ch[2] array

As a consequence, pp_send_packet is now correctly defined by accepting
as input the desired channel type. This leads to an incoherence between
send and receive, since in receive we are not interested in which
socket received the packet, whereas in send we need to specify it.
parent 33a26719
......@@ -8,7 +8,8 @@
extern int bare_open_ch(struct pp_instance *ppi, char *name);
extern int bare_recv_packet(struct pp_instance *ppi, void *pkt, int len);
extern int bare_send_packet(struct pp_instance *ppi, void *pkt, int len);
extern int bare_send_packet(struct pp_instance *ppi, void *pkt, int len,
int chtype);
extern void bare_main_loop(struct pp_instance *ppi);
......
......@@ -10,17 +10,17 @@
/* FIXME: which socket we receive and send with? */
int bare_recv_packet(struct pp_instance *ppi, void *pkt, int len)
{
return sys_recv(ppi->net_path->gen_ch.fd, pkt, len, 0);
return sys_recv(ppi->net_path->ch[PP_NP_GEN].fd, pkt, len, 0);
}
int bare_send_packet(struct pp_instance *ppi, void *pkt, int len)
int bare_send_packet(struct pp_instance *ppi, void *pkt, int len, int chtype)
{
return sys_send(ppi->net_path->gen_ch.fd, pkt, len, 0);
return sys_send(ppi->net_path->ch[chtype].fd, pkt, len, 0);
}
int pp_recv_packet(struct pp_instance *ppi, void *pkt, int len)
__attribute__((alias("bare_recv_packet")));
int pp_send_packet(struct pp_instance *ppi, void *pkt, int len)
int pp_send_packet(struct pp_instance *ppi, void *pkt, int len, int chtype)
__attribute__((alias("bare_send_packet")));
#define PF_PACKET 17
......@@ -53,8 +53,10 @@ int bare_open_ch(struct pp_instance *ppi, char *ifname)
pp_diag_error(ppi, bare_errno);
pp_diag_fatal(ppi, "ioctl(GIFHWADDR)", "");
}
memcpy(ppi->net_path->gen_ch.addr, ifr.ifr_ifru.ifru_hwaddr.sa_data, 6);
memcpy(ppi->net_path->evt_ch.addr, ifr.ifr_ifru.ifru_hwaddr.sa_data, 6);
memcpy(ppi->net_path->ch[PP_NP_GEN].addr,
ifr.ifr_ifru.ifru_hwaddr.sa_data, 6);
memcpy(ppi->net_path->ch[PP_NP_EVT].addr,
ifr.ifr_ifru.ifru_hwaddr.sa_data, 6);
/* bind and setsockopt */
memset(&addr, 0, sizeof(addr));
......@@ -66,7 +68,7 @@ int bare_open_ch(struct pp_instance *ppi, char *ifname)
pp_diag_fatal(ppi, "bind", "");
}
ppi->net_path->gen_ch.fd = sock;
ppi->net_path->evt_ch.fd = sock;
ppi->net_path->ch[PP_NP_GEN].fd = sock;
ppi->net_path->ch[PP_NP_EVT].fd = sock;
return 0;
}
......@@ -46,11 +46,11 @@ void bare_main_loop(struct pp_instance *ppi)
again:
FD_ZERO(&set);
FD_SET(ppi->net_path->gen_ch.fd, &set);
FD_SET(ppi->net_path->evt_ch.fd, &set);
maxfd = ppi->net_path->gen_ch.fd;
if (ppi->net_path->evt_ch.fd > maxfd)
maxfd = ppi->net_path->evt_ch.fd;
FD_SET(ppi->net_path->ch[PP_NP_GEN].fd, &set);
FD_SET(ppi->net_path->ch[PP_NP_EVT].fd, &set);
maxfd = ppi->net_path->ch[PP_NP_GEN].fd;
if (ppi->net_path->ch[PP_NP_EVT].fd > maxfd)
maxfd = ppi->net_path->ch[PP_NP_EVT].fd;
i = sys_select(maxfd + 1, &set, NULL, NULL, &tv);
if (i < 0 && bare_errno != 4 /* EINTR */)
......
......@@ -26,14 +26,15 @@ int posix_recv_packet(struct pp_instance *ppi, void *pkt, int len)
{
struct pp_channel *ch1 = NULL, *ch2 = NULL;
/* TODO: rewrite it in a better way! */
switch (ch_check_stat) {
case 0:
ch1 = &(ppi->net_path->evt_ch);
ch2 = &(ppi->net_path->gen_ch);
ch1 = &(ppi->net_path->ch[PP_NP_EVT]);
ch2 = &(ppi->net_path->ch[PP_NP_GEN]);
break;
case 1:
ch1 = &(ppi->net_path->gen_ch);
ch2 = &(ppi->net_path->evt_ch);
ch1 = &(ppi->net_path->ch[PP_NP_GEN]);
ch2 = &(ppi->net_path->ch[PP_NP_EVT]);
break;
default:
/* Impossible! */
......@@ -50,14 +51,14 @@ 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 posix_send_packet(struct pp_instance *ppi, void *pkt, int len, int chtype)
{
return send(/*FIXME which socket?! ppi->ch.fd*/ -1, pkt, len, 0);
return send(ppi->net_path->ch[chtype].fd, pkt, len, 0);
}
int pp_recv_packet(struct pp_instance *ppi, void *pkt, int len)
__attribute__((alias("posix_recv_packet")));
int pp_send_packet(struct pp_instance *ppi, void *pkt, int len)
int pp_send_packet(struct pp_instance *ppi, void *pkt, int len, int chtype)
__attribute__((alias("posix_send_packet")));
/* To open a channel we must bind to an interface and so on */
......@@ -98,8 +99,8 @@ int posix_open_ch(struct pp_instance *ppi, char *ifname)
return -1;
}
/* FIXME: what to do with hw address */
memcpy(ppi->net_path->gen_ch.addr, ifr.ifr_hwaddr.sa_data, 6);
memcpy(ppi->net_path->evt_ch.addr, ifr.ifr_hwaddr.sa_data, 6);
memcpy(ppi->net_path->ch[PP_NP_GEN].addr, ifr.ifr_hwaddr.sa_data, 6);
memcpy(ppi->net_path->ch[PP_NP_EVT].addr, ifr.ifr_hwaddr.sa_data, 6);
/* bind and setsockopt */
memset(&addr, 0, sizeof(addr));
......@@ -112,8 +113,8 @@ int posix_open_ch(struct pp_instance *ppi, char *ifname)
return -1;
}
/* FIXME: we are using the same socket for both channels by now */
ppi->net_path->gen_ch.fd = sock;
ppi->net_path->evt_ch.fd = sock;
ppi->net_path->ch[PP_NP_GEN].fd = sock;
ppi->net_path->ch[PP_NP_EVT].fd = sock;
return 0;
}
......@@ -163,14 +164,14 @@ int posix_net_check_pkt(struct pp_instance *ppi, int delay_ms)
arch_data->tv.tv_usec = (delay_ms % 1000) * 1000;
}
ppi->net_path->gen_ch.pkt_present = 0;
ppi->net_path->evt_ch.pkt_present = 0;
ppi->net_path->ch[PP_NP_GEN].pkt_present = 0;
ppi->net_path->ch[PP_NP_EVT].pkt_present = 0;
maxfd = (ppi->net_path->gen_ch.fd > ppi->net_path->evt_ch.fd) ?
ppi->net_path->gen_ch.fd : ppi->net_path->evt_ch.fd;
maxfd = (ppi->net_path->ch[PP_NP_GEN].fd > ppi->net_path->ch[PP_NP_EVT].fd) ?
ppi->net_path->ch[PP_NP_GEN].fd : ppi->net_path->ch[PP_NP_EVT].fd;
FD_ZERO(&set);
FD_SET(ppi->net_path->gen_ch.fd, &set);
FD_SET(ppi->net_path->evt_ch.fd, &set);
FD_SET(ppi->net_path->ch[PP_NP_GEN].fd, &set);
FD_SET(ppi->net_path->ch[PP_NP_EVT].fd, &set);
i = select(maxfd + 1, &set, NULL, NULL, &arch_data->tv);
if (i < 0 && errno != EINTR)
......@@ -184,14 +185,14 @@ int posix_net_check_pkt(struct pp_instance *ppi, int delay_ms)
if (i == 0)
goto _end;
if (FD_ISSET(ppi->net_path->gen_ch.fd, &set)) {
if (FD_ISSET(ppi->net_path->ch[PP_NP_GEN].fd, &set)) {
ret++;
ppi->net_path->gen_ch.pkt_present = 1;
ppi->net_path->ch[PP_NP_GEN].pkt_present = 1;
}
if (FD_ISSET(ppi->net_path->evt_ch.fd, &set)) {
if (FD_ISSET(ppi->net_path->ch[PP_NP_EVT].fd, &set)) {
ret++;
ppi->net_path->evt_ch.pkt_present = 1;
ppi->net_path->ch[PP_NP_EVT].pkt_present = 1;
}
_end:
......
......@@ -16,6 +16,7 @@ extern int posix_net_check_pkt(struct pp_instance *ppi, int delay_ms);
extern int posix_open_ch(struct pp_instance *ppi, char *name);
extern int posix_recv_packet(struct pp_instance *ppi, void *pkt, int len);
extern int posix_send_packet(struct pp_instance *ppi, void *pkt, int len);
extern int posix_send_packet(struct pp_instance *ppi, void *pkt, int len,
int chtype);
extern void posix_main_loop(struct pp_instance *ppi);
......@@ -16,8 +16,8 @@ int spec_open_ch(struct pp_instance *ppi)
ep_enable(1, 1);
minic_init();
memcpy(ppi->net_path->gen_ch.addr, fake_addr, 6);
memcpy(ppi->net_path->evt_ch.addr, fake_addr, 6);
memcpy(ppi->net_path->ch[PP_NP_GEN].addr, fake_addr, 6);
memcpy(ppi->net_path->ch[PP_NP_EVT].addr, fake_addr, 6);
return 0;
}
......@@ -32,7 +32,7 @@ int spec_recv_packet(struct pp_instance *ppi, void *pkt, int len)
return minic_rx_frame(pkt, pkt + 14, len - 14, NULL);
}
int spec_send_packet(struct pp_instance *ppi, void *pkt, int len)
int spec_send_packet(struct pp_instance *ppi, void *pkt, int len, int chtype)
{
static int led;
......@@ -43,5 +43,5 @@ int spec_send_packet(struct pp_instance *ppi, void *pkt, int len)
int pp_recv_packet(struct pp_instance *ppi, void *pkt, int len)
__attribute__((alias("spec_recv_packet")));
int pp_send_packet(struct pp_instance *ppi, void *pkt, int len)
int pp_send_packet(struct pp_instance *ppi, void *pkt, int len, int chtype)
__attribute__((alias("spec_send_packet")));
......@@ -93,9 +93,12 @@ struct pp_timer {
* Net Path. Struct which contains the network configuration parameters and
* the event/general channels (sockets on most platforms, see above)
*/
#define PP_NP_GEN 0
#define PP_NP_EVT 1
struct pp_net_path {
struct pp_channel evt_ch;
struct pp_channel gen_ch;
struct pp_channel ch[2]; /* event and general channel (see above
* #define's */
Integer32 ucast_addr;
Integer32 mcast_addr;
Integer32 peer_mcast_addr;
......@@ -185,7 +188,8 @@ extern int pp_parse_cmdline(struct pp_instance *ppi, int argc, char **argv);
extern int pp_net_init(struct pp_instance *ppi);
extern int pp_net_shutdown(struct pp_instance *ppi);
extern int pp_recv_packet(struct pp_instance *ppi, void *pkt, int len);
extern int pp_send_packet(struct pp_instance *ppi, void *pkt, int len);
extern int pp_send_packet(struct pp_instance *ppi, void *pkt, int len,
int chtype); /* chtype: PP_NP_GEN || PP_NP_EVT */
/* Timers */
extern int pp_timer_init(struct pp_instance *ppi); /* initializes timer common
......
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