Lines Matching defs:ipr

136 ip_reasm_free(struct ip_reasm *ipr)
140 while ((ipq = STAILQ_FIRST(&ipr->ip_queue)) != NULL) {
141 STAILQ_REMOVE_HEAD(&ipr->ip_queue, ipq_next);
145 free(ipr->ip_pkt);
146 free(ipr);
150 ip_reasm_add(struct ip_reasm *ipr, void *pkt, struct ip *ip)
161 STAILQ_FOREACH(p, &ipr->ip_queue, ipq_next) {
170 STAILQ_INSERT_AFTER(&ipr->ip_queue, prev, ipq, ipq_next);
173 STAILQ_INSERT_HEAD(&ipr->ip_queue, ipq, ipq_next);
191 struct ip_reasm *ipr;
291 STAILQ_FOREACH(ipr, &ire_list, ip_next) {
292 if (ipr->ip_src.s_addr == ip->ip_src.s_addr &&
293 ipr->ip_dst.s_addr == ip->ip_dst.s_addr &&
294 ipr->ip_id == ip->ip_id &&
295 ipr->ip_proto == ip->ip_p)
300 if (ipr == NULL) {
301 if ((ipr = calloc(1, sizeof (*ipr))) == NULL) {
306 ipr->ip_src = ip->ip_src;
307 ipr->ip_dst = ip->ip_dst;
308 ipr->ip_id = ip->ip_id;
309 ipr->ip_proto = ip->ip_p;
310 ipr->ip_ttl = MAXTTL;
311 STAILQ_INIT(&ipr->ip_queue);
312 STAILQ_INSERT_TAIL(&ire_list, ipr, ip_next);
315 if (ip_reasm_add(ipr, ptr, ip) != 0) {
316 STAILQ_REMOVE(&ire_list, ipr, ip_reasm, ip_next);
317 free(ipr);
323 ipr->ip_total_size = (8 * (ntohs(ip->ip_off) & IP_OFFMASK));
324 ipr->ip_total_size += n + sizeof (*ip);
325 ipr->ip_total_size += sizeof (struct ether_header);
327 ipr->ip_pkt = malloc(ipr->ip_total_size + 2);
328 if (ipr->ip_pkt == NULL) {
329 STAILQ_REMOVE(&ire_list, ipr, ip_reasm, ip_next);
330 ip_reasm_free(ipr);
336 * If we do not have re-assembly buffer ipr->ip_pkt, we are still
339 if (ipr->ip_pkt == NULL) {
350 STAILQ_FOREACH(ipq, &ipr->ip_queue, ipq_next) {
352 STAILQ_REMOVE(&ire_list, ipr, ip_reasm, ip_next);
353 ip_reasm_free(ipr);
365 ipq = STAILQ_FIRST(&ipr->ip_queue);
367 eh = (struct ether_header *)((uintptr_t)ipr->ip_pkt + 2);
371 ipr->ip_hdr = (struct ip *)((uintptr_t)eh + sizeof (*eh));
372 bcopy(ipq->ipq_hdr, ipr->ip_hdr, sizeof (*ipr->ip_hdr));
373 ipr->ip_hdr->ip_hl = sizeof (*ipr->ip_hdr) >> 2;
374 ipr->ip_hdr->ip_len = htons(n);
375 ipr->ip_hdr->ip_sum = 0;
376 ipr->ip_hdr->ip_sum = in_cksum(ipr->ip_hdr, sizeof (*ipr->ip_hdr));
379 ptr = (char *)((uintptr_t)ipr->ip_hdr + sizeof (*ipr->ip_hdr));
380 STAILQ_FOREACH(ipq, &ipr->ip_queue, ipq_next) {
392 *pkt = ipr->ip_pkt;
393 ipr->ip_pkt = NULL; /* Avoid free from ip_reasm_free() */
397 while ((ipr = STAILQ_FIRST(&ire_list)) != NULL) {
399 ip_reasm_free(ipr);