| | 2225 | | netoutput() | | | 2226 | | { | | | 2227 | | struct timeval tnow, tx; | | | 2228 | | struct pkt *pp, *pp2; | | | 2229 | | struct hostd *hp; | | | 2230 | | char *cp; | | | 2231 | | int len; | | | 2232 | | int cc; | | | 2233 | | char dummy[DDFRAGHDR];
| | | 2234 | | | | | 2235 | | | | | 2236 | | | | | 2237 | | | | | 2238 | | | | | 2239 | | | | | 2240 | | | | | 2241 | | if (opq->pk_tlink == opq) | | | 2242 | | return 0; | | | 2243 | | | | | 2244 | | | | | 2245 | | | | | 2246 | | | | | 2247 | | | | | 2248 | | pvmgetclock(&tnow); | | | 2249 | | | | true | 2250 | | while ((pp = opq->pk_tlink) != opq && TVXLTY(&pp->pk_rtv, &tnow)) {
| | | 2251 | | | | | 2252 | | | | | 2253 | | | | | 2254 | | | | | 2255 | | hp = pp->pk_hostd; | | | 2256 | | if (pp->pk_nrt >= DDMINRETRIES
| | | 2257 | | && pp->pk_rto.tv_sec >= DDMINTIMEOUT) {
| | | 2258 | | pvmlogprintf( | | | 2259 | | "netoutput() timed out sending to %s after %d, %d.%06d\n", | | | 2260 | | hp->hd_name, pp->pk_nrt, | | | 2261 | | pp->pk_rto.tv_sec, pp->pk_rto.tv_usec); | | | 2262 | | hd_dump(hp); | | | 2263 | | hostfailentry(hp); | | | 2264 | | clear_opq_of((int)(TIDPVMD | hp->hd_hostpart));
| | | 2265 | | ht_delete(hosts, hp); | | | 2266 | | if (newhosts) | | | 2267 | | ht_delete(newhosts, hp); | | | 2268 | | continue; | | | 2269 | | } | | | 2270 | | | | | 2271 | | cp = pp->pk_dat; | | | 2272 | | len = pp->pk_len; | | | 2273 | | if (pp->pk_flag & FFSOM) {
| | | 2274 | | cp -= MSGHDRLEN;
| | | 2275 | | len += MSGHDRLEN;
| | | 2276 | | if (cp < pp->pk_buf) { | | | 2277 | | pvmlogerror("netoutput() no headroom for message \n"); | | | 2278 | | return 0; | | | 2279 | | } | | | 2280 | | pvmput32(cp, pp->pk_enc); | | | 2281 | | pvmput32(cp + 4, pp->pk_tag); | | | 2282 | | pvmput32(cp + 8, pp->pk_ctx); | | | 2283 | | pvmput32(cp + 16, pp->pk_wid); | | | 2284 | | pvmput32(cp + 20, pp->pk_crc); | | | 2285 | | } | | | 2286 | | cp -= DDFRAGHDR;
| | | 2287 | | len += DDFRAGHDR;
| | | 2288 | | | | | 2289 | | | | | 2290 | | | | | 2291 | | | | | 2292 | | | | | 2293 | | BCOPY(cp, dummy, sizeof(dummy));
| | | 2294 | | if (cp < pp->pk_buf) { | | | 2295 | | pvmlogerror("netoutput() no headroom for packet \n"); | | | 2296 | | return 0; | | | 2297 | | } | | | 2298 | | | | | 2299 | | if (pvmdebmask & PDMPACKET) {
| | | 2300 | | pvmlogprintf( | | | 2301 | | "netoutput() pkt to %s src t%x dst t%x f %s len %d seq %d ack %d retry %d\n", | | | 2302 | | hp->hd_name, pp->pk_src, pp->pk_dst, pkt_flags(pp->pk_flag), | | | 2303 | | pp->pk_len, pp->pk_seq, pp->pk_ack, pp->pk_nrt); | | | 2304 | | } | | | 2305 | | pvmput32(cp, pp->pk_dst); | | | 2306 | | pvmput32(cp + 4, pp->pk_src); | | | 2307 | | pvmput16(cp + 8, pp->pk_seq); | | | 2308 | | pvmput16(cp + 10, pp->pk_ack); | | | 2309 | | pvmput32(cp + 12, 0); | | | 2310 | | pvmput8(cp + 12, pp->pk_flag); | | | 2311 | | #if 0 | | | 2312 | | | | | 2313 | | if (!(random() & 3)) { | | | 2314 | | pvmlogerror("netoutput() darn, dropped one\n"); | | | 2315 | | cc = -1; | | | 2316 | | } else | | | 2317 | | #endif | | | 2318 | | if ((cc = sendto(netsock, cp, len, 0, | | | 2319 | | (struct sockaddr*)&hp->hd_sad, sizeof(hp->hd_sad))) == -1 | | | 2320 | | && errno != EINTR
| | | 2321 | | #ifndef WIN32 | | | 2322 | | && errno != ENOBUFS
| | | 2323 | | #endif | | | 2324 | | #ifdef IMA_LINUX | | | 2325 | | | | | 2326 | | | | | 2327 | | #endif | | | 2328 | | | | | 2329 | | && errno != ENOMEM
| | | 2330 | | ) { | | | 2331 | | pvmlogperror("netoutput() sendto"); | | | 2332 | | #if defined(IMA_SUN4SOL2) || defined(IMA_X86SOL2) || defined(IMA_SUNMP) || defined(IMA_UXPM) || defined(IMA_UXPV) | | | 2333 | | | | | 2334 | | if (errno == ECHILD) | | | 2335 | | pvmlogerror("this message brought to you by solaris\n"); | | | 2336 | | else | | | 2337 | | #endif | | | 2338 | | pvmbailout(0); | | | 2339 | | } | | | 2340 | | #ifdef STATISTICS | | | 2341 | | if (cc == -1) | | | 2342 | | stats.sdneg++; | | | 2343 | | else | | | 2344 | | stats.sdok++; | | | 2345 | | #endif | | | 2346 | | | | | 2347 | | BCOPY(dummy, cp, sizeof(dummy));
| | | 2348 | | | | | 2349 | | | | | 2350 | | | | | 2351 | | | | | 2352 | | if (cc != -1) { | | | 2353 | | if ((pp->pk_flag & (FFFIN|FFACK)) == (FFFIN|FFACK)) {
| | | 2354 | | pk_free(pp); | | | 2355 | | if (hp != hosts->ht_hosts[0]) { | | | 2356 | | hostfailentry(hp); |
| | 2358 | | ht_delete(hosts, hp); | | | 2359 | | if (newhosts) | | | 2360 | | ht_delete(newhosts, hp); | | | 2361 | | } | | | 2362 | | continue; | | | 2363 | | } | | | 2364 | | if (!((pp->pk_flag & FFDAT)
| | | 2365 | | || (pp->pk_flag & (FFFIN|FFACK)) == FFFIN)) {
| | | 2366 | | pk_free(pp); | | | 2367 | | continue; | | | 2368 | | } | | | 2369 | | if (!TVISSET(&pp->pk_at))
| | | 2370 | | pp->pk_at = tnow; | | | 2371 | | TVXADDY(&pp->pk_rtv, &tnow, &pp->pk_rta);
| | | 2372 | | TVXADDY(&pp->pk_rto, &pp->pk_rto, &pp->pk_rta);
| | | 2373 | | #ifdef STATISTICS | | | 2374 | | if (pp->pk_nrt) | | | 2375 | | stats.netret++; | | | 2376 | | #endif | | | 2377 | | ++pp->pk_nrt; | | | 2378 | | if (pp->pk_rta.tv_sec < DDMAXRTT) {
| | | 2379 | | TVXADDY(&pp->pk_rta, &pp->pk_rta, &pp->pk_rta);
| | | 2380 | | } | | | 2381 | | | | | 2382 | | } else { | | | 2383 | | tx.tv_sec = DDERRRETRY/1000000;
| | | 2384 | | tx.tv_usec = DDERRRETRY%1000000;
| | | 2385 | | TVXADDY(&pp->pk_rtv, &tnow, &tx);
| | | 2386 | | TVXADDY(&pp->pk_rto, &pp->pk_rto, &tx);
| | | 2387 | | } | | | 2388 | | | | | 2389 | | | | | 2390 | | | | | 2391 | | LISTDELETE(pp, pk_tlink, pk_trlink);
| | | 2392 | | for (pp2 = opq->pk_trlink; pp2 != opq; pp2 = pp2->pk_trlink) | | | 2393 | | if (TVXLTY(&pp2->pk_rtv, &pp->pk_rtv))
| | | 2394 | | break; | | | 2395 | | LISTPUTAFTER(pp2, pp, pk_tlink, pk_trlink);
|
|