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

```asm
<xfrm_lifetime_cfg_parse>:
  endbr64
  push   %r14
  push   %r13
  mov    %rsi,%r13
  push   %r12
  mov    %rdx,%r12
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  mov    (%rdx),%rbx
  mov    (%rsi),%r14d
  lea    D7(%rip),%rsi
  mov    (%rbx),%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L10
  call   <NEXT_ARG@plt>
  mov    (%rbx),%rsi
  xor    %edx,%edx
  lea    0x1c(%rbp),%rdi
  call   <get_u64@plt>
  test   %eax,%eax
  jne    L219
L84:
  mov    %r14d,0x0(%r13)
  xor    %eax,%eax
  mov    %rbx,(%r12)
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  nopl   (%rax)
L10:
  mov    (%rbx),%rdi
  lea    D16(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L82
  call   <NEXT_ARG@plt>
  mov    (%rbx),%rsi
  xor    %edx,%edx
  lea    0x18(%rbp),%rdi
  call   <get_u64@plt>
  test   %eax,%eax
  je     L84
  mov    (%rbx),%rsi
  lea    D94(%rip),%rdi
  call   <invarg@plt>
  jmp    L84
  nopl   0x0(%rax)
L82:
  mov    (%rbx),%rdi
  lea    D74(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L188
  mov    (%rbx),%rdi
  lea    D71(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L61
  call   <NEXT_ARG@plt>
  mov    (%rbx),%rsi
  xor    %edx,%edx
  lea    0x10(%rbp),%rdi
  call   <get_u64@plt>
  test   %eax,%eax
  je     L84
  mov    (%rbx),%rsi
  lea    D1(%rip),%rdi
  call   <invarg@plt>
  jmp    L84
  nopl   0x0(%rax,%rax,1)
L219:
  mov    (%rbx),%rsi
  lea    D164(%rip),%rdi
  call   <invarg@plt>
  jmp    L84
  nopl   0x0(%rax)
L188:
  call   <NEXT_ARG@plt>
  mov    (%rbx),%rsi
  xor    %edx,%edx
  lea    0x14(%rbp),%rdi
  call   <get_u64@plt>
  test   %eax,%eax
  je     L84
  mov    (%rbx),%rsi
  lea    D88(%rip),%rdi
  call   <invarg@plt>
  jmp    L84
  nopw   0x0(%rax,%rax,1)
L61:
  mov    (%rbx),%rdi
  lea    D0(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L58
  mov    (%rbx),%rdi
  lea    D25(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L68
  call   <NEXT_ARG@plt>
  mov    (%rbx),%rsi
  xor    %edx,%edx
  lea    0x8(%rbp),%rdi
  call   <get_u64@plt>
  test   %eax,%eax
  je     L84
  mov    (%rbx),%rsi
  lea    D117(%rip),%rdi
  call   <invarg@plt>
  jmp    L84
  nopw   0x0(%rax,%rax,1)
L58:
  call   <NEXT_ARG@plt>
  mov    (%rbx),%rsi
  xor    %edx,%edx
  lea    0xc(%rbp),%rdi
  call   <get_u64@plt>
  test   %eax,%eax
  je     L84
  mov    (%rbx),%rsi
  lea    D43(%rip),%rdi
  call   <invarg@plt>
  jmp    L84
  nop
L68:
  mov    (%rbx),%rdi
  lea    D83(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L4
  call   <NEXT_ARG@plt>
  mov    (%rbx),%rsi
  xor    %edx,%edx
  lea    0x4(%rbp),%rdi
  call   <get_u64@plt>
  test   %eax,%eax
  je     L84
  mov    (%rbx),%rsi
  lea    D51(%rip),%rdi
  call   <invarg@plt>
  jmp    L84
L4:
  mov    (%rbx),%rdi
  lea    D169(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L46
  call   <NEXT_ARG@plt>
  mov    (%rbx),%rsi
  xor    %edx,%edx
  mov    %rbp,%rdi
  call   <get_u64@plt>
  test   %eax,%eax
  je     L84
  mov    (%rbx),%rsi
  lea    D118(%rip),%rdi
  call   <invarg@plt>
  jmp    L84
L46:
  mov    (%rbx),%rsi
  lea    D136(%rip),%rdi
  call   <invarg@plt>
  jmp    L84
```

