UDP-ESP SA 및 파서 항목
[IPsec 작업 오프로드 기능은 더 이상 사용되지 않으며 사용하지 않아야 합니다.]
UDP-ESP 캡슐화를 지원하는 미니포트 드라이버는 파서 항목 목록을 유지해야 합니다. 파서 항목에는 NIC가 오프로드된 SA(보안 연결)에서 들어오는 UDP-ESP 패킷을 구문 분석하는 데 필요한 정보가 포함되어 있습니다.
파서 항목에는 다음 정보가 포함됩니다.
UDP-ESP 캡슐화 형식입니다.
현재는 하나의 캡슐화 유형만 지원됩니다. 기본 UDP-ESP 캡슐화 형식에 대한 설명은 UDP-ESP 캡슐화 형식을 참조하세요.
대상 캡슐화 포트입니다.
NIC는 오프로드된 SA에서 처리하는 인바운드 UDP 캡슐화된 패킷의 UDP 헤더에서 대상 포트를 찾아야 합니다. 현재 ESP 패킷의 UDP 캡슐화는 포트 4500에서만 지원됩니다.
TCP/IP 전송은 미니포트 드라이버에 오프로드된 자체 파서 항목 목록을 유지 관리합니다. UDP-ESP SA를 추가하거나 삭제할 때 전송 및 미니포트 드라이버는 핸들을 사용하여 특정 파서 항목을 식별합니다.
파서 항목을 사용하면 필요한 경우 UDP-ESP 기능을 확장하여 각 캡슐화 유형에 대해 서로 다른 캡슐화 형식 및 둘 이상의 포트를 수용할 수 있습니다.
UDP-ESP SA 및 파서 항목 추가
TCP/IP 전송은 OID_TCP_TASK_IPSEC_ADD_UDPESP_SA 요청을 실행 하여 하나 이상의 UDP-ESP SA 및 이러한 SA에 대한 파서 항목을 추가하도록 미니포트 드라이버를 요청합니다. OFFLOAD_IPSEC_ADD_UDPESP_SA 구조체의 EncapTypeEntry 멤버에는 파서 항목 정보가 포함됩니다.
OID_TCP_TASK_IPSEC_ADD_UDPESP_SA 요청을 실행하기 전에 TCP/IP 전송은 오프로드 중인 SA에 대한 파서 항목이 지정된 IP 인터페이스의 파서 항목 목록에 있는지 여부를 결정합니다.
파서 항목이 전송 목록에 없는 경우 전송은 항목의 자체 복사본을 만들고 OFFLOAD_IPSEC_ADD_UDPESP_SA 구조체의 EncapTypeEntryOffloadHandle 멤버를 NULL로 설정합니다. 그런 다음 전송에서 OID_TCP_TASK_IPSEC_ADD_UDPESP_SA 요청을 실행합니다. 요청을 받은 후 미니포트 드라이버는 EncapTypeEntry 가 지정한 파서 항목이 NIC의 파서 항목 목록에 있는지 여부를 결정합니다.
- 지정된 파서 항목이 NIC의 파서 항목 목록에 없는 경우 미니포트 드라이버는 EncapTypeEntry 에 지정된 캡슐화 유형 및 대상 포트를 사용하여 파서 항목을 만들고 파서 항목을 NIC의 파서 항목 목록에 추가합니다. 그런 다음 미니포트 드라이버는 OID_TCP_TASK_IPSEC_ADD_UDPESP_SA 요청에 지정된 SA를 오프로드합니다. OID 요청을 성공적으로 완료한 후 미니포트 드라이버는 새로 만든 파서 항목을 식별하는 EncapTypeEntryOffloadHandle 의 핸들을 반환합니다. 또한 미니포트 드라이버는 OFFLOAD_IPSEC_ADD_UDPESP_SA 구조체의 OffloadHandle 멤버에서 오프로드된 SA를 식별하는 핸들을 반환합니다.
- 지정된 파서 항목이 이미 NIC의 파서 항목 목록에 있는 경우 미니포트 드라이버는 기존 파서 항목에 대한 EncapTypeEntryOffloadHandle 의 핸들을 반환합니다. 또한 미니포트 드라이버는 OFFLOAD_IPSEC_ADD_UDPESP_SA 구조체의 OffloadHandle 멤버에서 오프로드된 SA를 식별하는 핸들을 반환합니다.
미니포트 드라이버가 OID_TCP_TASK_IPSEC_ADD_UDPESP_SA 요청을 성공적으로 완료하면 전송은 지정된 IP 인터페이스에 대한 자체 파서 항목 목록에 새 파서 항목의 복사본을 추가합니다. 또한 전송은 파서 항목에 대한 참조 수를 1씩 증가합니다. 전송은 이 참조 횟수를 사용하여 파서 항목과 연결된 오프로드된 UDP-ESP SA 수를 열거합니다.
미니포트 드라이버가 OID_TCP_TASK_IPSEC_ADD_UDPESP_SA 요청에 실패하면 전송은 파서 항목의 복사본을 삭제합니다. 미니포트 드라이버가 이러한 요청에 실패하는 경우 실제로 파서 항목을 추가하고 SA를 오프로드하지 않았는지 확인해야 합니다.
파서 항목이 전송의 파서 항목 목록에 이미 있는 경우 미니포트 드라이버는 이전 OID_TCP_TASK_IPSEC_ADD_UDPESP_SA 요청에 대한 응답으로 파서 항목을 이미 추가했습니다. 이 경우 전송은 파서 항목에 대한 참조 수를 1씩 증가시키고 EncapTypeEntryOffloadHandle 을 미니포트 드라이버가 이전에 반환한 값으로 설정합니다. 그런 다음 전송에서 OID_TCP_TASK_IPSEC_ADD_UDPESP_SA 요청을 실행합니다. 그러면 미니포트 드라이버가 오프로드되는 추가 SA에 대해 기존 파서 항목을 사용하도록 요청합니다. 이 경우 미니포트 드라이버는 오프로드된 SA를 식별하는 OffloadHandle 을 반환해야 합니다. OID_TCP_TASK_IPSEC_ADD_UDPESP_SA 요청이 실패하면 전송은 파서 항목에 대한 참조 수를 감소합니다.
UDP-ESP SA 및 파서 항목 삭제
TCP/IP 전송은 미니포트 드라이버에 하나 이상의 SA 및 OID_TCP_TASK_IPSEC_DELETE_UDPESP_SA 요청을 실행 하여 이러한 SA에 대한 파서 항목을 삭제하도록 요청합니다.
이 요청을 실행하기 전에 TCP/IP 전송은 삭제할 SA와 연결된 파서 항목에 대한 참조 수를 감소합니다. 그런 다음 전송은 참조 수가 0인지 여부를 테스트합니다.
참조 수가 0이 아닌 경우 파서 항목은 현재 NIC에 오프로드된 하나 이상의 다른 SA와 연결됩니다. 이 경우 전송은 OFFLOAD_IPSEC_DELETE_UDPESP_SA 구조체의 EncapTypeEntryOffldHandle 멤버를 NULL로 설정합니다. OID_TCP_TASK_IPSEC_DELETE_UDPESP_SA 요청을 받으면 미니포트 드라이버는 OID_TCP_TASK_IPSEC_DELETE_UDPESP_SA 요청에 지정된 SA만 삭제합니다.
참조 수가 0이면 파서 항목이 NIC에 오프로드된 다른 SA와 연결되지 않습니다. 이 경우 전송은 EncapTypeEntryOffldHandle 멤버를 미니포트 드라이버가 이전에 반환한 파서 항목 핸들의 값으로 설정합니다. 미니포트 드라이버는 지정된 파서 항목과 지정된 SA를 모두 삭제합니다.
미니포트 드라이버가 OID_TCP_TASK_IPSEC_DELETE_UDPESP_SA 요청에 실패하는 경우 지정된 SA를 표시하고, 해당하는 경우 삭제를 위해 지정된 파서 항목을 표시하고 나중에 삭제를 수행해야 합니다. 들어오는 패킷을 처리하려면 미니포트 드라이버에서 삭제하도록 표시된 파서 항목 또는 SA를 사용하지 않아야 합니다.
전송은 미니포트 드라이버가 해당 SA 또는 파서 항목(또는 둘 다)을 추가하기 전에 SA 또는 파서 항목(또는 둘 다)을 삭제하도록 미니포트 드라이버를 요청할 수 있습니다. 따라서 미니포트 드라이버는 더하기 작업을 사용하여 삭제 작업을 직렬화해야 합니다.