| 3151 | | loclinput(tp) |
| 3152 | | struct task *tp; |
| 3153 | | { |
| 3154 | | struct pkt *pp = 0; |
| 3155 | | struct pkt *pp2; |
| 3156 | | int n, m; |
| 3157 | | |
| 3158 | | again: |
| 3159 | | |
| 3160 | | |
| 3161 | | |
| 3162 | | |
| 3163 | | if (!tp->t_rxp) { |
| 3164 | | tp->t_rxp = pk_new(pvmudpmtu); |
| 3165 | | |
| 3166 | | |
| 3167 | | |
| 3168 | | if (DDFRAGHDR > TDFRAGHDR)
|
| 3169 | | tp->t_rxp->pk_dat += DDFRAGHDR - TDFRAGHDR;
|
| 3170 | | } |
| 3171 | | pp = tp->t_rxp; |
| 3172 | | |
| 3173 | | |
| 3174 | | |
| 3175 | | |
| 3176 | | |
| 3177 | | |
| 3178 | | n = (pp->pk_len < TDFRAGHDR) ? 0 : pvmget32(pp->pk_dat + 8);
|
| 3179 | | n += TDFRAGHDR - pp->pk_len;
|
| 3180 | | if (pvmdebmask & PDMPACKET) {
|
| 3181 | | pvmlogprintf("loclinput() t%x fr_len=%d fr_dat=+%d n=%d\n", |
| 3182 | | tp->t_tid, pp->pk_len, pp->pk_dat - pp->pk_buf, n); |
| 3183 | | } |
| 3184 | | #ifndef WIN32 |
| 3185 | | n = read(tp->t_sock, pp->pk_dat + pp->pk_len, n); |
| 3186 | | #else |
| 3187 | | n = win32_read_socket(tp->t_sock,pp->pk_dat + pp->pk_len,n); |
| 3188 | | #endif |
| 3189 | | if (pvmdebmask & PDMPACKET) {
|
| 3190 | | if (n >= 0) { |
| 3191 | | pvmlogprintf("loclinput() read=%d\n", n); |
| 3192 | | } else |
| 3193 | | pvmlogperror("loclinput() read"); |
| 3194 | | } |
| 3195 | | |
| 3196 | | #ifdef STATISTICS |
| 3197 | | switch (n) { |
| 3198 | | case -1: |
| 3199 | | stats.rdneg++; |
| 3200 | | break; |
| 3201 | | case 0: |
| 3202 | | stats.rdzer++; |
| 3203 | | break; |
| 3204 | | default: |
| 3205 | | stats.rdok++; |
| 3206 | | break; |
| 3207 | | } |
| 3208 | | #endif |
| 3209 | | if (n == -1) { |
| 3210 | | if (errno != EINTR
|
| 3211 | | #ifndef WIN32 |
| 3212 | | && errno != EWOULDBLOCK
|
| 3213 | | #endif |
| 3214 | | ) { |
| 3215 | | pvmlogperror("loclinput() read"); |
| 3216 | | pvmlogprintf("loclinput() marking t%x dead\n", |
| 3217 | | tp->t_tid); |
| 3218 | | return -1; |
| 3219 | | } |
| 3220 | | return 0; |
| 3221 | | } |
| 3222 | | if (!n) { |
| 3223 | | if (pvmdebmask & (PDMPACKET|PDMMESSAGE|PDMTASK)) {
|
| 3224 | | pvmlogprintf("loclinput() read EOF from t%x sock %d\n", |
| 3225 | | tp->t_tid, tp->t_sock); |
| 3226 | | } |
| 3227 | | return -1; |
| 3228 | | } |
| 3229 | | |
| 3230 | | if ((pp->pk_len += n) < TDFRAGHDR)
|
| 3231 | | return 0; |
| 3232 | | |
| 3233 | | |
| 3234 | | |
| 3235 | | |
| 3236 | | |
| 3237 | | m = TDFRAGHDR + pvmget32(pp->pk_dat + 8);
|
| 3238 | | if (pp->pk_len == m) { |
| 3239 | | tp->t_rxp = 0; |
| 3240 | | pp->pk_dst = pvmget32(pp->pk_dat); |
| 3241 | | #if defined(IMA_PGON) || defined(IMA_I860) || defined(IMA_CM5) \ |
| 3242 | | || defined(IMA_SP2MPI) || defined(IMA_AIX4SP2) \ |
| 3243 | | || defined(IMA_AIX5SP2) |
| 3244 | | pp->pk_src = pvmget32(pp->pk_dat + 4); |
| 3245 | | #else |
| 3246 | | pp->pk_src = tp->t_tid; |
| 3247 | | #endif |
| 3248 | | pp->pk_flag = pvmget8(pp->pk_dat + 12); |
| 3249 | | pp->pk_len -= TDFRAGHDR;
|
| 3250 | | pp->pk_dat += TDFRAGHDR;
|
| 3251 | | if (pp->pk_flag & FFSOM) {
|
| 3252 | | if (pp->pk_len < MSGHDRLEN) {
|
| 3253 | | pvmlogprintf( |
| 3254 | | "loclinput() SOM pkt src t%x dst t%x too short\n", |
| 3255 | | pp->pk_src, pp->pk_dst); |
| 3256 | | pk_free(pp); |
| 3257 | | return 0; |
| 3258 | | } |
| 3259 | | pp->pk_enc = pvmget32(pp->pk_dat); |
| 3260 | | pp->pk_tag = pvmget32(pp->pk_dat + 4); |
| 3261 | | pp->pk_ctx = pvmget32(pp->pk_dat + 8); |
| 3262 | | pp->pk_wid = pvmget32(pp->pk_dat + 16); |
| 3263 | | pp->pk_crc = pvmget32(pp->pk_dat + 20); |
| 3264 | | pp->pk_len -= MSGHDRLEN;
|
| 3265 | | pp->pk_dat += MSGHDRLEN;
|
| 3266 | | } |
| 3267 | | if (loclinpkt(tp, pp)) |
| 3268 | | return -1; |
| 3269 | | return 0; |
| 3270 | | } |
| 3271 | | |
| 3272 | | |
| 3273 | | |
| 3274 | | if (pp->pk_len == TDFRAGHDR) {
|
| 3275 | | if (m > pp->pk_max - (pp->pk_dat - pp->pk_buf)) { |
| 3276 | | if (!(tp->t_flag & TF_CONN)) {
|
| 3277 | | pvmlogprintf( |
| 3278 | | "loclinput() unconnected task sends frag length %d (ha)\n", |
| 3279 | | m); |
| 3280 | | return -1; |
| 3281 | | } |
| 3282 | | if (DDFRAGHDR > TDFRAGHDR) {
|
| 3283 | | pp2 = pk_new(m + DDFRAGHDR - TDFRAGHDR);
|
| 3284 | | pp2->pk_dat += DDFRAGHDR - TDFRAGHDR;
|
| 3285 | | } else |
| 3286 | | pp2 = pk_new(m); |
| 3287 | | BCOPY(pp->pk_dat, pp2->pk_dat, TDFRAGHDR);
|
| 3288 | | pp2->pk_len = pp->pk_len; |
| 3289 | | pk_free(pp); |
| 3290 | | pp = tp->t_rxp = pp2; |
| 3291 | | if (pvmdebmask & PDMPACKET) {
|
| 3292 | | pvmlogprintf("loclinput() realloc frag max=%d\n", m); |
| 3293 | | } |
| 3294 | | } |
| 3295 | | goto again; |
| 3296 | | } |
| 3297 | | |
| 3298 | | return 0; |
| 3299 | | } |