Safecopy support for INET.
This commit is contained in:
parent
7ce17fe655
commit
9939089dea
4 changed files with 135 additions and 31 deletions
|
@ -1127,6 +1127,8 @@ eth_port_t *eth_port;
|
||||||
u32_t flags;
|
u32_t flags;
|
||||||
eth_port_t *vp;
|
eth_port_t *vp;
|
||||||
|
|
||||||
|
assert(eth_port);
|
||||||
|
|
||||||
if (eth_port->etp_vlan)
|
if (eth_port->etp_vlan)
|
||||||
{
|
{
|
||||||
/* Configure underlying device */
|
/* Configure underlying device */
|
||||||
|
|
|
@ -359,7 +359,7 @@ void *alloc(size_t size)
|
||||||
{
|
{
|
||||||
/* Allocate memory on the heap with sbrk(). */
|
/* Allocate memory on the heap with sbrk(). */
|
||||||
|
|
||||||
return sbrk((size + (sizeof(char *) - 1)) & ~(sizeof(char *) - 1));
|
return malloc(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -7,6 +7,7 @@ Copyright 1995 Philip Homburg
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "inet.h"
|
#include "inet.h"
|
||||||
|
#include <minix/safecopies.h>
|
||||||
#include "proto.h"
|
#include "proto.h"
|
||||||
#include "osdep_eth.h"
|
#include "osdep_eth.h"
|
||||||
#include "generic/type.h"
|
#include "generic/type.h"
|
||||||
|
@ -32,17 +33,63 @@ FORWARD _PROTOTYPE( void eth_restart, (eth_port_t *eth_port, int tasknr) );
|
||||||
|
|
||||||
PUBLIC void osdep_eth_init()
|
PUBLIC void osdep_eth_init()
|
||||||
{
|
{
|
||||||
int i, r, tasknr, rport;
|
int i, j, r, tasknr, rport;
|
||||||
struct eth_conf *ecp;
|
struct eth_conf *ecp;
|
||||||
eth_port_t *eth_port, *rep;
|
eth_port_t *eth_port, *rep;
|
||||||
message mess;
|
message mess;
|
||||||
|
cp_grant_id_t gid;
|
||||||
|
|
||||||
/* First initialize normal ethernet interfaces */
|
/* First initialize normal ethernet interfaces */
|
||||||
for (i= 0, ecp= eth_conf, eth_port= eth_port_table;
|
for (i= 0, ecp= eth_conf, eth_port= eth_port_table;
|
||||||
i<eth_conf_nr; i++, ecp++, eth_port++)
|
i<eth_conf_nr; i++, ecp++, eth_port++)
|
||||||
{
|
{
|
||||||
|
/* Set all grants to invalid */
|
||||||
|
for (j= 0; j<IOVEC_NR; j++)
|
||||||
|
eth_port->etp_osdep.etp_wr_iovec[j].iov_grant= -1;
|
||||||
|
eth_port->etp_osdep.etp_wr_vec_grant= -1;
|
||||||
|
for (j= 0; j<RD_IOVEC; j++)
|
||||||
|
eth_port->etp_osdep.etp_rd_iovec[j].iov_grant= -1;
|
||||||
|
eth_port->etp_osdep.etp_rd_vec_grant= -1;
|
||||||
|
|
||||||
if (eth_is_vlan(ecp))
|
if (eth_is_vlan(ecp))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* Allocate grants */
|
||||||
|
for (j= 0; j<IOVEC_NR; j++)
|
||||||
|
{
|
||||||
|
if (cpf_getgrants(&gid, 1) != 1)
|
||||||
|
{
|
||||||
|
ip_panic((
|
||||||
|
"osdep_eth_init: cpf_getgrants failed: %d\n",
|
||||||
|
errno));
|
||||||
|
}
|
||||||
|
eth_port->etp_osdep.etp_wr_iovec[j].iov_grant= gid;
|
||||||
|
}
|
||||||
|
if (cpf_getgrants(&gid, 1) != 1)
|
||||||
|
{
|
||||||
|
ip_panic((
|
||||||
|
"osdep_eth_init: cpf_getgrants failed: %d\n",
|
||||||
|
errno));
|
||||||
|
}
|
||||||
|
eth_port->etp_osdep.etp_wr_vec_grant= gid;
|
||||||
|
for (j= 0; j<RD_IOVEC; j++)
|
||||||
|
{
|
||||||
|
if (cpf_getgrants(&gid, 1) != 1)
|
||||||
|
{
|
||||||
|
ip_panic((
|
||||||
|
"osdep_eth_init: cpf_getgrants failed: %d\n",
|
||||||
|
errno));
|
||||||
|
}
|
||||||
|
eth_port->etp_osdep.etp_rd_iovec[j].iov_grant= gid;
|
||||||
|
}
|
||||||
|
if (cpf_getgrants(&gid, 1) != 1)
|
||||||
|
{
|
||||||
|
ip_panic((
|
||||||
|
"osdep_eth_init: cpf_getgrants failed: %d\n",
|
||||||
|
errno));
|
||||||
|
}
|
||||||
|
eth_port->etp_osdep.etp_rd_vec_grant= gid;
|
||||||
|
|
||||||
#ifdef __minix_vmd
|
#ifdef __minix_vmd
|
||||||
r= sys_findproc(ecp->ec_task, &tasknr, 0);
|
r= sys_findproc(ecp->ec_task, &tasknr, 0);
|
||||||
#else /* Minix 3 */
|
#else /* Minix 3 */
|
||||||
|
@ -63,7 +110,7 @@ PUBLIC void osdep_eth_init()
|
||||||
eth_port->etp_osdep.etp_task= tasknr;
|
eth_port->etp_osdep.etp_task= tasknr;
|
||||||
ev_init(ð_port->etp_osdep.etp_recvev);
|
ev_init(ð_port->etp_osdep.etp_recvev);
|
||||||
|
|
||||||
mess.m_type= DL_INIT;
|
mess.m_type= DL_CONF;
|
||||||
mess.DL_PORT= eth_port->etp_osdep.etp_port;
|
mess.DL_PORT= eth_port->etp_osdep.etp_port;
|
||||||
mess.DL_PROC= this_proc;
|
mess.DL_PROC= this_proc;
|
||||||
mess.DL_MODE= DL_NOMODE;
|
mess.DL_MODE= DL_NOMODE;
|
||||||
|
@ -191,7 +238,7 @@ acc_t *pack;
|
||||||
message mess1, block_msg;
|
message mess1, block_msg;
|
||||||
int i, pack_size;
|
int i, pack_size;
|
||||||
acc_t *pack_ptr;
|
acc_t *pack_ptr;
|
||||||
iovec_t *iovec;
|
iovec_s_t *iovec;
|
||||||
u8_t *eth_dst_ptr;
|
u8_t *eth_dst_ptr;
|
||||||
int multicast, r;
|
int multicast, r;
|
||||||
ev_arg_t ev_arg;
|
ev_arg_t ev_arg;
|
||||||
|
@ -207,7 +254,17 @@ acc_t *pack;
|
||||||
for (i=0, pack_ptr= pack; i<IOVEC_NR && pack_ptr; i++,
|
for (i=0, pack_ptr= pack; i<IOVEC_NR && pack_ptr; i++,
|
||||||
pack_ptr= pack_ptr->acc_next)
|
pack_ptr= pack_ptr->acc_next)
|
||||||
{
|
{
|
||||||
iovec[i].iov_addr= (vir_bytes)ptr2acc_data(pack_ptr);
|
r= cpf_setgrant_direct(iovec[i].iov_grant,
|
||||||
|
eth_port->etp_osdep.etp_task,
|
||||||
|
(vir_bytes)ptr2acc_data(pack_ptr),
|
||||||
|
(vir_bytes)pack_ptr->acc_length,
|
||||||
|
CPF_READ);
|
||||||
|
if (r != 0)
|
||||||
|
{
|
||||||
|
ip_panic((
|
||||||
|
"eth_write_port: cpf_setgrant_direct failed: %d\n",
|
||||||
|
errno));
|
||||||
|
}
|
||||||
pack_size += iovec[i].iov_size= pack_ptr->acc_length;
|
pack_size += iovec[i].iov_size= pack_ptr->acc_length;
|
||||||
}
|
}
|
||||||
if (i>= IOVEC_NR)
|
if (i>= IOVEC_NR)
|
||||||
|
@ -218,28 +275,39 @@ acc_t *pack;
|
||||||
for (i=0, pack_ptr= pack; i<IOVEC_NR && pack_ptr;
|
for (i=0, pack_ptr= pack; i<IOVEC_NR && pack_ptr;
|
||||||
i++, pack_ptr= pack_ptr->acc_next)
|
i++, pack_ptr= pack_ptr->acc_next)
|
||||||
{
|
{
|
||||||
iovec[i].iov_addr= (vir_bytes)ptr2acc_data(pack_ptr);
|
r= cpf_setgrant_direct(iovec[i].iov_grant,
|
||||||
|
eth_port->etp_osdep.etp_task,
|
||||||
|
(vir_bytes)ptr2acc_data(pack_ptr),
|
||||||
|
(vir_bytes)pack_ptr->acc_length,
|
||||||
|
CPF_READ);
|
||||||
|
if (r != 0)
|
||||||
|
{
|
||||||
|
ip_panic((
|
||||||
|
"eth_write_port: cpf_setgrant_direct failed: %d\n",
|
||||||
|
errno));
|
||||||
|
}
|
||||||
pack_size += iovec[i].iov_size= pack_ptr->acc_length;
|
pack_size += iovec[i].iov_size= pack_ptr->acc_length;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assert (i< IOVEC_NR);
|
assert (i< IOVEC_NR);
|
||||||
assert (pack_size >= ETH_MIN_PACK_SIZE);
|
assert (pack_size >= ETH_MIN_PACK_SIZE);
|
||||||
|
|
||||||
if (i == 1)
|
|
||||||
|
r= cpf_setgrant_direct(eth_port->etp_osdep.etp_wr_vec_grant,
|
||||||
|
eth_port->etp_osdep.etp_task,
|
||||||
|
(vir_bytes)iovec,
|
||||||
|
(vir_bytes)(i * sizeof(iovec[0])),
|
||||||
|
CPF_READ);
|
||||||
|
if (r != 0)
|
||||||
{
|
{
|
||||||
/* simple packets can be sent using DL_WRITE instead of
|
ip_panic((
|
||||||
* DL_WRITEV.
|
"eth_write_port: cpf_setgrant_direct failed: %d\n",
|
||||||
*/
|
errno));
|
||||||
mess1.DL_COUNT= iovec[0].iov_size;
|
|
||||||
mess1.DL_ADDR= (char *)iovec[0].iov_addr;
|
|
||||||
mess1.m_type= DL_WRITE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
mess1.DL_COUNT= i;
|
|
||||||
mess1.DL_ADDR= (char *)iovec;
|
|
||||||
mess1.m_type= DL_WRITEV;
|
|
||||||
}
|
}
|
||||||
|
mess1.DL_COUNT= i;
|
||||||
|
mess1.DL_GRANT= eth_port->etp_osdep.etp_wr_vec_grant;
|
||||||
|
mess1.m_type= DL_WRITEV_S;
|
||||||
|
|
||||||
mess1.DL_PORT= eth_port->etp_osdep.etp_port;
|
mess1.DL_PORT= eth_port->etp_osdep.etp_port;
|
||||||
mess1.DL_PROC= this_proc;
|
mess1.DL_PROC= this_proc;
|
||||||
mess1.DL_MODE= DL_NOMODE;
|
mess1.DL_MODE= DL_NOMODE;
|
||||||
|
@ -426,14 +494,23 @@ eth_port_t *eth_port;
|
||||||
eth_stat_t *eth_stat;
|
eth_stat_t *eth_stat;
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
|
cp_grant_id_t gid;
|
||||||
message mess, mlocked;
|
message mess, mlocked;
|
||||||
|
|
||||||
assert(!eth_port->etp_vlan);
|
assert(!eth_port->etp_vlan);
|
||||||
|
|
||||||
mess.m_type= DL_GETSTAT;
|
gid= cpf_grant_direct(eth_port->etp_osdep.etp_task,
|
||||||
|
(vir_bytes)eth_stat, sizeof(*eth_stat), CPF_WRITE);
|
||||||
|
if (gid == -1)
|
||||||
|
{
|
||||||
|
ip_panic(( "eth_get_stat: cpf_grant_direct failed: %d\n",
|
||||||
|
errno));
|
||||||
|
}
|
||||||
|
|
||||||
|
mess.m_type= DL_GETSTAT_S;
|
||||||
mess.DL_PORT= eth_port->etp_osdep.etp_port;
|
mess.DL_PORT= eth_port->etp_osdep.etp_port;
|
||||||
mess.DL_PROC= this_proc;
|
mess.DL_PROC= this_proc;
|
||||||
mess.DL_ADDR= (char *)eth_stat;
|
mess.DL_GRANT= gid;
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
|
@ -447,6 +524,7 @@ eth_stat_t *eth_stat;
|
||||||
compare(mlocked.m_type, ==, DL_TASK_REPLY);
|
compare(mlocked.m_type, ==, DL_TASK_REPLY);
|
||||||
eth_rec(&mlocked);
|
eth_rec(&mlocked);
|
||||||
}
|
}
|
||||||
|
cpf_revoke(gid);
|
||||||
|
|
||||||
if (r != OK)
|
if (r != OK)
|
||||||
{
|
{
|
||||||
|
@ -493,7 +571,7 @@ u32_t flags;
|
||||||
if (flags & NWEO_EN_PROMISC)
|
if (flags & NWEO_EN_PROMISC)
|
||||||
dl_flags |= DL_PROMISC_REQ;
|
dl_flags |= DL_PROMISC_REQ;
|
||||||
|
|
||||||
mess.m_type= DL_INIT;
|
mess.m_type= DL_CONF;
|
||||||
mess.DL_PORT= eth_port->etp_osdep.etp_port;
|
mess.DL_PORT= eth_port->etp_osdep.etp_port;
|
||||||
mess.DL_PROC= this_proc;
|
mess.DL_PROC= this_proc;
|
||||||
mess.DL_MODE= dl_flags;
|
mess.DL_MODE= dl_flags;
|
||||||
|
@ -522,7 +600,7 @@ u32_t flags;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert (mess.m_type == DL_INIT_REPLY);
|
assert (mess.m_type == DL_CONF_REPLY);
|
||||||
if (mess.m3_i1 != eth_port->etp_osdep.etp_port)
|
if (mess.m3_i1 != eth_port->etp_osdep.etp_port)
|
||||||
{
|
{
|
||||||
ip_panic(("got reply for wrong port"));
|
ip_panic(("got reply for wrong port"));
|
||||||
|
@ -583,7 +661,7 @@ eth_port_t *eth_port;
|
||||||
eth_port_t *loc_port;
|
eth_port_t *loc_port;
|
||||||
acc_t *pack, *pack_ptr;
|
acc_t *pack, *pack_ptr;
|
||||||
message mess1, block_msg;
|
message mess1, block_msg;
|
||||||
iovec_t *iovec;
|
iovec_s_t *iovec;
|
||||||
ev_arg_t ev_arg;
|
ev_arg_t ev_arg;
|
||||||
int i, r;
|
int i, r;
|
||||||
|
|
||||||
|
@ -600,22 +678,44 @@ eth_port_t *eth_port;
|
||||||
for (i=0, pack_ptr= pack; i<RD_IOVEC && pack_ptr;
|
for (i=0, pack_ptr= pack; i<RD_IOVEC && pack_ptr;
|
||||||
i++, pack_ptr= pack_ptr->acc_next)
|
i++, pack_ptr= pack_ptr->acc_next)
|
||||||
{
|
{
|
||||||
iovec[i].iov_addr= (vir_bytes)ptr2acc_data(pack_ptr);
|
r= cpf_setgrant_direct(iovec[i].iov_grant,
|
||||||
|
eth_port->etp_osdep.etp_task,
|
||||||
|
(vir_bytes)ptr2acc_data(pack_ptr),
|
||||||
|
(vir_bytes)pack_ptr->acc_length,
|
||||||
|
CPF_WRITE);
|
||||||
|
if (r != 0)
|
||||||
|
{
|
||||||
|
ip_panic((
|
||||||
|
"mnx_eth`setup_read: cpf_setgrant_direct failed: %d\n",
|
||||||
|
errno));
|
||||||
|
}
|
||||||
iovec[i].iov_size= (vir_bytes)pack_ptr->acc_length;
|
iovec[i].iov_size= (vir_bytes)pack_ptr->acc_length;
|
||||||
}
|
}
|
||||||
assert (!pack_ptr);
|
assert (!pack_ptr);
|
||||||
|
|
||||||
mess1.m_type= DL_READV;
|
r= cpf_setgrant_direct(eth_port->etp_osdep.etp_rd_vec_grant,
|
||||||
|
eth_port->etp_osdep.etp_task,
|
||||||
|
(vir_bytes)iovec,
|
||||||
|
(vir_bytes)(i * sizeof(iovec[0])),
|
||||||
|
CPF_READ);
|
||||||
|
if (r != 0)
|
||||||
|
{
|
||||||
|
ip_panic((
|
||||||
|
"mnx_eth`setup_read: cpf_setgrant_direct failed: %d\n",
|
||||||
|
errno));
|
||||||
|
}
|
||||||
|
|
||||||
|
mess1.m_type= DL_READV_S;
|
||||||
mess1.DL_PORT= eth_port->etp_osdep.etp_port;
|
mess1.DL_PORT= eth_port->etp_osdep.etp_port;
|
||||||
mess1.DL_PROC= this_proc;
|
mess1.DL_PROC= this_proc;
|
||||||
mess1.DL_COUNT= i;
|
mess1.DL_COUNT= i;
|
||||||
mess1.DL_ADDR= (char *)iovec;
|
mess1.DL_GRANT= eth_port->etp_osdep.etp_rd_vec_grant;
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
if (recv_debug)
|
if (recv_debug)
|
||||||
{
|
{
|
||||||
printf("eth%d: sending DL_READV\n",
|
printf("eth%d: sending DL_READV_S\n",
|
||||||
mess1.DL_PORT);
|
mess1.DL_PORT);
|
||||||
}
|
}
|
||||||
r= sendrec(eth_port->etp_osdep.etp_task, &mess1);
|
r= sendrec(eth_port->etp_osdep.etp_task, &mess1);
|
||||||
|
@ -795,7 +895,7 @@ int tasknr;
|
||||||
dl_flags |= DL_MULTI_REQ;
|
dl_flags |= DL_MULTI_REQ;
|
||||||
if (flags & NWEO_EN_PROMISC)
|
if (flags & NWEO_EN_PROMISC)
|
||||||
dl_flags |= DL_PROMISC_REQ;
|
dl_flags |= DL_PROMISC_REQ;
|
||||||
mess.m_type= DL_INIT;
|
mess.m_type= DL_CONF;
|
||||||
mess.DL_PORT= eth_port->etp_osdep.etp_port;
|
mess.DL_PORT= eth_port->etp_osdep.etp_port;
|
||||||
mess.DL_PROC= this_proc;
|
mess.DL_PROC= this_proc;
|
||||||
mess.DL_MODE= dl_flags;
|
mess.DL_MODE= dl_flags;
|
||||||
|
|
|
@ -19,8 +19,10 @@ typedef struct osdep_eth_port
|
||||||
int etp_task;
|
int etp_task;
|
||||||
int etp_port;
|
int etp_port;
|
||||||
int etp_recvconf;
|
int etp_recvconf;
|
||||||
iovec_t etp_wr_iovec[IOVEC_NR];
|
iovec_s_t etp_wr_iovec[IOVEC_NR];
|
||||||
iovec_t etp_rd_iovec[RD_IOVEC];
|
cp_grant_id_t etp_wr_vec_grant;
|
||||||
|
iovec_s_t etp_rd_iovec[RD_IOVEC];
|
||||||
|
cp_grant_id_t etp_rd_vec_grant;
|
||||||
event_t etp_recvev;
|
event_t etp_recvev;
|
||||||
message etp_sendrepl;
|
message etp_sendrepl;
|
||||||
message etp_recvrepl;
|
message etp_recvrepl;
|
||||||
|
|
Loading…
Reference in a new issue