user: Demonstrate the C code that generates the assembly output below:

```asm
<build_packet>:
  endbr64
  movabs $0x200000000,%rcx
  push   %r13
  mov    %rdx,%r13
  push   %r12
  mov    %esi,%r12d
  push   %rbp
  sub    $0x60,%r12d
  push   %rbx
  mov    %rdi,%rbx
  rol    $0x8,%r12w
  sub    $0x8,%rsp
  mov    (%rdi),%rax
  mov    %rcx,0x10(%rax)
  movabs $0x100000000,%rcx
  movq   $0x0,(%rax)
  movq   $0x0,0x8(%rax)
  mov    0x8(%rdi),%rax
  mov    %rcx,0x10(%rax)
  movq   $0x0,(%rax)
  movq   $0x0,0x8(%rax)
  mov    $0x8,%eax
  mov    %ax,0x10(%rdi)
  movabs $0x500000004,%rax
  mov    %rax,0x18(%rdi)
  lea    -0x18(%rsi),%eax
  rol    $0x8,%ax
  movq   $0x0,0x58(%rdi)
  mov    %ax,0x20(%rdi)
  movabs $0x1100000020,%rax
  movq   $0x0,0x50(%rdi)
  movq   $0x0,0x48(%rdi)
  mov    %rax,0x24(%rdi)
  movq   $0x100000a,0x30(%rdi)
  mov    %rdx,%rdi
  call   <myrand@plt>
  mov    %r13,%rdi
  mov    %eax,%ebp
  call   <myrand@plt>
  shl    $0x18,%rbp
  mov    %r13,%rdi
  shl    $0x8,%rax
  and    $0xff000000,%ebp
  and    $0xff0000,%eax
  or     %rax,%rbp
  call   <myrand@plt>
  mov    %r13,%rdi
  shr    $0x8,%rax
  and    $0xff00,%eax
  or     %rax,%rbp
  call   <myrand@plt>
  movq   $0x0,0x40(%rbx)
  mov    0x1c(%rbx),%esi
  lea    0x18(%rbx),%rdi
  shr    $0x18,%rax
  and    $0xff,%eax
  or     %rbp,%rax
  mov    %rax,0x38(%rbx)
  call   <ip_fast_csum@plt>
  mov    %r13,%rdi
  mov    %rax,0x40(%rbx)
  call   <myrand@plt>
  mov    %r12w,0x64(%rbx)
  mov    %eax,%edx
  mov    %eax,%ecx
  shr    $0x10,%eax
  movq   $0x0,0x68(%rbx)
  shr    $0x18,%ecx
  shl    $0x8,%eax
  rol    $0x8,%dx
  or     %ecx,%eax
  mov    %dx,0x60(%rbx)
  mov    %ax,0x62(%rbx)
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
```

assistant: ```c
void build_packet(char *buf, int size, uint64_t *seed) {
  struct ethhdr *eth;
  struct iphdr *ip;
  struct udphdr *udp;
  uint32_t rand_val;
  eth = (struct ethhdr *)buf;
  eth->h_dest[0] = 0x00;
  eth->h_dest[1] = 0x00;
  eth->h_dest[2] = 0x00;
  eth->h_dest[3] = 0x00;
  eth->h_dest[4] = 0x00;
  eth->h_dest[5] = 0x02;
  eth->h_source[0] = 0x00;
  eth->h_source[1] = 0x00;
  eth->h_source[2] = 0x00;
  eth->h_source[3] = 0x00;
  eth->h_source[4] = 0x00;
  eth->h_source[5] = 0x01;
  eth->h_proto = (((((unsigned short)(0x0800) & 0xFF)) << 8) | (((unsigned short)(0x0800) & 0xFF00) >> 8));
  ip = (struct iphdr *)(buf + sizeof(*eth));
  ip->version = 4;
  ip->ihl = 5;
  ip->tos = 0;
  ip->tot_len = (((((unsigned short)(size - sizeof(*eth)) & 0xFF)) << 8) | (((unsigned short)(size - sizeof(*eth)) & 0xFF00) >> 8));
  ip->id = 0;
  ip->frag_off = 0;
  ip->ttl = 32;
  ip->protocol = 17;
  ip->saddr = (((((unsigned long)(0x0A000001) & 0xFF)) << 24) | ((((unsigned long)(0x0A000001) & 0xFF00)) << 8) | ((((unsigned long)(0x0A000001) & 0xFF0000)) >> 8) | ((((unsigned long)(0x0A000001) & 0xFF000000)) >> 24));
  ip->daddr = (((((unsigned long)(myrand(seed)) & 0xFF)) << 24) | ((((unsigned long)(myrand(seed)) & 0xFF00)) << 8) | ((((unsigned long)(myrand(seed)) & 0xFF0000)) >> 8) | ((((unsigned long)(myrand(seed)) & 0xFF000000)) >> 24));
  ip->check = 0;
  ip->check = ip_fast_csum(ip, ip->ihl);
  udp = (struct udphdr *)((char *)ip + sizeof(*ip));
  rand_val = myrand(seed);
  udp->source = (((((unsigned short)(rand_val & 0xFFFF) & 0xFF)) << 8) | (((unsigned short)(rand_val & 0xFFFF) & 0xFF00) >> 8));
  udp->dest = (((((unsigned short)((rand_val >> 16) & 0xFFFF) & 0xFF)) << 8) | (((unsigned short)((rand_val >> 16) & 0xFFFF) & 0xFF00) >> 8));
  udp->len = (((((unsigned short)(size - sizeof(*eth) - sizeof(*ip)) & 0xFF)) << 8) | (((unsigned short)(size - sizeof(*eth) - sizeof(*ip)) & 0xFF00) >> 8));
  udp->check = 0;
}
```