From: Jon M. <jon...@er...> - 2004-05-20 17:01:14
|
Sounds good. Does this mean that the problem from yesterday is solved? If so, it puzzles me that this problem showed up now, after my seemingly unrelated changes, and not earlier. /jon Mark Haverkamp wrote: On Wed, 2004-05-19 at 16:54, Jon Maloy wrote: The last thing I did before the port_lock changes was to add a device notifier in eth_media, and a "tipc_block_bearer()" function to handle this. I tested this with an "ifconfig eth1 down/up" (I run dual links most of the time) during traffic, and this worked fine, but when I thereafter removed the module I got a crash in bcast.c/blink_remove(), - a NULL pointer access. I corrected this (I believed) and tested it, but it seems like I have still introduced some problem here. Maybe Guo or Ling can say more about this ? Pay special attention to the flag "blocked" in the bearer, if this gets stuck with with the wrong value the traffic will never restart. Daniel and I sprinkled a few printks around and found an error in tipc_forward_buf2nameseq. The main problem was that the result from bcast_port_recv is the message data size but was being checked for non-zero to be an error. Also the result was only being checked for the local delivery, and the prev_destnode was being reset to zero inside the loop defeating its purpose. Included is a patch that works for us. One other thing, since tipc_forward_buf2nameseq returns the message data size, that means that tipc_multicast returns the same. cvs diff -u sendbcast.c Index: sendbcast.c =================================================================== RCS file: /cvsroot/tipc/source/unstable/net/tipc/sendbcast.c,v retrieving revision 1.15 diff -u -r1.15 sendbcast.c --- sendbcast.c 6 May 2004 15:35:31 -0000 1.15 +++ sendbcast.c 20 May 2004 16:08:03 -0000 @@ -167,18 +167,20 @@ { struct port *this = (struct port *) ref_deref(ref); uint res = 0; + int dsz; struct tipc_msg *m; struct mc_identity *mid = NULL; struct list_head *pos; struct sk_buff *copybuf; tipc_net_addr_t prev_destnode; + dsz = msg_data_sz(buf_msg(buf)); m = &this->publ.phdr; if (importance <= 3) msg_set_importance(m, importance); + prev_destnode = 0; list_for_each(pos, mc_head) { - prev_destnode = 0; mid = list_entry(pos, struct mc_identity, list); if (mid != NULL && (prev_destnode != mid->node)) { prev_destnode = mid->node; @@ -188,9 +190,9 @@ res = tipc_send_buf_fast(copybuf, mid->node); } else { res = bcast_port_recv(copybuf); - if (res != 0) - break; } + if (res != dsz) + break; } } buf_safe_discard(buf); |