Beispiel #1
0
/************************************************************************
 * control_console
 *
 * 引数:	caller
 *		packet
 *
 * 返値:	E_NOSPT を返す。
 *
 * 処理:
 *
 */
W
control_console (ID caller, DDEV_CTL_REQ *packet)
{
  DDEV_RES	res;

  switch (packet->cmd)
    {
    case CONSOLE_CLEAR:
      clear_console ();
      res.body.ctl_res.dd = packet->dd;
      res.body.ctl_res.errcd = E_OK;
      res.body.ctl_res.errinfo = E_OK;
      snd_mbf (caller, sizeof (res), &res);
      return (E_OK);

    case CONSOLE_MOVE:
      if (packet->len != 2)
	{
	  res.body.ctl_res.dd = packet->dd;
	  res.body.ctl_res.errcd = E_PAR;
	  res.body.ctl_res.errinfo = E_PAR;
	  snd_mbf (caller, sizeof (res), &res);
	  return (E_PAR);
	}
      set_curpos (packet->param[0], packet->param[1]);
      res.body.ctl_res.dd = packet->dd;
      res.body.ctl_res.errcd = E_OK;
      res.body.ctl_res.errinfo = E_OK;
      snd_mbf (caller, sizeof (res), &res);
      return (E_OK);

    default:
      res.body.ctl_res.dd = packet->dd;
      res.body.ctl_res.errcd = E_NOSPT;
      res.body.ctl_res.errinfo = E_NOSPT;
      snd_mbf (caller, sizeof (res), &res);
      return (E_NOSPT);
    }
}
void
task3(intptr_t exinf)
{
	ER_UINT	ercd;

	check_point(7);
	ercd = snd_mbf(MBF1, string2, 26);
	check_ercd(ercd, E_OK);

	check_point(12);
	ercd = wup_tsk(TASK1);
	check_ercd(ercd, E_OK);

	check_point(14);
	ercd = snd_mbf(MBF1, string3, 10);
	check_ercd(ercd, E_OK);

	check_point(18);
	ercd = snd_mbf(MBF1, string2, 26);
	check_ercd(ercd, E_OK);

	check_point(20);
	check_assert(strncmp(buf1, string2, 26) == 0);

	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 26);

	check_assert(strncmp(buf1, string1, 26) == 0);

	ercd = chg_pri(TASK2, TPRI_INI);
	check_ercd(ercd, E_OK);

	check_point(21);
	ercd = snd_mbf(MBF1, string1, 26);
	check_ercd(ercd, E_OK);

	check_point(0);
}
Beispiel #3
0
static W
read_device2 (ID device, W offset, UW dd, W size, void *buf)
{
  DDEV_REQ	req;		/* 要求パケット */
  DDEV_RES	res;		/* 返答パケット */
  ER		error;	
  W		rsize;
#ifdef notdef
  W		i;
#endif

/*  printf ("*** READ *** %d, offset = %d, size = %d\n", device, offset, size); */
  req.header.mbfid = dev_recv;
  req.header.msgtyp = DEV_REA;
  req.body.rea_req.dd = dd;
  req.body.rea_req.start = offset;
  req.body.rea_req.size = size;
  error = snd_mbf (device, sizeof (req), &req);
  if (error != E_OK)
    {
/*      printf ("cannot send packet. %d\n", error); */
      return (error);
    }
/*  printf ("kernel: snd_mbf\n");	/* */
  rsize = sizeof (res);
  rcv_mbf ((UB *)&res, (INT *)&rsize, dev_recv);
/*  printf ("read_device2: rcv_mbf\n");	/* */
/*  printf ("res.dd      = %d\n", res.body.rea_res.dd); */
/*  printf ("res.error   = %d\n", res.body.rea_res.errcd); */
/*  printf ("res.errinfo = %d\n", res.body.rea_res.errinfo); */
  if (res.body.rea_res.a_size > 0)
    {
/*      printf ("res.a_size  = 0x%x\n",  res.body.rea_res.a_size); */
      bcopy ((B*)res.body.rea_res.dt, buf, size);
    }
#ifdef notdef
  for (i = 0; i < 8; i++)
    {
      printf ("0x%x, ", res.body.rea_res.dt[i]);
    }
#endif
  return (E_OK);
}
Beispiel #4
0
/************************************************************************
 * write_console
 *
 * 引数:	caller
 *		packet
 *
 * 返値:	
 *
 * 処理:	カレントポインタの位置に文字列を表示する。
 *		このとき、エスケープシーケンスによる処理も行う。		
 *
 */
