Initial convertion to asynchronous sends for communicating with ethernet
drivers.
This commit is contained in:
		
							parent
							
								
									b613f5cb4b
								
							
						
					
					
						commit
						0bd4c5ee7d
					
				@ -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,
 | 
			
		||||
					ðstat->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)
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
 | 
			
		||||
@ -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
											
										
									
								
							@ -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 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user