Date: Wed, 19 Nov 2003 11:13:47 +0900 From: "Liu, Huan (Huan)" <huanliu@lucent.com> To: "'freebsd-net@FreeBSD.ORG'" <freebsd-net@FreeBSD.ORG> Subject: re-queue delay line in ip_dummynet.c Message-ID: <0CBE0287994CD311A6AC00508B0ABDE60FC50E0A@JP0001EXCH001U>
next in thread | raw e-mail | index | archive | help
I'd like to give a pipe random delay time and re-queue packets in delay-line according to their output_time, However I always get fatal error when packets go through pipe. I guess the code get match condition when re-queue the delay line while other process may be sending a packet and delete it from delay line at same time. Here is what I modified in ip_dummynet.c float mydelay; /*cast integer random() to float*/ /* added for re-queue delay chain in move_pkt*/ struct dn_pkt *mypkt, *prepkt; static void move_pkt(struct dn_pkt *pkt, struct dn_flow_queue *q, struct dn_pipe *p, int len) { q->head = DN_NEXT(pkt) ; q->len-- ; q->len_bytes -= len ; /* example, delay 9010ms, will delay random interval range 0~10ms*/ if(p->delay >= 9000) { mydelay = random(); pkt->output_time = curr_time + (int)((mydelay/0x7fffffff)*(p->delay-9000)); } else pkt->output_time = curr_time + p->delay; if (p->head == NULL) { p->head = pkt; p->tail = pkt; } else { mypkt = p->head; prepkt = NULL; while(mypkt != NULL) { if(pkt->output_time < mypkt->output_time) { if(prepkt == NULL) { DN_NEXT(pkt) = mypkt; p->head = pkt; } else { DN_NEXT(pkt) = mypkt; DN_NEXT(prepkt) = pkt; } /* printf("no problem in move_pkt, re-chain delay line. \n"); */ break; } prepkt = mypkt; mypkt = DN_NEXT(prepkt); } if(mypkt == NULL) { DN_NEXT(p->tail) = pkt; p->tail = pkt; } } DN_NEXT(p->tail) = NULL; } I set ipfw add 500 pipe 1 icmp from 135.254.62.218 to 135.254.61.230 ipfw add 501 pipe 2 icmp from 135.254.62.230 to 135.254.61.218 ipfw pipe 1 config delay 9020ms ipfw pipe 2 config delay 9020ms Then I ping 135.254.62.218 from 135.254.61.230, the icmp will go through this freeBSD machine, after a well, the machine got page fault error and reboot. Any comment will be appreciated, I'd like to know if it's possible to re-queue delay-line. No problem found if only giving each packet a random delay time without re-queue delay line. Thanks. Huan Liu
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?0CBE0287994CD311A6AC00508B0ABDE60FC50E0A>