Initial convertion to asynchronous sends for communicating with ethernet

drivers.
This commit is contained in:
Philip Homburg 2007-04-23 14:49:20 +00:00
parent b613f5cb4b
commit 0bd4c5ee7d
7 changed files with 671 additions and 564 deletions

View File

@ -100,7 +100,8 @@ PUBLIC void eth_init()
eth_fd_table[i].ef_flags= EFF_EMPTY;
for (i=0; i<eth_conf_nr; i++)
{
eth_port_table[i].etp_flags= EFF_EMPTY;
eth_port_table[i].etp_flags= EPF_EMPTY;
eth_port_table[i].etp_getstat= NULL;
eth_port_table[i].etp_sendq_head= NULL;
eth_port_table[i].etp_sendq_tail= NULL;
eth_port_table[i].etp_type_any= NULL;
@ -346,6 +347,15 @@ ioreq_t req;
return NW_SUSPEND;
}
if (eth_port->etp_getstat)
{
printf(
"eth_ioctl: pending eth_get_stat request, suspending caller\n");
assert(!(eth_fd->ef_flags & EFF_IOCTL_IP));
eth_fd->ef_flags |= EFF_IOCTL_IP;
return NW_SUSPEND;
}
acc= bf_memreq(sizeof(nwio_ethstat_t));
compare (bf_bufsize(acc), ==, sizeof(*ethstat));
@ -356,6 +366,20 @@ ioreq_t req;
{
result= eth_get_stat(eth_port,
&ethstat->nwes_stat);
if (result == SUSPEND)
{
printf(
"eth_ioctl: eth_get_stat returned SUSPEND\n");
eth_fd->ef_ioctl_req= req;
assert(!(eth_fd->ef_flags &
EFF_IOCTL_IP));
eth_fd->ef_flags |= EFF_IOCTL_IP;
printf("eth_ioctl: setting etp_getstat in port %d to %p\n",
eth_port-eth_port_table, acc);
eth_port->etp_getstat= acc;
acc= NULL;
return NW_SUSPEND;
}
if (result != NW_OK)
{
bf_afree(acc);
@ -993,8 +1017,18 @@ eth_port_t *vlan_port;
PUBLIC void eth_restart_ioctl(eth_port)
eth_port_t *eth_port;
{
int i;
int i, r;
eth_fd_t *eth_fd;
acc_t *acc;
printf("in eth_restart_ioctl\n");
/* eth_restart_ioctl is called on too occasions: when a device
* driver registers with inet and when a eth_get_stat call has
* completed. We assume the second option when etp_getstat is
* not equal to zero at the start of the call.
*/
acc= eth_port->etp_getstat;
for (i= 0, eth_fd= eth_fd_table; i<ETH_FD_NR; i++, eth_fd++)
{
@ -1007,9 +1041,36 @@ eth_port_t *eth_port;
if (eth_fd->ef_ioctl_req != NWIOGETHSTAT)
continue;
printf("eth_restart_ioctl: etp_getstat in port %d is %p\n",
eth_port-eth_port_table, acc);
if (acc != NULL)
{
printf("eth_restart_ioctl: completed getstat\n");
acc->acc_linkC++;
r= (*eth_fd->ef_put_userdata)(eth_fd->ef_srfd, 0,
acc, TRUE);
if (r >= 0)
reply_thr_put(eth_fd, NW_OK, TRUE);
eth_fd->ef_flags &= ~EFF_IOCTL_IP;
continue;
}
{ static int count; if (++count > 5) ip_panic(("too many restarts")); }
eth_fd->ef_flags &= ~EFF_IOCTL_IP;
eth_ioctl(i, eth_fd->ef_ioctl_req);
}
if (acc != NULL)
{
printf("eth_restart_ioctl: clearing etp_getstat in port %d\n",
eth_port-eth_port_table);
assert(acc == eth_port->etp_getstat);
bf_afree(acc);
eth_port->etp_getstat= NULL;
}
}
PRIVATE void packet2user (eth_fd, pack, exp_time)

View File

@ -21,6 +21,7 @@ typedef struct eth_port
int etp_flags;
ether_addr_t etp_ethaddr;
acc_t *etp_wr_pack, *etp_rd_pack;
acc_t *etp_getstat;
struct eth_fd *etp_sendq_head;
struct eth_fd *etp_sendq_tail;
struct eth_fd *etp_type_any;

View File

@ -426,6 +426,15 @@ ioreq_t req;
return (*ip_fd->if_put_userdata)(ip_fd->if_srfd,
EBADIOCTL, (acc_t *)0, TRUE);
}
if (!(ip_port->ip_flags & IPF_IPADDRSET))
{
ip_fd->if_ioctl= req;
ip_fd->if_flags |= IFF_IOCTL_IP;
printf("ip_ioctl: suspending ARP request\n");
return NW_SUSPEND;
}
result= arp_ioctl(ip_port->ip_dl.dl_eth.de_port,
ip_fd->if_srfd, req, ip_fd->if_get_userdata,
ip_fd->if_put_userdata);

View File

@ -35,7 +35,7 @@ from DL_ETH:
| m_type | DL_PORT | DL_PROC | DL_COUNT | DL_STAT | DL_TIME |
|_______________|___________|_________|__________|____________|_________|
| | | | | | |
| DL_INIT_REPLY | minor dev | proc nr | rd_count | 0 | stat | time |
| DL_CONF_REPLY | minor dev | proc nr | rd_count | 0 | stat | time |
|_______________|___________|_________|__________|____________|_________|
| | | | | | |
| DL_TASK_REPLY | minor dev | proc nr | rd_count | err | stat | time |
@ -95,7 +95,7 @@ PUBLIC void main()
{
mq_t *mq;
int r;
int source, timerand, fd;
int source, m_type, timerand, fd;
struct fssignon device;
#ifdef __minix_vmd
struct systaskinfo info;
@ -229,6 +229,7 @@ PUBLIC void main()
}
reset_time();
source= mq->mq_mess.m_source;
m_type= mq->mq_mess.m_type;
if (source == FS_PROC_NR)
{
sr_rec(mq);
@ -240,25 +241,26 @@ PUBLIC void main()
mq_free(mq);
}
#else /* Minix 3 */
else if (mq->mq_mess.m_type == SYN_ALARM)
else if (m_type == SYN_ALARM)
{
clck_tick(&mq->mq_mess);
mq_free(mq);
}
else if (mq->mq_mess.m_type == PROC_EVENT)
else if (m_type == PROC_EVENT)
{
/* signaled */
/* probably SIGTERM */
mq_free(mq);
}
else if (mq->mq_mess.m_type & NOTIFY_MESSAGE)
else if (m_type & NOTIFY_MESSAGE)
{
/* A driver is (re)started. */
eth_check_drivers(&mq->mq_mess);
mq_free(mq);
}
#endif
else if (mq->mq_mess.m_type == DL_TASK_REPLY)
else if (m_type == DL_CONF_REPLY || m_type == DL_TASK_REPLY ||
m_type == DL_NAME_REPLY || m_type == DL_STAT_REPLY)
{
eth_rec(&mq->mq_mess);
mq_free(mq);

View File

@ -23,6 +23,9 @@ Copyright 1995 Philip Homburg
#include <minix/sysutil.h>
#include <minix/syslib.h>
#include "inet_config.h"
#include "inet.h"
THIS_FILE
struct eth_conf eth_conf[IP_PORT_MAX];
struct psip_conf psip_conf[IP_PORT_MAX];
@ -213,6 +216,13 @@ void read_conf(void)
struct ip_conf *icp;
struct stat st;
{ static int first= 1;
if (!first) ip_panic(( "read_conf: called a second time" ));
first= 0;
*(u8_t *)0 = 0xcc; /* INT 3 */
}
/* Open the configuration file. */
if ((cfg_fd= open(PATH_INET_CONF, O_RDONLY)) == -1)
fatal(PATH_INET_CONF);

File diff suppressed because it is too large Load Diff

View File

@ -16,6 +16,8 @@ Copyright 1995 Philip Homburg
typedef struct osdep_eth_port
{
int etp_state;
int etp_flags;
int etp_task;
int etp_port;
int etp_recvconf;
@ -27,8 +29,31 @@ typedef struct osdep_eth_port
event_t etp_recvev;
message etp_sendrepl;
message etp_recvrepl;
cp_grant_id_t etp_stat_gid;
eth_stat_t *etp_stat_buf;
} osdep_eth_port_t;
#define OEPS_INIT 0 /* Not initialized */
#define OEPS_CONF_SENT 1 /* Conf. request has been sent */
#define OEPS_IDLE 2 /* Device is ready to accept requests */
#define OEPS_RECV_SENT 3 /* Recv. request has been sent */
#define OEPS_SEND_SENT 4 /* Send request has been sent */
#define OEPS_GETSTAT_SENT 5 /* GETSTAT request has been sent */
#define OEPF_EMPTY 0
#define OEPF_NEED_RECV 1 /* Issue recv. request when the state becomes
* idle
*/
#define OEPF_NEED_SEND 2 /* Issue send request when the state becomes
* idle
*/
#define OEPF_NEED_CONF 4 /* Issue conf request when the state becomes
* idle
*/
#define OEPF_NEED_STAT 8 /* Issue getstat request when the state becomes
* idle
*/
#endif /* INET__OSDEP_ETH_H */
/*