# 10. SLURM（Simplified Local Internet Number Resource Management with the RPKI）

## 10.1 目标与范围

SLURM 用于让 RP（Relying Party）在本地对上游 RPKI 验证结果做“过滤”和“补充断言”，而不修改上游发布对象。

本文档基于：
- RFC 8416（SLURM v1，ROA/BGPsec）
- draft-ietf-sidrops-aspa-slurm-04（SLURM v2，新增 ASPA）

## 10.2 版本与顶层结构

### 10.2.1 SLURM v1（RFC 8416）

`slurmVersion` 必须为 `1`，且顶层 JSON 对象必须包含且仅包含以下成员：
- `slurmVersion`
- `validationOutputFilters`（必须包含 `prefixFilters`、`bgpsecFilters`）
- `locallyAddedAssertions`（必须包含 `prefixAssertions`、`bgpsecAssertions`）

空策略示例：

```json
{
  "slurmVersion": 1,
  "validationOutputFilters": {
    "prefixFilters": [],
    "bgpsecFilters": []
  },
  "locallyAddedAssertions": {
    "prefixAssertions": [],
    "bgpsecAssertions": []
  }
}
```

### 10.2.2 SLURM v2（draft-04）

`slurmVersion` 必须为 `2`，在 v1 基础上扩展 ASPA 两类成员：
- `validationOutputFilters.aspaFilters`
- `locallyAddedAssertions.aspaAssertions`

空策略示例：

```json
{
  "slurmVersion": 2,
  "validationOutputFilters": {
    "prefixFilters": [],
    "bgpsecFilters": [],
    "aspaFilters": []
  },
  "locallyAddedAssertions": {
    "prefixAssertions": [],
    "bgpsecAssertions": [],
    "aspaAssertions": []
  }
}
```

## 10.3 字段规范（RFC 8416）

### 10.3.1 `prefixFilters`

数组元素每项：
- 必须至少包含一个：`prefix` 或 `asn`
- 可选：`comment`

匹配规则：
- 若配置了 `prefix`：匹配“被该前缀覆盖（encompassed）”的 VRP 前缀
- 若配置了 `asn`：匹配该 ASN
- 同时配置时：两者都要匹配

### 10.3.2 `bgpsecFilters`

数组元素每项：
- 必须至少包含一个：`asn` 或 `SKI`
- 可选：`comment`

匹配规则：
- 按 `asn`/`SKI` 单独或联合匹配 Router Key（BGPsec）

### 10.3.3 `prefixAssertions`

数组元素每项：
- 必须：`prefix`、`asn`
- 可选：`maxPrefixLength`、`comment`

约束：
- 若给出 `maxPrefixLength`，应满足 `prefix 长度 <= maxPrefixLength <= 地址位宽(IPv4=32, IPv6=128)`

### 10.3.4 `bgpsecAssertions`

数组元素每项：
- 必须：`asn`、`SKI`、`routerPublicKey`
- 可选：`comment`

## 10.4 ASPA 扩展（draft-ietf-sidrops-aspa-slurm-04）

### 10.4.1 `aspaFilters`

数组元素每项：
- 必须：`customerAsn`
- 可选：`comment`

匹配规则：
- 当 VAP（Validated ASPA Payload）的 `customerAsn` 等于过滤器 `customerAsn` 时命中并移除。

### 10.4.2 `aspaAssertions`

数组元素每项：
- 必须：`customerAsn`
- 必须：`providerAsns`（ASN 数组）
- 可选：`comment`

关键约束（draft-04）：
- `customerAsn` 不得出现在 `providerAsns` 中
- `providerAsns` 必须按升序排列
- `providerAsns` 里的 ASN 必须唯一（无重复）

语义补充（draft-04）：
- `aspaAssertions` 仅用于“新增断言”，不构成隐式过滤（不会自动替代 `aspaFilters`）。
- 在 RTRv2 输出阶段，新增的 ASPA 断言应加入 ASPA PDU 集合，并做去重。

## 10.5 应用语义（RFC 8416 Section 4）

### 10.5.1 原子性

SLURM 应用必须是原子的：
- 要么完全不生效（等同未使用 SLURM）
- 要么完整按当前 SLURM 配置生效

### 10.5.2 处理顺序

在同一次计算中：
1. 先执行 `validationOutputFilters`（移除匹配验证结果）
2. 再追加 `locallyAddedAssertions`

### 10.5.3 多文件

实现可以支持多个 SLURM 文件并行使用（取并集），但在启用前应检查断言重叠冲突；若存在冲突，整组文件应被拒绝。

## 10.6 最小可用示例（SLURM v2）

```json
{
  "slurmVersion": 2,
  "validationOutputFilters": {
    "prefixFilters": [
      {
        "prefix": "203.0.113.0/24",
        "comment": "Filter a broken VRP from upstream"
      }
    ],
    "bgpsecFilters": [],
    "aspaFilters": [
      {
        "customerAsn": 64496,
        "comment": "Filter one customer ASPA"
      }
    ]
  },
  "locallyAddedAssertions": {
    "prefixAssertions": [
      {
        "asn": 64496,
        "prefix": "203.0.113.0/24",
        "maxPrefixLength": 24,
        "comment": "Local business exception"
      }
    ],
    "bgpsecAssertions": [],
    "aspaAssertions": [
      {
        "customerAsn": 64496,
        "providerAsns": [64497, 64498],
        "comment": "Local ASPA assertion"
      }
    ]
  }
}
```

## 10.7 参考文献

- RFC 8416: https://www.rfc-editor.org/rfc/rfc8416.html
- draft-ietf-sidrops-aspa-slurm-04: https://www.ietf.org/archive/id/draft-ietf-sidrops-aspa-slurm-04.html
