// File: /workspace/github_c_makefile_star2_O0/FH0[P]tun_direct/lwip-2.1.2/src/core/tcp.c
// Function: tcp_listen_with_backlog_and_err
struct tcp_pcb *
tcp_listen_with_backlog_and_err(struct tcp_pcb *pcb, u8_t backlog, err_t *err)
{
  struct tcp_pcb_listen *lpcb = NULL;
  err_t res;

  LWIP_UNUSED_ARG(backlog);

  LWIP_ASSERT_CORE_LOCKED();

  LWIP_ERROR("tcp_listen_with_backlog_and_err: invalid pcb", pcb != NULL, res = ERR_ARG; goto done);
  LWIP_ERROR("tcp_listen_with_backlog_and_err: pcb already connected", pcb->state == CLOSED, res = ERR_CLSD; goto done);

  /* already listening? */
  if (pcb->state == LISTEN) {
    lpcb = (struct tcp_pcb_listen *)pcb;
    res = ERR_ALREADY;
    goto done;
  }
#if SO_REUSE
  if (ip_get_option(pcb, SOF_REUSEADDR)) {
    /* Since SOF_REUSEADDR allows reusing a local address before the pcb's usage
       is declared (listen-/connection-pcb), we have to make sure now that
       this port is only used once for every local IP. */
    for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
      if ((lpcb->local_port == pcb->local_port) &&
          ip_addr_cmp(&lpcb->local_ip, &pcb->local_ip)) {
        /* this address/port is already used */
        lpcb = NULL;
        res = ERR_USE;
        goto done;
      }
    }
  }
#endif /* SO_REUSE */
  lpcb = (struct tcp_pcb_listen *)memp_malloc(MEMP_TCP_PCB_LISTEN);
  if (lpcb == NULL) {
    res = ERR_MEM;
    goto done;
  }
  lpcb->callback_arg = pcb->callback_arg;
  lpcb->local_port = pcb->local_port;
  lpcb->state = LISTEN;
  lpcb->prio = pcb->prio;
  lpcb->so_options = pcb->so_options;
  lpcb->netif_idx = NETIF_NO_INDEX;
  lpcb->ttl = pcb->ttl;
  lpcb->tos = pcb->tos;
#if LWIP_IPV4 && LWIP_IPV6
  IP_SET_TYPE_VAL(lpcb->remote_ip, pcb->local_ip.type);
#endif /* LWIP_IPV4 && LWIP_IPV6 */
  ip_addr_copy(lpcb->local_ip, pcb->local_ip);
  if (pcb->local_port != 0) {
    TCP_RMV(&tcp_bound_pcbs, pcb);
  }
#if LWIP_TCP_PCB_NUM_EXT_ARGS
  /* copy over ext_args to listening pcb  */
  memcpy(&lpcb->ext_args, &pcb->ext_args, sizeof(pcb->ext_args));
#endif
  tcp_free(pcb);
#if LWIP_CALLBACK_API
  lpcb->accept = tcp_accept_null;
#endif /* LWIP_CALLBACK_API */
#if TCP_LISTEN_BACKLOG
  lpcb->accepts_pending = 0;
  tcp_backlog_set(lpcb, backlog);
#endif /* TCP_LISTEN_BACKLOG */
  TCP_REG(&tcp_listen_pcbs.pcbs, (struct tcp_pcb *)lpcb);
  res = ERR_OK;
done:
  if (err != NULL) {
    *err = res;
  }
  return (struct tcp_pcb *)lpcb;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movb %sil, %al
