user: What is the c source code of the assembly code below:

```asm
<EthProto2Str>:
  endbr64
  mov    %edi,%eax
  push   %rbx
  mov    %rsi,%rbx
  sar    $0x10,%eax
  cmp    $0x90,%al
  ja     L19
  lea    D152(%rip),%rcx
  movzbl %al,%edx
  movslq (%rcx,%rdx,4),%rax
  add    %rcx,%rax
  notrack jmp *%rax
  nopl   (%rax)
  lea    D78(%rip),%rax
  pop    %rbx
  ret
  nopl   0x0(%rax)
L19:
  movzwl %di,%eax
  add    $0xffffff80,%eax
  cmp    $0x5,%eax
  ja     L18
  lea    D202(%rip),%rdx
  movslq (%rdx,%rax,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
  lea    D316(%rip),%rax
  pop    %rbx
  ret
  lea    D170(%rip),%rax
  pop    %rbx
  ret
  lea    D325(%rip),%rax
  pop    %rbx
  ret
  lea    D329(%rip),%rax
  pop    %rbx
  ret
  lea    D193(%rip),%rax
  pop    %rbx
  ret
  lea    D87(%rip),%rax
  pop    %rbx
  ret
  lea    D166(%rip),%rax
  pop    %rbx
  ret
  lea    D220(%rip),%rax
  pop    %rbx
  ret
  lea    D117(%rip),%rax
  pop    %rbx
  ret
  lea    D127(%rip),%rax
  pop    %rbx
  ret
  lea    D84(%rip),%rax
  pop    %rbx
  ret
  lea    D55(%rip),%rax
  pop    %rbx
  ret
  lea    D143(%rip),%rax
  pop    %rbx
  ret
  lea    D310(%rip),%rax
  pop    %rbx
  ret
  lea    D241(%rip),%rax
  pop    %rbx
  ret
  lea    D79(%rip),%rax
  pop    %rbx
  ret
  lea    D149(%rip),%rax
  pop    %rbx
  ret
  lea    D147(%rip),%rax
  pop    %rbx
  ret
  lea    D192(%rip),%rax
  pop    %rbx
  ret
  lea    D278(%rip),%rax
  pop    %rbx
  ret
  lea    D48(%rip),%rax
  pop    %rbx
  ret
  lea    D320(%rip),%rax
  pop    %rbx
  ret
  lea    D238(%rip),%rax
  pop    %rbx
  ret
  lea    D18(%rip),%rax
  pop    %rbx
  ret
  lea    D208(%rip),%rax
  pop    %rbx
  ret
  lea    D187(%rip),%rax
  pop    %rbx
  ret
  lea    D150(%rip),%rax
  pop    %rbx
  ret
  lea    D265(%rip),%rax
  pop    %rbx
  ret
  lea    D336(%rip),%rax
  pop    %rbx
  ret
  lea    D174(%rip),%rax
  pop    %rbx
  ret
  lea    D66(%rip),%rax
  pop    %rbx
  ret
L18:
  mov    %edi,%edx
  lea    D231(%rip),%rsi
  mov    %rbx,%rdi
  call   <sprintf@plt>
  mov    %rbx,%rax
  pop    %rbx
  ret
```

tool_calls: name: disassemble_data
arguments: data_tag: D78
datatype: string
name: disassemble_data
arguments: data_tag: D316
datatype: string
name: disassemble_data
arguments: data_tag: D170
datatype: string
name: disassemble_data
arguments: data_tag: D325
datatype: string
name: disassemble_data
arguments: data_tag: D329
datatype: string
name: disassemble_data
arguments: data_tag: D193
datatype: string
name: disassemble_data
arguments: data_tag: D87
datatype: string
name: disassemble_data
arguments: data_tag: D166
datatype: string
name: disassemble_data
arguments: data_tag: D220
datatype: string
name: disassemble_data
arguments: data_tag: D117
datatype: string
name: disassemble_data
arguments: data_tag: D127
datatype: string
name: disassemble_data
arguments: data_tag: D84
datatype: string
name: disassemble_data
arguments: data_tag: D55
datatype: string
name: disassemble_data
arguments: data_tag: D143
datatype: string
name: disassemble_data
arguments: data_tag: D310
datatype: string
name: disassemble_data
arguments: data_tag: D241
datatype: string
name: disassemble_data
arguments: data_tag: D79
datatype: string
name: disassemble_data
arguments: data_tag: D149
datatype: string
name: disassemble_data
arguments: data_tag: D147
datatype: string
name: disassemble_data
arguments: data_tag: D192
datatype: string
name: disassemble_data
arguments: data_tag: D278
datatype: string
name: disassemble_data
arguments: data_tag: D48
datatype: string
name: disassemble_data
arguments: data_tag: D320
datatype: string
name: disassemble_data
arguments: data_tag: D238
datatype: string
name: disassemble_data
arguments: data_tag: D18
datatype: string
name: disassemble_data
arguments: data_tag: D208
datatype: string
name: disassemble_data
arguments: data_tag: D187
datatype: string
name: disassemble_data
arguments: data_tag: D150
datatype: string
name: disassemble_data
arguments: data_tag: D265
datatype: string
name: disassemble_data
arguments: data_tag: D336
datatype: string
name: disassemble_data
arguments: data_tag: D174
datatype: string
name: disassemble_data
arguments: data_tag: D66
datatype: string
name: disassemble_data
arguments: data_tag: D231
datatype: string