W
write_console(ID caller, DDEV_WRI_REQ *packet)
{
  DDEV_RES	res;
  int		i;
  ER		error;

  error = E_OK;
  for (i = 0; i < (packet->size); i++)
    {
      error = write_char (packet->dt[i]);
      if (error != E_OK)
	break;
    }  
  res.body.wri_res.dd = packet->dd;
  res.body.wri_res.errcd = error;
  res.body.wri_res.errinfo = error;
  res.body.wri_res.a_size = i;
  snd_mbf (caller, sizeof (res), &res);
  return (error);
}
Beispiel #5
0
/*************************************************************************
 * read_keyboard --- 
 *
 * 引数:	caller
 *		packet
 *
 * 返値:	E_OK を返す。
 *
 * 処理:	メッセージの送り手に読み込んだ文字列を返す。
 *
 */
W
read_keyboard (ID caller, DDEV_REA_REQ *packet)
{
  DDEV_RES	res;
  W		i;

  res.body.rea_res.dd = packet->dd;
  for (i = 0; i < packet->size; i++)
    {
      res.body.rea_res.dt[i] = read_key (driver_mode);
    }
  res.body.rea_res.a_size = i;
  res.body.rea_res.errcd = E_OK;
  res.body.rea_res.errinfo = E_OK;

#if 0
  dbg_printf("KEYBOARD: send to caller\n");
#endif
  snd_mbf (caller, sizeof (res), &res);
  return (E_OK);
}
Beispiel #6
0
W send_switch_msg()
{
  DDEV_REQ	req;
  DDEV_RES	res;
  W		rsize;
  W		error;

  if (wconsole == 0) {
    if (find_port (WCONSOLE_DRIVER, &wconsole) != E_PORT_OK)
      return(E_DEV);
  }
  if (local_recv == 0) {
    local_recv = get_port (sizeof (DDEV_RES), sizeof (DDEV_RES));
    if (local_recv <= 0) return(E_NOMEM);
  }

  req.header.mbfid = local_recv;
  req.header.msgtyp = DEV_CTL;
  req.body.ctl_req.cmd = WC_CHGFCS;
  req.body.ctl_req.len = 0;
#ifdef notdef
  dbg_printf("KEYBOARD: send to wconsole\n");
#endif
  error = snd_mbf (wconsole, sizeof (req), &req);
  if (error != E_OK) {
    dbg_printf("KEYBOARD: can't send to wconsole %d\n", error);
    return (error);
  }
  rsize = sizeof (res);
#ifdef notdef
  dbg_printf("KEYBOARD: wait from wconsole\n");
#endif
  error = rcv_mbf (&res, (INT *)&rsize, local_recv);
#ifdef notdef
  dbg_printf("KEYBOARD: recv from wconsole\n");
#endif
  if (res.body.ctl_res.errcd != E_OK) {
    return (res.body.ctl_res.errcd);
  }
}
Beispiel #7
0
/* relay_keyboard()
 */