tool_calls: name: read_data
arguments: data_tag: D7
datatype: string
name: read_data
arguments: data_tag: D16
datatype: string
name: read_data
arguments: data_tag: D94
datatype: string
name: read_data
arguments: data_tag: D74
datatype: string
name: read_data
arguments: data_tag: D71
datatype: string
name: read_data
arguments: data_tag: D1
datatype: string
name: read_data
arguments: data_tag: D164
datatype: string
name: read_data
arguments: data_tag: D88
datatype: string
name: read_data
arguments: data_tag: D0
datatype: string
name: read_data
arguments: data_tag: D25
datatype: string
name: read_data
arguments: data_tag: D117
datatype: string
name: read_data
arguments: data_tag: D43
datatype: string
name: read_data
arguments: data_tag: D83
datatype: string
name: read_data
arguments: data_tag: D51
datatype: string
name: read_data
arguments: data_tag: D169
datatype: string
name: read_data
arguments: data_tag: D118
datatype: string
name: read_data
arguments: data_tag: D136
datatype: string

tool: D7: time-soft

tool: D16: time-hard

tool: D94: "time-hard" value is invalid

tool: D74: time-use-soft

tool: D71: time-use-hard

tool: D1: "time-use-hard" value is invalid

tool: D164: "time-soft" value is invalid

tool: D88: "time-use-soft" value is invalid

tool: D0: byte-soft

tool: D25: byte-hard

tool: D117: "byte-hard" value is invalid

tool: D43: "byte-soft" value is invalid

tool: D83: packet-soft

tool: D51: "packet-soft" value is invalid

tool: D169: packet-hard

tool: D118: "packet-hard" value is invalid

tool: D136: "LIMIT" is invalid

assistant: ```c
int xfrm_lifetime_cfg_parse(struct xfrm_lifetime_cfg *lft, int *argcp, char ***argvp) {
  int argc = *argcp;
  char **argv = *argvp;
  int ret;
  if (strcmp(*argv, "time-soft") == 0) {
    NEXT_ARG();
    ret = get_u64(&lft->soft_add_expires_seconds, *argv, 0);
    if (ret)
      invarg("\"time-soft\" value is invalid", *argv);
  } else if (strcmp(*argv, "time-hard") == 0) {
    NEXT_ARG();
    ret = get_u64(&lft->hard_add_expires_seconds, *argv, 0);
    if (ret)
      invarg("\"time-hard\" value is invalid", *argv);
  } else if (strcmp(*argv, "time-use-soft") == 0) {
    NEXT_ARG();
    ret = get_u64(&lft->soft_use_expires_seconds, *argv, 0);
    if (ret)
      invarg("\"time-use-soft\" value is invalid", *argv);
  } else if (strcmp(*argv, "time-use-hard") == 0) {
    NEXT_ARG();
    ret = get_u64(&lft->hard_use_expires_seconds, *argv, 0);
    if (ret)
      invarg("\"time-use-hard\" value is invalid", *argv);
  } else if (strcmp(*argv, "byte-soft") == 0) {
    NEXT_ARG();
    ret = get_u64(&lft->soft_byte_limit, *argv, 0);
    if (ret)
      invarg("\"byte-soft\" value is invalid", *argv);
  } else if (strcmp(*argv, "byte-hard") == 0) {
    NEXT_ARG();
    ret = get_u64(&lft->hard_byte_limit, *argv, 0);
    if (ret)
      invarg("\"byte-hard\" value is invalid", *argv);
  } else if (strcmp(*argv, "packet-soft") == 0) {
    NEXT_ARG();
    ret = get_u64(&lft->soft_packet_limit, *argv, 0);
    if (ret)
      invarg("\"packet-soft\" value is invalid", *argv);
  } else if (strcmp(*argv, "packet-hard") == 0) {
    NEXT_ARG();
    ret = get_u64(&lft->hard_packet_limit, *argv, 0);
    if (ret)
      invarg("\"packet-hard\" value is invalid", *argv);
  } else
    invarg("\"LIMIT\" is invalid", *argv);
  *argcp = argc;
  *argvp = argv;
  return 0;
}
```