movq %rdi, -0x8(%rbp)
movb %al, -0x9(%rbp)
movq %rdx, -0x18(%rbp)
movq $0x0, -0x20(%rbp)
cmpq $0x0, -0x8(%rbp)
jne 0xc4a6
jmp 0xc477
leaq 0x1ae4e(%rip), %rdi     # 0x272cc
leaq 0x1b9b9(%rip), %rsi     # 0x27e3e
movl $0x359, %edx            # imm = 0x359
leaq 0x1b8da(%rip), %rcx     # 0x27d6b
movb $0x0, %al
callq 0x20d0
xorl %eax, %eax
movl %eax, %edi
callq 0x21b0
callq 0x2040
jmp 0xc4a8
jmp 0xc4aa
movq -0x8(%rbp), %rax
cmpl $0x0, 0x48(%rax)
je 0xc4e5
jmp 0xc4b6
leaq 0x1ae0f(%rip), %rdi     # 0x272cc
leaq 0x1b9a7(%rip), %rsi     # 0x27e6b
movl $0x35a, %edx            # imm = 0x35A
leaq 0x1b89b(%rip), %rcx     # 0x27d6b
movb $0x0, %al
callq 0x20d0
xorl %eax, %eax
movl %eax, %edi
callq 0x21b0
callq 0x2040
jmp 0xc4e7
movq -0x8(%rbp), %rax
cmpl $0x1, 0x48(%rax)
jne 0xc502
movq -0x8(%rbp), %rax
movq %rax, -0x20(%rbp)
movb $-0x9, -0x21(%rbp)
jmp 0xc6f6
movl $0x3, %edi
callq 0x4930
movq %rax, -0x20(%rbp)
cmpq $0x0, -0x20(%rbp)
jne 0xc520
movb $-0x1, -0x21(%rbp)
jmp 0xc6f6
movq -0x8(%rbp), %rax
movq 0x40(%rax), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x40(%rax)
movq -0x8(%rbp), %rax
movw 0x4e(%rax), %cx
movq -0x20(%rbp), %rax
movw %cx, 0x4e(%rax)
movq -0x20(%rbp), %rax
movl $0x1, 0x48(%rax)
movq -0x8(%rbp), %rax
movb 0x4c(%rax), %cl
movq -0x20(%rbp), %rax
movb %cl, 0x4c(%rax)
movq -0x8(%rbp), %rax
movb 0x31(%rax), %cl
movq -0x20(%rbp), %rax
movb %cl, 0x31(%rax)
movq -0x20(%rbp), %rax
movb $0x0, 0x30(%rax)
movq -0x8(%rbp), %rax
movb 0x33(%rax), %cl
movq -0x20(%rbp), %rax
movb %cl, 0x33(%rax)
movq -0x8(%rbp), %rax
movb 0x32(%rax), %cl
movq -0x20(%rbp), %rax
movb %cl, 0x32(%rax)
movq -0x8(%rbp), %rax
movb 0x14(%rax), %cl
movq -0x20(%rbp), %rax
movb %cl, 0x2c(%rax)
jmp 0xc59b
jmp 0xc59d
movq -0x8(%rbp), %rax
movb 0x14(%rax), %cl
movq -0x20(%rbp), %rax
movb %cl, 0x14(%rax)
movq -0x8(%rbp), %rax
movzbl 0x14(%rax), %eax
cmpl $0x6, %eax
jne 0xc600
jmp 0xc5ba
movq -0x8(%rbp), %rax
movl (%rax), %ecx
movq -0x20(%rbp), %rax
movl %ecx, (%rax)
movq -0x8(%rbp), %rax
movl 0x4(%rax), %ecx
movq -0x20(%rbp), %rax
movl %ecx, 0x4(%rax)
movq -0x8(%rbp), %rax
movl 0x8(%rax), %ecx
movq -0x20(%rbp), %rax
movl %ecx, 0x8(%rax)
movq -0x8(%rbp), %rax
movl 0xc(%rax), %ecx
movq -0x20(%rbp), %rax
movl %ecx, 0xc(%rax)
movq -0x8(%rbp), %rax
movb 0x10(%rax), %cl
movq -0x20(%rbp), %rax
movb %cl, 0x10(%rax)
jmp 0xc637
movq -0x8(%rbp), %rax
movl (%rax), %ecx
movq -0x20(%rbp), %rax
movl %ecx, (%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0xc(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0x8(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0x4(%rax)
movq -0x20(%rbp), %rax
movb $0x0, 0x10(%rax)
jmp 0xc637
jmp 0xc639
movq -0x8(%rbp), %rax
movzwl 0x4e(%rax), %eax
cmpl $0x0, %eax
je 0xc6bb
jmp 0xc648
movq 0x232b1(%rip), %rax     # 0x2f900
cmpq -0x8(%rbp), %rax
jne 0xc669
movq 0x232a4(%rip), %rax     # 0x2f900
movq 0x38(%rax), %rax
movq %rax, 0x23299(%rip)     # 0x2f900
jmp 0xc6ad
movq 0x23290(%rip), %rax     # 0x2f900
movq %rax, -0x30(%rbp)
cmpq $0x0, -0x30(%rbp)
je 0xc6ab
movq -0x30(%rbp), %rax
movq 0x38(%rax), %rax
cmpq -0x8(%rbp), %rax
jne 0xc69b
movq -0x8(%rbp), %rax
movq 0x38(%rax), %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x38(%rax)
jmp 0xc6ab
jmp 0xc69d
movq -0x30(%rbp), %rax
movq 0x38(%rax), %rax
movq %rax, -0x30(%rbp)
jmp 0xc674
jmp 0xc6ad
movq -0x8(%rbp), %rax
movq $0x0, 0x38(%rax)
jmp 0xc6bb
movq -0x8(%rbp), %rdi
callq 0xa630
movq -0x20(%rbp), %rax
leaq 0x41(%rip), %rcx        # 0xc710
movq %rcx, 0x50(%rax)
movq 0x2321e(%rip), %rcx     # 0x2f8f8
movq -0x20(%rbp), %rax
movq %rcx, 0x38(%rax)
movq -0x20(%rbp), %rax
movq %rax, 0x2320b(%rip)     # 0x2f8f8
callq 0x16a90
movb $0x0, -0x21(%rbp)
cmpq $0x0, -0x18(%rbp)
je 0xc706
movb -0x21(%rbp), %cl
movq -0x18(%rbp), %rax
movb %cl, (%rax)
movq -0x20(%rbp), %rax
addq $0x30, %rsp
popq %rbp
retq