W relay_keyboard (ID caller, DDEV_RLY_REQ *packet)
{
  DDEV_REQ	req;
  W		i;

  req.header.mbfid = local_recv;
  req.header.msgtyp = DEV_RLY;
  req.body.rly_req.dd = packet->dd;
#ifdef notdef
  dbg_printf("KEYBOARD: read %d\n", packet->size);
#endif
  for (i = 0; i < packet->size; i++)
    {
      req.body.rly_req.dt[i] = read_key (driver_mode);
    }
  req.body.rly_req.size = i;

#ifdef notdef
  dbg_printf("KEYBORAD: send relay to wconsole\n");
#endif
  snd_mbf (caller, sizeof (req), &req);
  return (E_OK);
}
void
task2(intptr_t exinf)
{
	ER_UINT	ercd;

	check_point(2);
	ercd = snd_mbf(MBF1, string1, 26);
	check_ercd(ercd, E_OK);

	check_point(9);
	check_assert(strncmp(buf1, string1, 26) == 0);

	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 26);

	check_assert(strncmp(buf1, string2, 26) == 0);

	check_point(10);
	ercd = snd_mbf(MBF1, string3, 10);
	check_ercd(ercd, E_OK);

	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string3, 10) == 0);

	check_point(11);
	ercd = snd_mbf(MBF1, string1, 26);
	check_ercd(ercd, E_OK);

	check_point(16);
	check_assert(strncmp(buf1, string1, 26) == 0);

	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string3, 10) == 0);

	check_point(17);
	ercd = snd_mbf(MBF1, string1, 26);
	check_ercd(ercd, E_OK);

	check_point(22);
	ercd = snd_mbf(MBF1, string2, 10);
	check_ercd(ercd, E_OK);

	check_point(25);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string2, 10) == 0);

	ercd = chg_pri(TASK3, TPRI_INI);
	check_ercd(ercd, E_OK);

	check_point(26);
	ercd = snd_mbf(MBF1, string3, 10);
	check_ercd(ercd, E_OK);

	check_point(28);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string3, 10) == 0);

	ercd = chg_pri(TASK3, TPRI_INI);
	check_ercd(ercd, E_OK);

	check_point(29);
	ercd = snd_mbf(MBF1, string1, 26);
	check_ercd(ercd, E_OK);

	check_point(31);
	check_assert(strncmp(buf1, string1, 26) == 0);

	ercd = chg_pri(TSK_SELF, TPRI_INI);
	check_ercd(ercd, E_OK);

	check_point(32);
	ercd = snd_mbf(MBF1, string2, 10);
	check_ercd(ercd, E_OK);

	check_point(35);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string2, 10) == 0);

	ercd = chg_pri(TSK_SELF, TPRI_INI);
	check_ercd(ercd, E_OK);

	check_point(36);
	ercd = snd_mbf(MBF1, string3, 10);
	check_ercd(ercd, E_OK);

	check_point(38);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string3, 10) == 0);

	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 26);

	check_assert(strncmp(buf1, string1, 26) == 0);

	check_finish(39);
	check_point(0);
}
Beispiel #9
0
/*
 * ポートマネージャにメッセージバッファ情報を登録する。
 * この関数の中で一時的に受信用のメッセージポートを作成する。
 *
 */
PORT_MANAGER_ERROR
regist_port (PORT_NAME *name, ID port)
{
  struct recv_port_message_t	recv_msg;
  struct port_manager_msg_t  	send_msg;
  ID			     	recv_port;
  W			     	rsize;


  /*
   * ポートマネージャからの返答受けつけ用のメッセージバッファ作成。
   */
  recv_port = get_port (sizeof (recv_msg), sizeof (recv_msg));
  if (recv_port == 0)
    {
#ifdef DEBUG
      dbg_printf ("regist_port: cannot get port.\n");
#endif /* DEBUG */
      return (E_PORT_SYSTEM);
    }

  /*
   * ポートマネージャへ送る要求メッセージを作成。
   */
  send_msg.hdr.type  = REGIST_PORT;
  send_msg.hdr.size  = sizeof (send_msg);
  send_msg.hdr.rport = recv_port;
  strcpy (&(send_msg.body.regist.name), name);
  send_msg.body.regist.port = port;

#ifdef DEBUG
  dbg_printf ("regist_port: name = <%s>\n", &(send_msg.body.regist.name));
#endif /* DEBUG */

  /*
   * ポートマネージャに対して登録要求メッセージを送信する。
   */
  if (snd_mbf (PORT_MANAGER_PORT, sizeof (send_msg), &send_msg) != E_OK)
    {
      del_mbf (recv_port);
      return (E_PORT_SYSTEM);
    }

#ifdef DEBUG
  dbg_printf ("port_manager:snd_msg: ok.\n");
#endif /* DEBUG */

  /*
   * ポートマネージャからの返答メッセージの受けつけ
   */
  if (rcv_mbf (&recv_msg, &rsize, recv_port) != E_OK)
    {
      del_mbf (recv_port);
      return (E_PORT_SYSTEM);
    }

#ifdef DEBUG
  dbg_printf ("port_manager:rcv_msg: ok.\n");
#endif /* DEBUG */


  /*
   * 使いおわった返答受信用のメッセージバッファを削除する。
   */
  del_mbf (recv_port);

#ifdef DEBUG
  dbg_printf ("port_manager: errno = %d\n", recv_msg.error);
#endif /* DEBUG */
  return (recv_msg.error);
}
Beispiel #10
0
/* sfs_read_device - デバイスからデータを読み込む
 *
 */
W
sfs_read_device (ID device, B *buf, W start, W length, W *rlength)
{
  DDEV_REQ	req;		/* 要求パケット */
  DDEV_RES	res;		/* 返答パケット */
  ID		res_port;
  W		errno;
  W		rest_length;
  W		rsize;
  ID		send_port;
  UW		dd;

  errno = get_device_info (device, &send_port, &dd);
  if (errno)
    {
      return (errno);
    }

  res_port = get_port (sizeof (res), sizeof (res));
  if (res_port <= 0)
    {
      return (EP_NOMEM);
    }

#ifdef notdef
  printk ("sfs_read_device: start = %d, size = %d\n", start, length);
#endif /* FMDEBUG */

  *rlength = 0;
  for (rest_length = length; rest_length > 0; rest_length -=  BLOCK_SIZE)
    {
      req.header.mbfid = res_port;
      req.header.msgtyp = DEV_REA;
      req.body.rea_req.dd = dd;
      req.body.rea_req.start = start + (length - rest_length);
      req.body.rea_req.size
	= (BLOCK_SIZE > rest_length) ? rest_length : BLOCK_SIZE;
      errno = snd_mbf (send_port, sizeof (req), &req);
      if (errno != E_OK)
	{
	  dbg_printf ("cannot send packet. %d\n", errno); 	/* */
	  del_mbf (res_port);
	  return (errno);
	}
  
      rsize = sizeof (res);
      errno = rcv_mbf ((UB *)&res, (VP)&rsize, res_port);
      if (errno != E_OK)
	{
	  dbg_printf ("cannot send packet. %d\n", errno); 	/* */
	  del_mbf (res_port);
	  return (errno);
	}
      else if (res.body.rea_res.errinfo != E_OK) {
	  del_mbf (res_port);
	  return (res.body.rea_res.errinfo);
      }

      bcopy (res.body.rea_res.dt, &buf[length - rest_length],
	     res.body.rea_res.a_size);
      *rlength += res.body.rea_res.a_size;
    }

  del_mbf (res_port);
  return (E_OK);
}
void
task3(intptr_t exinf)
{
	ER_UINT	ercd;

	check_point(3);
	ercd = snd_mbf(MBF1, string2, 26);
	check_ercd(ercd, E_OK);

	check_point(7);
	ercd = snd_mbf(MBF1, string3, 10);
	check_ercd(ercd, E_OK);

	check_point(9);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string3, 10) == 0);

	check_point(10);
	ercd = act_tsk(TASK2);
	check_ercd(ercd, E_OK);

	check_point(12);
	ercd = wup_tsk(TASK1);
	check_ercd(ercd, E_OK);

	check_point(14);
	ercd = ter_tsk(TASK2);
	check_ercd(ercd, E_OK);

	check_point(17);
	ercd = snd_mbf(MBF1, string2, 26);
	check_ercd(ercd, E_OK);

	check_point(22);
	ercd = snd_mbf(MBF1, string3, 10);
	check_ercd(ercd, E_OK);

	check_point(25);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string3, 10) == 0);

	check_point(26);
	ercd = wup_tsk(TASK2);
	check_ercd(ercd, E_OK);

	check_point(28);
	ercd = wup_tsk(TASK1);
	check_ercd(ercd, E_OK);

	check_point(30);
	ercd = rel_wai(TASK2);
	check_ercd(ercd, E_OK);

	check_point(33);
	ercd = snd_mbf(MBF1, string2, 26);
	check_ercd(ercd, E_OK);

	check_point(40);
	ercd = snd_mbf(MBF1, string3, 10);
	check_ercd(ercd, E_OK);

	check_point(44);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string3, 10) == 0);

	check_point(45);
	ercd = wup_tsk(TASK2);
	check_ercd(ercd, E_OK);

	check_point(47);
	ercd = wup_tsk(TASK1);
	check_ercd(ercd, E_OK);

	check_point(49);
	ercd = sta_alm(ALM1, 1000U);
	check_ercd(ercd, E_OK);

	ercd = slp_tsk();
	check_ercd(ercd, E_OK);

	check_point(53);
	ercd = snd_mbf(MBF1, string2, 26);
	check_ercd(ercd, E_OK);

	check_point(57);
	ercd = snd_mbf(MBF1, string3, 10);
	check_ercd(ercd, E_OK);

	check_point(59);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string3, 10) == 0);

	check_point(60);
	ercd = wup_tsk(TASK2);
	check_ercd(ercd, E_OK);

	check_point(62);
	ercd = wup_tsk(TASK1);
	check_ercd(ercd, E_OK);

	check_point(64);
	ercd = slp_tsk();
	check_ercd(ercd, E_OK);

	check_point(0);
}
void
task2(intptr_t exinf)
{
	ER_UINT	ercd;

	switch (++task2_count) {
	case 1:
		check_point(2);
		ercd = snd_mbf(MBF1, string1, 26);
		check_ercd(ercd, E_OK);

		check_point(0);

	case 2:
		check_point(6);
		ercd = snd_mbf(MBF1, string1, 26);
		check_ercd(ercd, E_OK);

		check_point(0);

	case 3:
		check_point(11);
		ercd = snd_mbf(MBF1, string1, 26);
		check_ercd(ercd, E_OK);

		check_point(0);

	case 4:
		check_point(16);
		ercd = snd_mbf(MBF1, string1, 26);
		check_ercd(ercd, E_RLWAI);

		check_point(19);
		ercd = slp_tsk();
		check_ercd(ercd, E_OK);

		check_point(21);
		ercd = snd_mbf(MBF1, string1, 26);
		check_ercd(ercd, E_RLWAI);

		check_point(24);
		ercd = slp_tsk();
		check_ercd(ercd, E_OK);

		check_point(27);
		ercd = snd_mbf(MBF1, string1, 26);
		check_ercd(ercd, E_RLWAI);

		check_point(32);
		ercd = snd_mbf(MBF1, string1, 26);
		check_ercd(ercd, E_RLWAI);

		check_point(37);
		ercd = slp_tsk();
		check_ercd(ercd, E_OK);

		check_point(39);
		ercd = snd_mbf(MBF1, string1, 26);
		check_ercd(ercd, E_RLWAI);

		check_point(43);
		ercd = slp_tsk();
		check_ercd(ercd, E_OK);

		check_point(46);
		ercd = snd_mbf(MBF1, string1, 26);
		check_ercd(ercd, E_RLWAI);

		check_point(52);
		ercd = tsnd_mbf(MBF1, string1, 26, 1000U);
		check_ercd(ercd, E_TMOUT);

		check_point(54);
		ercd = tslp_tsk(1000U);
		check_ercd(ercd, E_TMOUT);

		check_point(55);
		ercd = rcv_mbf(MBF1, buf1);
		check_ercd(ercd, 26);

		check_assert(strncmp(buf1, string2, 26) == 0);

		check_point(56);
		ercd = tsnd_mbf(MBF1, string1, 26, 1000U);
		check_ercd(ercd, E_TMOUT);

		check_point(58);
		ercd = slp_tsk();
		check_ercd(ercd, E_OK);

		check_point(61);
		ercd = tsnd_mbf(MBF1, string1, 26, 1000U);
		check_ercd(ercd, E_TMOUT);

		check_finish(66);
		check_point(0);

	default:
		check_point(0);
	}
	check_point(0);
}
void
task1(intptr_t exinf)
{
	ER_UINT	ercd;

	test_start(__FILE__);

	set_bit_func(bit_kernel);

	check_point(1);
	ercd = act_tsk(TASK2);
	check_ercd(ercd, E_OK);

	ercd = act_tsk(TASK3);
	check_ercd(ercd, E_OK);

	ercd = tslp_tsk(1000U);
	check_ercd(ercd, E_TMOUT);

	check_point(4);
	ercd = ter_tsk(TASK2);
	check_ercd(ercd, E_OK);

	ercd = tslp_tsk(1000U);
	check_ercd(ercd, E_TMOUT);

	check_point(5);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 26);

	check_assert(strncmp(buf1, string2, 26) == 0);

	ercd = act_tsk(TASK2);
	check_ercd(ercd, E_OK);

	ercd = tslp_tsk(1000U);
	check_ercd(ercd, E_TMOUT);

	check_point(8);
	ercd = ter_tsk(TASK2);
	check_ercd(ercd, E_OK);

	ercd = slp_tsk();
	check_ercd(ercd, E_OK);

	check_point(13);
	ercd = snd_mbf(MBF1, string3, 10);
	check_ercd(ercd, E_OK);

	check_point(15);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string3, 10) == 0);

	ercd = act_tsk(TASK2);
	check_ercd(ercd, E_OK);

	ercd = tslp_tsk(1000U);
	check_ercd(ercd, E_TMOUT);

	check_point(18);
	ercd = rel_wai(TASK2);
	check_ercd(ercd, E_OK);

	ercd = tslp_tsk(1000U);
	check_ercd(ercd, E_TMOUT);

	check_point(20);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 26);

	check_assert(strncmp(buf1, string2, 26) == 0);

	ercd = wup_tsk(TASK2);
	check_ercd(ercd, E_OK);

	ercd = tslp_tsk(1000U);
	check_ercd(ercd, E_TMOUT);

	check_point(23);
	ercd = rel_wai(TASK2);
	check_ercd(ercd, E_OK);

	ercd = slp_tsk();
	check_ercd(ercd, E_OK);

	check_point(29);
	ercd = snd_mbf(MBF1, string3, 10);
	check_ercd(ercd, E_OK);

	check_point(31);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string3, 10) == 0);

	ercd = tslp_tsk(1000U);
	check_ercd(ercd, E_TMOUT);

	check_point(34);
	ercd = sta_alm(ALM1, 1000U);
	check_ercd(ercd, E_OK);

	ercd = slp_tsk();
	check_ercd(ercd, E_OK);

	check_point(36);
	ercd = tslp_tsk(1000U);
	check_ercd(ercd, E_TMOUT);

	check_point(38);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 26);

	check_assert(strncmp(buf1, string2, 26) == 0);

	ercd = wup_tsk(TASK2);
	check_ercd(ercd, E_OK);

	ercd = tslp_tsk(1000U);
	check_ercd(ercd, E_TMOUT);

	check_point(41);
	ercd = sta_alm(ALM1, 1000U);
	check_ercd(ercd, E_OK);

	ercd = slp_tsk();
	check_ercd(ercd, E_OK);

	check_point(48);
	ercd = snd_mbf(MBF1, string3, 10);
	check_ercd(ercd, E_OK);

	check_point(51);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string3, 10) == 0);

	ercd = wup_tsk(TASK3);
	check_ercd(ercd, E_OK);

	ercd = slp_tsk();
	check_ercd(ercd, E_OK);

	check_point(63);
	ercd = snd_mbf(MBF1, string3, 10);
	check_ercd(ercd, E_OK);

	check_point(65);
	ercd = rcv_mbf(MBF1, buf1);
	check_ercd(ercd, 10);

	check_assert(strncmp(buf1, string3, 10) == 0);

	ercd = slp_tsk();
	check_ercd(ercd, E_OK);

	check_point(0);
}
Beispiel #14
0
W
ether (W ac, B **av)
{
  DDEV_REQ		req;		/* 要求パケット */
  DDEV_RES		res;		/* 返答パケット */
  W			rsize;
  ER			error;
  ID			recv;
  ID			console;


  if (ac < 1)
    {
      printf ("usage: ether command\n");
      printf ("             reset\n");
      printf ("             probe\n");
      printf ("             init\n");
      printf ("             macaddr\n");
      printf ("             arp\n");
      printf ("             \n");

      return (0);
    }

  recv = get_port (sizeof (DDEV_RES), sizeof (DDEV_RES));
  if (recv <= 0)
    {
      return (E_SYS);
    }

  if (find_port (NE2000_DRIVER, &console) != E_PORT_OK)
    {
      return (E_SYS);
    }

  if (strcmp (av[1], "reset") == 0)
    {
      /* Ether adaptor reset */

      req.header.mbfid = recv;
      req.header.msgtyp = DEV_CTL;
      req.body.ctl_req.dd = 0;
      req.body.ctl_req.cmd = NE2000_RESET;
      req.body.ctl_req.len = 0;

      error = snd_mbf (console, sizeof (req), &req);
      if (error != E_OK)
	{
	  return (error);
	}
      rsize = sizeof (res);
      error = rcv_mbf (&res, (INT *)&rsize, recv);
      if (res.body.ctl_res.errcd != E_OK)
	{
	  del_mbf (recv);
	  return (res.body.ctl_res.errcd);
	}      
    }
  else if (strcmp (av[1], "probe") == 0)
    {
      /* Ether adaptor probe */

      req.header.mbfid = recv;
      req.header.msgtyp = DEV_CTL;
      req.body.ctl_req.dd = 0;
      req.body.ctl_req.cmd = NE2000_PROBE;
      req.body.ctl_req.len = 0;

      error = snd_mbf (console, sizeof (req), &req);
      if (error != E_OK)
	{
	  return (error);
	}
      rsize = sizeof (res);
      error = rcv_mbf (&res, (INT *)&rsize, recv);
      if (res.body.ctl_res.errcd != E_OK)
	{
	  del_mbf (recv);
	  return (res.body.ctl_res.errcd);
	}      
    }
  else if (strcmp (av[1], "init") == 0)
    {
      /* Ether adaptor initialize */
    }
  else if (strcmp (av[1], "macaddr") == 0)
    {
      W		i;

      req.header.mbfid = recv;
      req.header.msgtyp = DEV_CTL;
      req.body.ctl_req.dd = 0;
      req.body.ctl_req.cmd = NE2000_GETMAC;
      req.body.ctl_req.len = 0;

      error = snd_mbf (console, sizeof (req), &req);
      if (error != E_OK)
	{
	  del_mbf (recv);
	  return (error);
	}
      rsize = sizeof (res);
      error = rcv_mbf (&res, (INT *)&rsize, recv);
      if (res.body.ctl_res.errcd != E_OK)
	{
	  del_mbf (recv);
	  return (res.body.ctl_res.errcd);
	}

      printf ("mac address: ");
      for (i = 0; i < MACADDRLEN; i++)
	{
	  printf ("%x ", res.body.ctl_res.res[i]);
	  my_macaddr[i] = res.body.ctl_res.res[i];
	}
      printf ("\n");
    }
  else if (strcmp (av[1], "arp") == 0)
    {
#define MYADDR	0xC0A80003
#define htons(s)	(UH)(((UH)s << 8) | ((UH)s >> 8))

      struct arp_buf
      {
	UB	dest_ether[6];
	UB	src_ether[6];
	UH	ether_type;

	UH	hardware;
	UH	protocol;
	UB	hardware_length;
	UB	protocol_length;
	UH	opcode;
	UB	sender_macaddr[6];
	UB	sender_ip[4];
	UB	target_macaddr[6];
	UB	target_ip[4];
      } arp;
      W		i;

      for (i = 0; i < 6; i++)
	{
	  arp.src_ether[i] = my_macaddr[i];
	  arp.dest_ether[i] = 0xff;

	  arp.sender_macaddr[i] = my_macaddr[i];
	  arp.target_macaddr[i] = 0xff;
	}
      arp.ether_type = 0x0608;

      arp.sender_ip[0] = 192;
      arp.sender_ip[1] = 168;
      arp.sender_ip[2] = 0;
      arp.sender_ip[3] = 3;
      for (i = 0; i < 4; i++)
	{
	  arp.target_ip[i] = 0xff;
	}
      arp.hardware = htons (1);
      arp.protocol = htons (0x0800);
      arp.hardware_length = 0x06;
      arp.protocol_length = 0x04;
      arp.opcode = htons (1);

      req.header.mbfid = recv;
      req.header.msgtyp = DEV_WRI;
      req.body.wri_req.dd = 0;
      req.body.wri_req.start = &arp;
      req.body.wri_req.size = sizeof (arp);
      get_tid (&req.header.tskid);

      printf ("send ether\n");
      error = snd_mbf (console, sizeof (req), &req);
      if (error != E_OK)
	{
	  del_mbf (recv);
	  return (error);
	}
      rsize = sizeof (res);
      error = rcv_mbf (&res, (INT *)&rsize, recv);
      if (res.body.ctl_res.errcd != E_OK)
	{
	  del_mbf (recv);
	  return (res.body.ctl_res.errcd);
	}
    }
  else
    {
      printf ("Unknown command: %s\n", av[1]);
      del_mbf (recv);
      return (1);
    }

  del_mbf (recv);
  return (0);
}