tool: D78: DNS

tool: D316: NTP

tool: D170: SFTP

tool: D325: HTTPS

tool: D329: IMAP3

tool: D193: TFTP

tool: D87: UDP

tool: D166: SSH

tool: D220: TCP

tool: D117: SNMP

tool: D127: NETBIOSSSN

tool: D84: NETBIOSDGM

tool: D55: NETBIOSNS

tool: D143: IRC

tool: D310: BGP

tool: D241: RPC

tool: D79: POP3

tool: D149: HTTP

tool: D147: BOOTPC

tool: D192: BOOTPS

tool: D278: VNC

tool: D48: SMTP

tool: D320: TELNET

tool: D238: QUIC

tool: D18: FTPDATA

tool: D208: FTPCMD

tool: D187: IP

tool: D150: IPv6

tool: D265: PPPOE_Discover

tool: D336: PPPOE_SESSION

tool: D174: RARP

tool: D66: ARP

tool: D231: 0x%4x

assistant: ```c
const char *EthProto2Str(uint32_t proto, char *cache) {
  uint16_t ipflag = (proto >> 16) & 0xff;
  uint16_t ethproto = proto & 0xffff;
  switch (ipflag) {
  case (0x40 + 1):
    return "FTPDATA";
    ;
  case (0x40 + 2):
    return "FTPCMD";
    ;
  case (0x40 + 3):
    return "SSH";
    ;
  case (0x40 + 4):
    return "TELNET";
    ;
  case (0x40 + 5):
    return "SMTP";
    ;
  case (0x40 + 10):
    return "DNS";
    ;
  case (0x40 + 11):
    return "BOOTPS";
    ;
  case (0x40 + 12):
    return "BOOTPC";
    ;
  case (0x40 + 20):
    return "HTTP";
    ;
  case (0x40 + 21):
    return "POP3";
    ;
  case (0x40 + 22):
    return "RPC";
    ;
  case (0x40 + 23):
    return "SFTP";
    ;
  case (0x40 + 24):
    return "NTP";
    ;
  case (0x40 + 25):
    return "NETBIOSNS";
    ;
  case (0x40 + 26):
    return "NETBIOSDGM";
    ;
  case (0x40 + 27):
    return "NETBIOSSSN";
    ;
  case (0x40 + 30):
    return "SNMP";
    ;
  case (0x40 + 35):
    return "BGP";
    ;
  case (0x40 + 36):
    return "IRC";
    ;
  case (0x40 + 37):
    return "IMAP3";
    ;
  case (0x40 + 38):
    return "HTTPS";
    ;
  case (0x40 + 80):
    return "VNC";
    ;
  case (0x0 + 11):
    return "DNS";
  case (0x0 + 12):
    return "QUIC";
  case (0x0 + 10):
    return "TFTP";
  case (0x0 + 1):
    return "UDP";
  case (0x40):
    return "TCP";
  default:
    break;
  }
  switch (ethproto) {
  case ETH_P_IP:
    return "IP";
  case ETH_P_IPV6:
    return "IPv6";
  case ETH_P_ARP:
    return "ARP";
  case ETH_P_RARP:
    return "RARP";
  case ETH_P_PPP_DISC:
    return "PPPOE_Discover";
  case ETH_P_PPP_SES:
    return "PPPOE_SESSION";
  default:
    sprintf(cache, "0x%4x", proto);
    break;
  }
  return cache;
}
```