120 if (freeslot == -1) {
123 }
else if (icmptr->
icremip == remip) {
128 if (freeslot == -1) {
167 if ( (icmpid < 0) || (icmpid >=
ICMP_SLOTS) ) {
192 }
else if (msg !=
OK) {
210 for (i=0; i<datalen; i++) {
214 *buff++ = *icdataptr++;
242 pkt =
icmp_mkpkt(remip, type, ident, seq, buf, len);
269 static uint32 ipident=32767;
276 panic(
"icmp_mkpkt: cannot get a network buffer\n");
324 if ( (icmpid < 0) || (icmpid >=
ICMP_SLOTS) ) {
371 scount = buflen >> 1;
374 for (; scount > 0; scount--) {
376 cksum +=
ntohs(word);
381 if ( (buflen & 0x01) !=0 ) {
382 cksum += 0xFFFF & ((
uint32) (*((
byte *) sptr) << 8));
384 cksum += (cksum >> 16);
385 cksum = 0xffff & ~cksum;
386 return (
uint16) (0xffff & cksum);
struct netpacket * icmp_mkpkt(uint32 remip, uint16 type, uint16 ident, uint16 seq, char *buf, int32 len)
unsigned char byte
符号なし8ビット値(unsigned char)
struct icmpentry icmptab[ICMP_SLOTS]
struct netpacket * icqueue[ICMP_QSIZ]
#define IP_HDR_LEN
IPヘッダのバイト数。
syscall send(pid32, umsg32)
プロセスにメッセージを送信し、受信側が待機状態の場合はREADY状態にする。
byte net_ethsrc[ETH_ADDR_LEN]
#define TIMEOUT
システムコールがタイムアウトした場合
int32 status
ステータスを意味する返り値の型(OK/SYSERR)
#define IP_ICMP
IP向けのICMPプロトコルタイプ
uint32 umsg32
プロセス間で渡されるメッセージ
status resched_cntl(int32)
再スケジューリングを延期させるか、もしくは許可させるかを制御する。
byte ethucast[ETH_ADDR_LEN]
uint16 icmp_cksum(char *buf, int32 buflen)
int32 icmp_recv(int32 icmpid, char *buff, int32 len, uint32 timeout)
void icmp_ntoh(struct netpacket *pktptr)
umsg32 recvclr(void)
受信メッセージをクリアし、待機している場合はメッセージを返す。
#define DEFER_STOP
遅延リスケジューリングの停止
uint32 intmask
保存された割り込みマスク
#define DEFER_START
遅延リスケジューリングの開始
int int32
符号あり32ビット整数(int)
int32 icmp_register(uint32 remip)
unsigned short uint16
符号なし16ビット整数(unsigned short)
char * getbuf(bpid32)
事前に確保されたバッファプールからバッファを取得する。
void panic(char *)
Panic状態に陥った旨のメッセージを表示し、全てのプロセスを停止させる。
void icmp_hton(struct netpacket *pktptr)
status icmp_release(int32 icmpid)
syscall freebuf(char *)
バッファプールから取得したバッファを解放する。
status icmp_send(uint32 remip, uint16 type, uint16 ident, uint16 seq, char *buf, int32 len)
status ip_enqueue(struct netpacket *)
status ip_send(struct netpacket *)
unsigned int uint32
符号なし32ビット整数(unsigned int)
void * memcpy(void *, const void *, int32)
メモリAの領域(source)からメモリBの領域(Destination)にN Byteコピーする。
void icmp_in(struct netpacket *pkt)
intmask disable(void)
割り込み禁止(intr.Sに定義がある)