📄 inet.c
字号:
/* this file contains the interface of the network software with rest of
minix. Furthermore it contains the main loop of the network task.
The valid messages and their parameters are:
from FS:
__________________________________________________________________
| | | | | | |
| m_type | DEVICE | PROC_NR | COUNT | POSITION | ADDRESS |
|_______________|___________|_________|_______|__________|_________|
| | | | | | |
| NW_OPEN | minor dev | proc nr | mode | | |
|_______________|___________|_________|_______|__________|_________|
| | | | | | |
| NW_CLOSE | minor dev | proc nr | | | |
|_______________|___________|_________|_______|__________|_________|
| | | | | | |
| NW_IOCTL | minor dev | proc nr | | NWIO.. | address |
|_______________|___________|_________|_______|__________|_________|
| | | | | | |
| NW_READ | minor dev | proc nr | count | | address |
|_______________|___________|_________|_______|__________|_________|
| | | | | | |
| NW_WRITE | minor dev | proc nr | count | | address |
|_______________|___________|_________|_______|__________|_________|
| | | | | | |
| NW_CANCEL | minor dev | proc nr | | | |
|_______________|___________|_________|_______|__________|_________|
from DL_ETH:
_______________________________________________________________________
| | | | | | |
| m_type | DL_PORT | DL_PROC | DL_COUNT | DL_STAT | DL_TIME |
|_______________|___________|_________|__________|____________|_________|
| | | | | | |
| DL_TASK_INT | minor dev | proc nr | rd_count | 0 | stat | time |
|_______________|___________|_________|__________|____________|_________|
| | | | | | |
| DL_TASK_REPLY | minor dev | proc nr | rd_count | err | stat | time | |
|_______________|___________|_________|__________|____________|_________|
*/
#include "inet.h"
#include <unistd.h>
#include "mq.h"
#include "proto.h"
#include "generic/assert.h"
#include "generic/arp.h"
#include "generic/buf.h"
#include "generic/clock.h"
#include "generic/eth.h"
#include "generic/ip.h"
#include "generic/sr.h"
#include "generic/tcp.h"
#include "generic/type.h"
#include "generic/udp.h"
#include "config.h"
INIT_PANIC();
_PROTOTYPE( void main, (void) );
FORWARD _PROTOTYPE( void nw_init, (void) );
PUBLIC void main()
{
mq_t *mq;
int result;
nw_init();
while (TRUE)
{
mq= mq_get();
if (!mq)
ip_panic(("out of messages"));
result= receive (ANY, &mq->mq_mess);
if (result<0)
{
ip_panic(("unable to receive: %d", result));
}
reset_time();
#if DEBUG & 256
{ where(); printf("got message from %d, type %d\n",
mq->mq_mess.m_source, mq->mq_mess.m_type); }
#endif
switch (mq->mq_mess.m_source)
{
case FS_PROC_NR:
#if DEBUG & 256
{ where(); printf("got message from fs, type %d\n", mq->mq_mess.m_type); }
#endif
sr_rec(mq);
break;
case DL_ETH:
#if DEBUG & 256
{ where(); printf("calling eth_rec\n"); }
#endif
eth_rec(&mq->mq_mess);
mq_free(mq);
break;
case SYN_ALRM_TASK:
clck_tick (&mq->mq_mess);
mq_free(mq);
break;
default:
ip_panic(("message from unknown source: %d",
mq->mq_mess.m_source));
}
}
ip_panic(("task is not allowed to terminate"));
}
PRIVATE void nw_init()
{
#if DEBUG & 256
{ where(); printf("starting mq_init()\n"); }
#endif
mq_init();
#if DEBUG & 256
{ where(); printf("starting bf_init()\n"); }
#endif
bf_init();
#if DEBUG & 256
{ where(); printf("starting clck_init()\n"); }
#endif
clck_init();
#if DEBUG & 256
{ where(); printf("starting sr_init()\n"); }
#endif
sr_init();
#if DEBUG & 256
{ where(); printf("starting eth_init()\n"); }
#endif
eth_init();
#if DEBUG & 256
{ where(); printf("starting arp_init()\n"); }
#endif
#if ENABLE_ARP
arp_init();
#endif
#if DEBUG & 256
{ where(); printf("starting ip_init()\n"); }
#endif
#if ENABLE_IP
ip_init();
#endif
#if DEBUG & 256
{ where(); printf("starting tcp_init()\n"); }
#endif
#if ENABLE_TCP
tcp_init();
#endif
#if DEBUG & 256
{ where(); printf("starting udp_init()\n"); }
#endif
#if ENABLE_UDP
udp_init();
#endif
}
void abort()
{
sys_abort(RBT_PANIC);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -