/*-----------------------------------------------------------------------------------*/ void * mem_malloc2(mem_size_t size) { void *mem; mem = mem_malloc(size); #if MEM_RECLAIM if(mem == NULL) { mem_reclaim(size); mem = mem_malloc(size); } #endif /* MEM_RECLAIM */ return mem; }
/*-----------------------------------------------------------------------------------*/ void tcp_rst(u32_t seqno, u32_t ackno, struct ip_addr *local_ip, struct ip_addr *remote_ip, u16_t local_port, u16_t remote_port) { struct pbuf *p; struct tcp_hdr *tcphdr; p = pbuf_alloc(PBUF_TRANSPORT, 0, PBUF_RAM); if(p == NULL) { #if MEM_RECLAIM mem_reclaim(sizeof(struct pbuf)); p = pbuf_alloc(PBUF_TRANSPORT, 0, PBUF_RAM); #endif /* MEM_RECLAIM */ if(p == NULL) { DEBUGF(TCP_DEBUG, ("tcp_rst: could not allocate memory for pbuf\n")); return; } } if(pbuf_header(p, TCP_HLEN)) { DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_send_data: no room for TCP header in pbuf.\n")); #ifdef TCP_STATS ++stats.tcp.err; #endif /* TCP_STATS */ return; } tcphdr = p->payload; tcphdr->src = htons(local_port); tcphdr->dest = htons(remote_port); tcphdr->seqno = htonl(seqno); tcphdr->ackno = htonl(ackno); TCPH_FLAGS_SET(tcphdr, TCP_RST | TCP_ACK); tcphdr->wnd = 0; tcphdr->urgp = 0; TCPH_OFFSET_SET(tcphdr, 5 << 4); tcphdr->chksum = 0; #if CHECKSUM_GEN_TCP tcphdr->chksum = inet_chksum_pseudo(p, local_ip, remote_ip, IP_PROTO_TCP, p->tot_len); #endif #ifdef TCP_STATS ++stats.tcp.xmit; #endif /* TCP_STATS */ ip_output(p, local_ip, remote_ip, TCP_TTL, IP_PROTO_TCP); pbuf_free(p); DEBUGF(TCP_RST_DEBUG, ("tcp_rst: seqno %lu ackno %lu.\n", seqno, ackno)); }