user: 请将这段汇编代码片段转换成等效的C代码:

```asm
<group_name>:
  endbr64
  lea    D15(%rip),%rax
  cmp    $0xe00000fb,%esi
  je     L22
  jbe    L0
  lea    D25(%rip),%rax
  cmp    $0xe4c8c8c9,%esi
  je     L22
  jbe    L55
  lea    D62(%rip),%rax
  cmp    $0xeffffffa,%esi
  je     L22
  cmp    $0xeffffffd,%esi
  jne    L89
  lea    D32(%rip),%rax
  ret
L0:
  lea    0x1fffffff(%rsi),%eax
  cmp    $0x15,%eax
  ja     L89
  ja     L89
  mov    %eax,%eax
  lea    D134(%rip),%rdx
  movslq (%rdx,%rax,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
  lea    D53(%rip),%rax
  ret
L55:
  lea    D31(%rip),%rax
  cmp    $0xe0000116,%esi
  je     L22
  cmp    $0xe0000123,%esi
  jne    L43
  lea    D36(%rip),%rax
  ret
L43:
  cmp    $0xe00000fc,%esi
  jne    L89
  lea    D77(%rip),%rax
  ret
  lea    D54(%rip),%rax
  ret
  lea    D43(%rip),%rax
  ret
  lea    D40(%rip),%rax
  ret
  lea    D48(%rip),%rax
  ret
L89:
  sub    $0x10,%rsp
  mov    %esi,%eax
  movzbl %ah,%eax
  mov    %eax,%r8d
  mov    %esi,%ecx
  shr    $0x10,%ecx
  movzbl %cl,%ecx
  mov    %esi,%edx
  shr    $0x18,%edx
  push   %rsi
  movzbl %sil,%r9d
  lea    D80(%rip),%rsi
  call   <FRAMERR@plt>
  lea    D25(%rip),%rax
  add    $0x18,%rsp
  ret
  lea    D56(%rip),%rax
  ret
L22:
  ret
```

tool_calls: name: disassemble_data
arguments: label: D15
type_guessed: string
name: disassemble_data
arguments: label: D25
type_guessed: string
name: disassemble_data
arguments: label: D62
type_guessed: string
name: disassemble_data
arguments: label: D32
type_guessed: string
name: disassemble_data
arguments: label: D53
type_guessed: string
name: disassemble_data
arguments: label: D31
type_guessed: string
name: disassemble_data
arguments: label: D36
type_guessed: string
name: disassemble_data
arguments: label: D77
type_guessed: string
name: disassemble_data
arguments: label: D54
type_guessed: string
name: disassemble_data
arguments: label: D43
type_guessed: string
name: disassemble_data
arguments: label: D40
type_guessed: string
name: disassemble_data
arguments: label: D48
type_guessed: string
name: disassemble_data
arguments: label: D80
type_guessed: string
name: disassemble_data
arguments: label: D56
type_guessed: string

tool: D15: mDNS

tool: D25: (unknown)

tool: D62: SSDP

tool: D32: SLP (Admin Scoped)

tool: D53: all local hosts

tool: D31: SLP (General)

tool: D36: SLP (Discovery)

tool: D77: mDNS Local Name Resolution

tool: D54: ospf

tool: D43: RIPv2

tool: D40: pim

tool: D48: igmp

tool: D80: igmp: unknown group: %d.%d.%d.%d (0x%08x)


tool: D56: all local routers

assistant: ```c
const char *group_name(struct NetFrame *frame, unsigned group_address) {
  switch (group_address) {
  case 0xeffffffa:
    return "SSDP";
    break;
  case 0xe0000001:
    return "all local hosts";
    break;
  case 0xe0000002:
    return "all local routers";
    break;
  case 0xe0000005:
    return "ospf";
    break;
  case 0xe0000009:
    return "RIPv2";
    break;
  case 0xe000000d:
    return "pim";
    break;
  case 0xe0000016:
    return "igmp";
    break;
  case 0xe00000fb:
    return "mDNS";
    break;
  case 0xe00000fc:
    return "mDNS Local Name Resolution";
    break;
  case 0xe0000116:
    return "SLP (General)";
    break;
  case 0xe0000123:
    return "SLP (Discovery)";
    break;
  case 0xe4c8c8c9:
    return "(unknown)";
    break;
  case 0xeffffffd:
    return "SLP (Admin Scoped)";
    break;
  default:
    FRAMERR(frame, "igmp: unknown group: %d.%d.%d.%d (0x%08x)\n", (group_address >> 24) & 0xFF, (group_address >> 16) & 0xFF, (group_address >> 8) & 0xFF, (group_address >> 0) & 0xFF, group_address);
    return "(unknown)";
  }
}
```