Repository: kubernetes-sigs/cloud-provider-azure
Pull request #3297 (2023-02-08 01:58:01)

[e2e] Support dual-stack - Service annotation
Signed-off-by: Zhecheng Li <zhechengli@microsoft.com>

<!--  Thanks for sending a pull request!  Here are some tips for you:

1. If this is your first time, please read our contributor guidelines: https://git.k8s.io/community/contributors/guide/first-contribution.md#your-first-contribution and developer guide https://git.k8s.io/community/contributors/devel/development.md#development-guide
2. Please label this pull request according to what type of issue you are addressing, especially if this is a release targeted pull request. For reference on required PR/issue labels, read here:
https://git.k8s.io/community/contributors/devel/sig-release/release.md#issuepr-kind-label
3. Ensure you have added or ran the appropriate tests for your PR: https://git.k8s.io/community/contributors/devel/sig-testing/testing.md
4. If you want *faster* PR reviews, read how: https://git.k8s.io/community/contributors/guide/pull-requests.md#best-practices-for-faster-reviews
5. If the PR is unfinished, see how to mark it: https://git.k8s.io/community/contributors/guide/pull-requests.md#marking-unfinished-pull-requests
-->

#### What type of PR is this?
/kind testing
<!--
Add one of the following kinds:
/kind bug
/kind cleanup
/kind documentation
/kind feature
/kind design

Optionally add one or more of the following kinds if applicable:
/kind api-change
/kind deprecation
/kind failing-test
/kind flake
/kind regression
-->

#### What this PR does / why we need it:
[e2e] Support dual-stack - Service annotation
#### Which issue(s) this PR fixes:
<!--
*Automatically closes linked issue when PR is merged.
Usage: `Fixes #<issue number>`, or `Fixes (paste link of issue)`.
_If PR is about `failing-tests or flakes`, please post the related issues/tests in a comment and do not use `Fixes`_*
-->
Fixes #

#### Special notes for your reviewer:

#### Does this PR introduce a user-facing change?
<!--
If no, just write "NONE" in the release-note block below.
If yes, a release note is required:
Enter your extended release note in the block below. If the PR requires additional action from users switching to the new release, include the string "action required".

For more information on release notes see: https://git.k8s.io/community/contributors/guide/release-notes.md
-->
```release-note
NONE
```

#### Additional documentation e.g., KEPs (Kubernetes Enhancement Proposals), usage docs, etc.:

<!--
This section can be blank if this pull request does not require a release note.

When adding links which point to resources within git repositories, like
KEPs or supporting documentation, please reference a specific commit and avoid
linking directly to the master branch. This ensures that links reference a
specific point in time, rather than a document that may change over time.

See here for guidance on getting permanent links to files: https://help.github.com/en/articles/getting-permanent-links-to-files

Please use the following format for linking documentation:
- [KEP]: <link>
- [Usage]: <link>
- [Other doc]: <link>
-->
```docs

```


k8s-ci-robot: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/kubernetes-sigs/cloud-provider-azure/pull/3297#" title="Author self-approved">lzhecheng</a>*

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=kubernetes-sigs%2Fcloud-provider-azure).

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

<details >
Needs approval from an approver in each of these files:

- ~~[OWNERS](https://github.com/kubernetes-sigs/cloud-provider-azure/blob/master/OWNERS)~~ [lzhecheng]

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->
netlify[bot]: ### <span aria-hidden="true">👷</span> Deploy Preview for *kubernetes-sigs-cloud-provide-azure* processing.


|  Name | Link |
|---------------------------------|------------------------|
|<span aria-hidden="true">🔨</span> Latest commit | 642f637dfc41415253745d301eb5c6b8e7a488dd |
|<span aria-hidden="true">🔍</span> Latest deploy log | https://app.netlify.com/sites/kubernetes-sigs-cloud-provide-azure/deploys/63e301abc8eae4000842f0bd |
coveralls: 
[![Coverage Status](https://coveralls.io/builds/56715797/badge)](https://coveralls.io/builds/56715797)

Coverage: 79.409%. Remained the same when pulling **642f637dfc41415253745d301eb5c6b8e7a488dd on lzhecheng:dualstack-e2e-service-annotation** into **55a26100f16e7fb4fe0b2763cde2ecc7b91354a5 on kubernetes-sigs:master**.

k8s-ci-robot: @lzhecheng: The following test **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-cloud-provider-azure-e2e-ccm-vmss-capz | 642f637dfc41415253745d301eb5c6b8e7a488dd | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/3297/pull-cloud-provider-azure-e2e-ccm-vmss-capz/1623139060950241280) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss-capz`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=cloud-provider-azure&pr=3297). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Alzhecheng). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/cloud-provider-azure/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @lzhecheng: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-cloud-provider-azure-e2e-ccm-vmss-capz | 642f637dfc41415253745d301eb5c6b8e7a488dd | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/3297/pull-cloud-provider-azure-e2e-ccm-vmss-capz/1623139060950241280) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss-capz`
pull-cloud-provider-azure-e2e-ccm-capz | 642f637dfc41415253745d301eb5c6b8e7a488dd | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/3297/pull-cloud-provider-azure-e2e-ccm-capz/1623139061105430528) | true | `/test pull-cloud-provider-azure-e2e-ccm-capz`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=cloud-provider-azure&pr=3297). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Alzhecheng). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/cloud-provider-azure/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @lzhecheng: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-cloud-provider-azure-e2e-ccm-vmss-capz | 642f637dfc41415253745d301eb5c6b8e7a488dd | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/3297/pull-cloud-provider-azure-e2e-ccm-vmss-capz/1623139060950241280) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss-capz`
pull-cloud-provider-azure-e2e-ccm-capz | 642f637dfc41415253745d301eb5c6b8e7a488dd | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/3297/pull-cloud-provider-azure-e2e-ccm-capz/1623139061105430528) | true | `/test pull-cloud-provider-azure-e2e-ccm-capz`
pull-cloud-provider-azure-e2e-ccm-vmssflex-capz | 642f637dfc41415253745d301eb5c6b8e7a488dd | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/3297/pull-cloud-provider-azure-e2e-ccm-vmssflex-capz/1623139061025738752) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmssflex-capz`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=cloud-provider-azure&pr=3297). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Alzhecheng). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/cloud-provider-azure/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @lzhecheng: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-cloud-provider-azure-e2e-ccm-vmss-capz | 642f637dfc41415253745d301eb5c6b8e7a488dd | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/3297/pull-cloud-provider-azure-e2e-ccm-vmss-capz/1623139060950241280) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss-capz`
pull-cloud-provider-azure-e2e-ccm-capz | 642f637dfc41415253745d301eb5c6b8e7a488dd | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/3297/pull-cloud-provider-azure-e2e-ccm-capz/1623139061105430528) | true | `/test pull-cloud-provider-azure-e2e-ccm-capz`
pull-cloud-provider-azure-e2e-ccm-vmssflex-capz | 642f637dfc41415253745d301eb5c6b8e7a488dd | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/3297/pull-cloud-provider-azure-e2e-ccm-vmssflex-capz/1623139061025738752) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmssflex-capz`
pull-cloud-provider-azure-e2e-ccm-vmss-ip-lb-capz | 823105a4bf827328b165d7d926d3e27686625845 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/3297/pull-cloud-provider-azure-e2e-ccm-vmss-ip-lb-capz/1623211699265867776) | false | `/test pull-cloud-provider-azure-e2e-ccm-vmss-ip-lb-capz`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=cloud-provider-azure&pr=3297). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Alzhecheng). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/cloud-provider-azure/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @lzhecheng: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-cloud-provider-azure-e2e-ccm-vmss-capz | 642f637dfc41415253745d301eb5c6b8e7a488dd | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/3297/pull-cloud-provider-azure-e2e-ccm-vmss-capz/1623139060950241280) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss-capz`
pull-cloud-provider-azure-e2e-ccm-capz | 642f637dfc41415253745d301eb5c6b8e7a488dd | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/3297/pull-cloud-provider-azure-e2e-ccm-capz/1623139061105430528) | true | `/test pull-cloud-provider-azure-e2e-ccm-capz`
pull-cloud-provider-azure-e2e-ccm-vmss-ip-lb-capz | 823105a4bf827328b165d7d926d3e27686625845 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/3297/pull-cloud-provider-azure-e2e-ccm-vmss-ip-lb-capz/1623211699265867776) | false | `/test pull-cloud-provider-azure-e2e-ccm-vmss-ip-lb-capz`
pull-cloud-provider-azure-e2e-ccm-vmssflex-capz | 823105a4bf827328b165d7d926d3e27686625845 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/3297/pull-cloud-provider-azure-e2e-ccm-vmssflex-capz/1623211699156815872) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmssflex-capz`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=cloud-provider-azure&pr=3297). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Alzhecheng). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/cloud-provider-azure/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @lzhecheng: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-cloud-provider-azure-e2e-ccm-vmss-capz | 642f637dfc41415253745d301eb5c6b8e7a488dd | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/3297/pull-cloud-provider-azure-e2e-ccm-vmss-capz/1623139060950241280) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss-capz`
pull-cloud-provider-azure-e2e-ccm-vmss-ip-lb-capz | 823105a4bf827328b165d7d926d3e27686625845 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/3297/pull-cloud-provider-azure-e2e-ccm-vmss-ip-lb-capz/1623211699265867776) | false | `/test pull-cloud-provider-azure-e2e-ccm-vmss-ip-lb-capz`
pull-cloud-provider-azure-e2e-ccm-vmssflex-capz | 823105a4bf827328b165d7d926d3e27686625845 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/3297/pull-cloud-provider-azure-e2e-ccm-vmssflex-capz/1623211699156815872) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmssflex-capz`
pull-cloud-provider-azure-e2e-ccm-capz | 823105a4bf827328b165d7d926d3e27686625845 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/3297/pull-cloud-provider-azure-e2e-ccm-capz/1623211699211341824) | true | `/test pull-cloud-provider-azure-e2e-ccm-capz`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=cloud-provider-azure&pr=3297). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Alzhecheng). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/cloud-provider-azure/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @lzhecheng: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-cloud-provider-azure-e2e-ccm-vmss-ip-lb-capz | 823105a4bf827328b165d7d926d3e27686625845 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/3297/pull-cloud-provider-azure-e2e-ccm-vmss-ip-lb-capz/1623211699265867776) | false | `/test pull-cloud-provider-azure-e2e-ccm-vmss-ip-lb-capz`
pull-cloud-provider-azure-e2e-ccm-vmssflex-capz | 823105a4bf827328b165d7d926d3e27686625845 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/3297/pull-cloud-provider-azure-e2e-ccm-vmssflex-capz/1623211699156815872) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmssflex-capz`
pull-cloud-provider-azure-e2e-ccm-capz | 823105a4bf827328b165d7d926d3e27686625845 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/3297/pull-cloud-provider-azure-e2e-ccm-capz/1623211699211341824) | true | `/test pull-cloud-provider-azure-e2e-ccm-capz`
pull-cloud-provider-azure-e2e-ccm-vmss-capz | 823105a4bf827328b165d7d926d3e27686625845 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_cloud-provider-azure/3297/pull-cloud-provider-azure-e2e-ccm-vmss-capz/1623211699098095616) | true | `/test pull-cloud-provider-azure-e2e-ccm-vmss-capz`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=cloud-provider-azure&pr=3297). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Alzhecheng). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/cloud-provider-azure/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->

Patch:
diff --git a/go.mod b/go.mod
index 8d09ae2ad..fc39ddb5c 100644
--- a/go.mod
+++ b/go.mod
@@ -20,7 +20,7 @@ require (
 	github.com/stretchr/testify v1.8.1
 	golang.org/x/crypto v0.5.0
 	golang.org/x/sync v0.1.0
-	golang.org/x/sys v0.5.0
+	golang.org/x/sys v0.4.0
 	golang.org/x/text v0.6.0
 	k8s.io/api v0.26.1
 	k8s.io/apimachinery v0.26.1
diff --git a/go.sum b/go.sum
index 9e26d7082..7ae8eacf9 100644
--- a/go.sum
+++ b/go.sum
@@ -587,8 +587,8 @@ golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
-golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18=
+golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.4.0 h1:O7UWfv5+A2qiuulQk30kVinPoMtoIPeVaKLEgLpVkvg=
diff --git a/pkg/provider/azure.go b/pkg/provider/azure.go
index 7085ead38..d852c4cc0 100644
--- a/pkg/provider/azure.go
+++ b/pkg/provider/azure.go
@@ -1010,10 +1010,9 @@ func initDiskControllers(az *Cloud) error {
 	klog.V(2).Infof("attach/detach disk operation rate limit QPS: %f, Bucket: %d", qps, bucket)
 
 	common := &controllerCommon{
-		cloud:                        az,
-		lockMap:                      newLockMap(),
-		diskOpRateLimiter:            flowcontrol.NewTokenBucketRateLimiter(qps, bucket),
-		AttachDetachInitialDelayInMs: defaultAttachDetachInitialDelayInMs,
+		cloud:             az,
+		lockMap:           newLockMap(),
+		diskOpRateLimiter: flowcontrol.NewTokenBucketRateLimiter(qps, bucket),
 	}
 
 	az.ManagedDiskController = &ManagedDiskController{common: common}
diff --git a/pkg/provider/azure_controller_common.go b/pkg/provider/azure_controller_common.go
index f0ee81e3a..cd8fa09f2 100644
--- a/pkg/provider/azure_controller_common.go
+++ b/pkg/provider/azure_controller_common.go
@@ -60,9 +60,6 @@ const (
 	updateVMRetryFactor   = 3.0
 	updateVMRetrySteps    = 5
 
-	// default initial delay in milliseconds for batch disk attach/detach
-	defaultAttachDetachInitialDelayInMs = 1000
-
 	// WriteAcceleratorEnabled support for Azure Write Accelerator on Azure Disks
 	// https://docs.microsoft.com/azure/virtual-machines/windows/how-to-enable-write-accelerator
 	WriteAcceleratorEnabled = "writeacceleratorenabled"
@@ -105,8 +102,6 @@ type controllerCommon struct {
 	diskOpRateLimiter flowcontrol.RateLimiter
 	// DisableUpdateCache whether disable update cache in disk attach/detach
 	DisableUpdateCache bool
-	// AttachDetachInitialDelayInMs determines initial delay in milliseconds for batch disk attach/detach
-	AttachDetachInitialDelayInMs int
 }
 
 // AttachDiskOptions attach disk options
@@ -235,8 +230,7 @@ func (c *controllerCommon) AttachDisk(ctx context.Context, async bool, diskName,
 	}
 	node := strings.ToLower(string(nodeName))
 	diskuri := strings.ToLower(diskURI)
-	requestNum, err := c.insertAttachDiskRequest(diskuri, node, &options)
-	if err != nil {
+	if err := c.insertAttachDiskRequest(diskuri, node, &options); err != nil {
 		return -1, err
 	}
 
@@ -248,11 +242,6 @@ func (c *controllerCommon) AttachDisk(ctx context.Context, async bool, diskName,
 		}
 	}()
 
-	if c.AttachDetachInitialDelayInMs > 0 && requestNum == 1 {
-		klog.V(2).Infof("wait %dms for more requests on node %s, current disk attach: %s", c.AttachDetachInitialDelayInMs, node, diskURI)
-		time.Sleep(time.Duration(c.AttachDetachInitialDelayInMs) * time.Millisecond)
-	}
-
 	diskMap, err := c.cleanAttachDiskRequests(node)
 	if err != nil {
 		return -1, err
@@ -332,8 +321,7 @@ func (c *controllerCommon) waitForUpdateResult(ctx context.Context, vmset VMSet,
 	return
 }
 
-// insertAttachDiskRequest return (attachDiskRequestQueueLength, error)
-func (c *controllerCommon) insertAttachDiskRequest(diskURI, nodeName string, options *AttachDiskOptions) (int, error) {
+func (c *controllerCommon) insertAttachDiskRequest(diskURI, nodeName string, options *AttachDiskOptions) error {
 	var diskMap map[string]*AttachDiskOptions
 	attachDiskMapKey := nodeName + attachDiskMapKeySuffix
 	c.lockMap.LockEntry(attachDiskMapKey)
@@ -341,7 +329,7 @@ func (c *controllerCommon) insertAttachDiskRequest(diskURI, nodeName string, opt
 	v, ok := c.attachDiskMap.Load(nodeName)
 	if ok {
 		if diskMap, ok = v.(map[string]*AttachDiskOptions); !ok {
-			return -1, fmt.Errorf("convert attachDiskMap failure on node(%s)", nodeName)
+			return fmt.Errorf("convert attachDiskMap failure on node(%s)", nodeName)
 		}
 	} else {
 		diskMap = make(map[string]*AttachDiskOptions)
@@ -354,7 +342,7 @@ func (c *controllerCommon) insertAttachDiskRequest(diskURI, nodeName string, opt
 	} else {
 		diskMap[diskURI] = options
 	}
-	return len(diskMap), nil
+	return nil
 }
 
 // clean up attach disk requests
@@ -396,18 +384,12 @@ func (c *controllerCommon) DetachDisk(ctx context.Context, diskName, diskURI str
 
 	node := strings.ToLower(string(nodeName))
 	disk := strings.ToLower(diskURI)
-	requestNum, err := c.insertDetachDiskRequest(diskName, disk, node)
-	if err != nil {
+	if err := c.insertDetachDiskRequest(diskName, disk, node); err != nil {
 		return err
 	}
 
 	c.lockMap.LockEntry(node)
 	defer c.lockMap.UnlockEntry(node)
-
-	if c.AttachDetachInitialDelayInMs > 0 && requestNum == 1 {
-		klog.V(2).Infof("wait %dms for more requests on node %s, current disk detach: %s", c.AttachDetachInitialDelayInMs, node, diskURI)
-		time.Sleep(time.Duration(c.AttachDetachInitialDelayInMs) * time.Millisecond)
-	}
 	diskMap, err := c.cleanDetachDiskRequests(node)
 	if err != nil {
 		return err
@@ -459,8 +441,7 @@ func (c *controllerCommon) UpdateVM(ctx context.Context, nodeName types.NodeName
 	return vmset.UpdateVM(ctx, nodeName)
 }
 
-// insertDetachDiskRequest return (detachDiskRequestQueueLength, error)
-func (c *controllerCommon) insertDetachDiskRequest(diskName, diskURI, nodeName string) (int, error) {
+func (c *controllerCommon) insertDetachDiskRequest(diskName, diskURI, nodeName string) error {
 	var diskMap map[string]string
 	detachDiskMapKey := nodeName + detachDiskMapKeySuffix
 	c.lockMap.LockEntry(detachDiskMapKey)
@@ -468,7 +449,7 @@ func (c *controllerCommon) insertDetachDiskRequest(diskName, diskURI, nodeName s
 	v, ok := c.detachDiskMap.Load(nodeName)
 	if ok {
 		if diskMap, ok = v.(map[string]string); !ok {
-			return -1, fmt.Errorf("convert detachDiskMap failure on node(%s)", nodeName)
+			return fmt.Errorf("convert detachDiskMap failure on node(%s)", nodeName)
 		}
 	} else {
 		diskMap = make(map[string]string)
@@ -481,7 +462,7 @@ func (c *controllerCommon) insertDetachDiskRequest(diskName, diskURI, nodeName s
 	} else {
 		diskMap[diskURI] = diskName
 	}
-	return len(diskMap), nil
+	return nil
 }
 
 // clean up detach disk requests
diff --git a/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c b/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c
index 6cc73109f..a4605e6d1 100644
--- a/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c
+++ b/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build (386 || amd64 || amd64p32) && gccgo
 // +build 386 amd64 amd64p32
 // +build gccgo
 
diff --git a/vendor/golang.org/x/sys/cpu/endian_big.go b/vendor/golang.org/x/sys/cpu/endian_big.go
deleted file mode 100644
index 93ce03a34..000000000
--- a/vendor/golang.org/x/sys/cpu/endian_big.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2023 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//go:build armbe || arm64be || m68k || mips || mips64 || mips64p32 || ppc || ppc64 || s390 || s390x || shbe || sparc || sparc64
-// +build armbe arm64be m68k mips mips64 mips64p32 ppc ppc64 s390 s390x shbe sparc sparc64
-
-package cpu
-
-// IsBigEndian records whether the GOARCH's byte order is big endian.
-const IsBigEndian = true
diff --git a/vendor/golang.org/x/sys/cpu/endian_little.go b/vendor/golang.org/x/sys/cpu/endian_little.go
deleted file mode 100644
index fe545966b..000000000
--- a/vendor/golang.org/x/sys/cpu/endian_little.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2023 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//go:build 386 || amd64 || amd64p32 || alpha || arm || arm64 || loong64 || mipsle || mips64le || mips64p32le || nios2 || ppc64le || riscv || riscv64 || sh
-// +build 386 amd64 amd64p32 alpha arm arm64 loong64 mipsle mips64le mips64p32le nios2 ppc64le riscv riscv64 sh
-
-package cpu
-
-// IsBigEndian records whether the GOARCH's byte order is big endian.
-const IsBigEndian = false
diff --git a/vendor/golang.org/x/sys/unix/gccgo_c.c b/vendor/golang.org/x/sys/unix/gccgo_c.c
index f98a1c542..c4fce0e70 100644
--- a/vendor/golang.org/x/sys/unix/gccgo_c.c
+++ b/vendor/golang.org/x/sys/unix/gccgo_c.c
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build gccgo && !aix && !hurd
-// +build gccgo,!aix,!hurd
+// +build gccgo,!hurd
+// +build !aix,!hurd
 
 #include <errno.h>
 #include <stdint.h>
diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.go b/vendor/golang.org/x/sys/unix/syscall_darwin.go
index 192b071b3..1f6338218 100644
--- a/vendor/golang.org/x/sys/unix/syscall_darwin.go
+++ b/vendor/golang.org/x/sys/unix/syscall_darwin.go
@@ -230,7 +230,6 @@ func direntNamlen(buf []byte) (uint64, bool) {
 
 func PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) }
 func PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) }
-func PtraceDenyAttach() (err error)    { return ptrace(PT_DENY_ATTACH, 0, 0, 0) }
 
 //sysnb	pipe(p *[2]int32) (err error)
 
diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go
index 6a91d471d..b11ede89a 100644
--- a/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go
+++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go
@@ -60,13 +60,8 @@ func PtraceGetFsBase(pid int, fsbase *int64) (err error) {
 	return ptrace(PT_GETFSBASE, pid, uintptr(unsafe.Pointer(fsbase)), 0)
 }
 
-func PtraceIO(req int, pid int, offs uintptr, out []byte, countin int) (count int, err error) {
-	ioDesc := PtraceIoDesc{
-		Op:   int32(req),
-		Offs: offs,
-		Addr: uintptr(unsafe.Pointer(&out[0])), // TODO(#58351): this is not safe.
-		Len:  uint32(countin),
-	}
+func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
+	ioDesc := PtraceIoDesc{Op: int32(req), Offs: uintptr(unsafe.Pointer(addr)), Addr: uintptr(unsafe.Pointer(&out[0])), Len: uint32(countin)}
 	err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
 	return int(ioDesc.Len), err
 }
diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go
index 48110a0ab..9ed8eec6c 100644
--- a/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go
+++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go
@@ -60,13 +60,8 @@ func PtraceGetFsBase(pid int, fsbase *int64) (err error) {
 	return ptrace(PT_GETFSBASE, pid, uintptr(unsafe.Pointer(fsbase)), 0)
 }
 
-func PtraceIO(req int, pid int, offs uintptr, out []byte, countin int) (count int, err error) {
-	ioDesc := PtraceIoDesc{
-		Op:   int32(req),
-		Offs: offs,
-		Addr: uintptr(unsafe.Pointer(&out[0])), // TODO(#58351): this is not safe.
-		Len:  uint64(countin),
-	}
+func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
+	ioDesc := PtraceIoDesc{Op: int32(req), Offs: uintptr(unsafe.Pointer(addr)), Addr: uintptr(unsafe.Pointer(&out[0])), Len: uint64(countin)}
 	err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
 	return int(ioDesc.Len), err
 }
diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go
index 52f1d4b75..f8ac98247 100644
--- a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go
+++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go
@@ -56,13 +56,8 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
 
 func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
 
-func PtraceIO(req int, pid int, offs uintptr, out []byte, countin int) (count int, err error) {
-	ioDesc := PtraceIoDesc{
-		Op:   int32(req),
-		Offs: offs,
-		Addr: uintptr(unsafe.Pointer(&out[0])), // TODO(#58351): this is not safe.
-		Len:  uint32(countin),
-	}
+func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
+	ioDesc := PtraceIoDesc{Op: int32(req), Offs: uintptr(unsafe.Pointer(addr)), Addr: uintptr(unsafe.Pointer(&out[0])), Len: uint32(countin)}
 	err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
 	return int(ioDesc.Len), err
 }
diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go
index 5537ee4f2..8e932036e 100644
--- a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go
+++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go
@@ -56,13 +56,8 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
 
 func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
 
-func PtraceIO(req int, pid int, offs uintptr, out []byte, countin int) (count int, err error) {
-	ioDesc := PtraceIoDesc{
-		Op:   int32(req),
-		Offs: offs,
-		Addr: uintptr(unsafe.Pointer(&out[0])), // TODO(#58351): this is not safe.
-		Len:  uint64(countin),
-	}
+func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
+	ioDesc := PtraceIoDesc{Op: int32(req), Offs: uintptr(unsafe.Pointer(addr)), Addr: uintptr(unsafe.Pointer(&out[0])), Len: uint64(countin)}
 	err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
 	return int(ioDesc.Len), err
 }
diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go
index 164abd5d2..cbe122278 100644
--- a/vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go
+++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go
@@ -56,13 +56,8 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
 
 func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
 
-func PtraceIO(req int, pid int, offs uintptr, out []byte, countin int) (count int, err error) {
-	ioDesc := PtraceIoDesc{
-		Op:   int32(req),
-		Offs: offs,
-		Addr: uintptr(unsafe.Pointer(&out[0])), // TODO(#58351): this is not safe.
-		Len:  uint64(countin),
-	}
+func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
+	ioDesc := PtraceIoDesc{Op: int32(req), Offs: uintptr(unsafe.Pointer(addr)), Addr: uintptr(unsafe.Pointer(&out[0])), Len: uint64(countin)}
 	err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
 	return int(ioDesc.Len), err
 }
diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go
index 5443dddd4..d839962e6 100644
--- a/vendor/golang.org/x/sys/unix/syscall_linux.go
+++ b/vendor/golang.org/x/sys/unix/syscall_linux.go
@@ -1800,7 +1800,6 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
 //sysnb	Capset(hdr *CapUserHeader, data *CapUserData) (err error)
 //sys	Chdir(path string) (err error)
 //sys	Chroot(path string) (err error)
-//sys	ClockAdjtime(clockid int32, buf *Timex) (state int, err error)
 //sys	ClockGetres(clockid int32, res *Timespec) (err error)
 //sys	ClockGettime(clockid int32, time *Timespec) (err error)
 //sys	ClockNanosleep(clockid int32, flags int, request *Timespec, remain *Timespec) (err error)
@@ -2000,7 +1999,7 @@ func appendBytes(vecs []Iovec, bs [][]byte) []Iovec {
 // offs2lohi splits offs into its low and high order bits.
 func offs2lohi(offs int64) (lo, hi uintptr) {
 	const longBits = SizeofLong * 8
-	return uintptr(offs), uintptr(uint64(offs) >> (longBits - 1) >> 1) // two shifts to avoid false positive in vet
+	return uintptr(offs), uintptr(uint64(offs) >> longBits)
 }
 
 func Readv(fd int, iovs [][]byte) (n int, err error) {
diff --git a/vendor/golang.org/x/sys/unix/syscall_unix.go b/vendor/golang.org/x/sys/unix/syscall_unix.go
index 00f0aa375..a386f8897 100644
--- a/vendor/golang.org/x/sys/unix/syscall_unix.go
+++ b/vendor/golang.org/x/sys/unix/syscall_unix.go
@@ -578,7 +578,7 @@ func Lutimes(path string, tv []Timeval) error {
 	return UtimesNanoAt(AT_FDCWD, path, ts, AT_SYMLINK_NOFOLLOW)
 }
 
-// emptyIovecs reports whether there are no bytes in the slice of Iovec.
+// emptyIovec reports whether there are no bytes in the slice of Iovec.
 func emptyIovecs(iov []Iovec) bool {
 	for i := range iov {
 		if iov[i].Len > 0 {
diff --git a/vendor/golang.org/x/sys/unix/timestruct.go b/vendor/golang.org/x/sys/unix/timestruct.go
index 616b1b284..3d8930405 100644
--- a/vendor/golang.org/x/sys/unix/timestruct.go
+++ b/vendor/golang.org/x/sys/unix/timestruct.go
@@ -9,7 +9,7 @@ package unix
 
 import "time"
 
-// TimespecToNsec returns the time stored in ts as nanoseconds.
+// TimespecToNSec returns the time stored in ts as nanoseconds.
 func TimespecToNsec(ts Timespec) int64 { return ts.Nano() }
 
 // NsecToTimespec converts a number of nanoseconds into a Timespec.
diff --git a/vendor/golang.org/x/sys/unix/xattr_bsd.go b/vendor/golang.org/x/sys/unix/xattr_bsd.go
index f5f8e9f36..663b3779d 100644
--- a/vendor/golang.org/x/sys/unix/xattr_bsd.go
+++ b/vendor/golang.org/x/sys/unix/xattr_bsd.go
@@ -36,14 +36,9 @@ func xattrnamespace(fullattr string) (ns int, attr string, err error) {
 func initxattrdest(dest []byte, idx int) (d unsafe.Pointer) {
 	if len(dest) > idx {
 		return unsafe.Pointer(&dest[idx])
+	} else {
+		return unsafe.Pointer(_zero)
 	}
-	if dest != nil {
-		// extattr_get_file and extattr_list_file treat NULL differently from
-		// a non-NULL pointer of length zero. Preserve the property of nilness,
-		// even if we can't use dest directly.
-		return unsafe.Pointer(&_zero)
-	}
-	return nil
 }
 
 // FreeBSD and NetBSD implement their own syscalls to handle extended attributes
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux.go b/vendor/golang.org/x/sys/unix/zerrors_linux.go
index e174685ad..785d693eb 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux.go
@@ -457,6 +457,7 @@ const (
 	B600                                        = 0x8
 	B75                                         = 0x2
 	B9600                                       = 0xd
+	BALLOON_KVM_MAGIC                           = 0x13661366
 	BDEVFS_MAGIC                                = 0x62646576
 	BINDERFS_SUPER_MAGIC                        = 0x6c6f6f70
 	BINFMTFS_MAGIC                              = 0x42494e4d
@@ -562,7 +563,6 @@ const (
 	BUS_USB                                     = 0x3
 	BUS_VIRTUAL                                 = 0x6
 	CAN_BCM                                     = 0x2
-	CAN_BUS_OFF_THRESHOLD                       = 0x100
 	CAN_CTRLMODE_3_SAMPLES                      = 0x4
 	CAN_CTRLMODE_BERR_REPORTING                 = 0x10
 	CAN_CTRLMODE_CC_LEN8_DLC                    = 0x100
@@ -577,12 +577,9 @@ const (
 	CAN_EFF_FLAG                                = 0x80000000
 	CAN_EFF_ID_BITS                             = 0x1d
 	CAN_EFF_MASK                                = 0x1fffffff
-	CAN_ERROR_PASSIVE_THRESHOLD                 = 0x80
-	CAN_ERROR_WARNING_THRESHOLD                 = 0x60
 	CAN_ERR_ACK                                 = 0x20
 	CAN_ERR_BUSERROR                            = 0x80
 	CAN_ERR_BUSOFF                              = 0x40
-	CAN_ERR_CNT                                 = 0x200
 	CAN_ERR_CRTL                                = 0x4
 	CAN_ERR_CRTL_ACTIVE                         = 0x40
 	CAN_ERR_CRTL_RX_OVERFLOW                    = 0x1
@@ -823,9 +820,9 @@ const (
 	DM_UUID_FLAG                                = 0x4000
 	DM_UUID_LEN                                 = 0x81
 	DM_VERSION                                  = 0xc138fd00
-	DM_VERSION_EXTRA                            = "-ioctl (2022-07-28)"
+	DM_VERSION_EXTRA                            = "-ioctl (2022-02-22)"
 	DM_VERSION_MAJOR                            = 0x4
-	DM_VERSION_MINOR                            = 0x2f
+	DM_VERSION_MINOR                            = 0x2e
 	DM_VERSION_PATCHLEVEL                       = 0x0
 	DT_BLK                                      = 0x6
 	DT_CHR                                      = 0x2
@@ -1052,7 +1049,6 @@ const (
 	ETH_P_CAIF                                  = 0xf7
 	ETH_P_CAN                                   = 0xc
 	ETH_P_CANFD                                 = 0xd
-	ETH_P_CANXL                                 = 0xe
 	ETH_P_CFM                                   = 0x8902
 	ETH_P_CONTROL                               = 0x16
 	ETH_P_CUST                                  = 0x6006
@@ -1064,7 +1060,6 @@ const (
 	ETH_P_DNA_RT                                = 0x6003
 	ETH_P_DSA                                   = 0x1b
 	ETH_P_DSA_8021Q                             = 0xdadb
-	ETH_P_DSA_A5PSW                             = 0xe001
 	ETH_P_ECONET                                = 0x18
 	ETH_P_EDSA                                  = 0xdada
 	ETH_P_ERSPAN                                = 0x88be
@@ -1199,10 +1194,8 @@ const (
 	FAN_MARK_EVICTABLE                          = 0x200
 	FAN_MARK_FILESYSTEM                         = 0x100
 	FAN_MARK_FLUSH                              = 0x80
-	FAN_MARK_IGNORE                             = 0x400
 	FAN_MARK_IGNORED_MASK                       = 0x20
 	FAN_MARK_IGNORED_SURV_MODIFY                = 0x40
-	FAN_MARK_IGNORE_SURV                        = 0x440
 	FAN_MARK_INODE                              = 0x0
 	FAN_MARK_MOUNT                              = 0x10
 	FAN_MARK_ONLYDIR                            = 0x8
@@ -1260,7 +1253,6 @@ const (
 	FSCRYPT_MODE_AES_128_CBC                    = 0x5
 	FSCRYPT_MODE_AES_128_CTS                    = 0x6
 	FSCRYPT_MODE_AES_256_CTS                    = 0x4
-	FSCRYPT_MODE_AES_256_HCTR2                  = 0xa
 	FSCRYPT_MODE_AES_256_XTS                    = 0x1
 	FSCRYPT_POLICY_FLAGS_PAD_16                 = 0x2
 	FSCRYPT_POLICY_FLAGS_PAD_32                 = 0x3
@@ -1438,7 +1430,6 @@ const (
 	IFF_NOARP                                   = 0x80
 	IFF_NOFILTER                                = 0x1000
 	IFF_NOTRAILERS                              = 0x20
-	IFF_NO_CARRIER                              = 0x40
 	IFF_NO_PI                                   = 0x1000
 	IFF_ONE_QUEUE                               = 0x2000
 	IFF_PERSIST                                 = 0x800
@@ -1814,7 +1805,6 @@ const (
 	MADV_DONTDUMP                               = 0x10
 	MADV_DONTFORK                               = 0xa
 	MADV_DONTNEED                               = 0x4
-	MADV_DONTNEED_LOCKED                        = 0x18
 	MADV_FREE                                   = 0x8
 	MADV_HUGEPAGE                               = 0xe
 	MADV_HWPOISON                               = 0x64
@@ -1856,7 +1846,7 @@ const (
 	MFD_ALLOW_SEALING                           = 0x2
 	MFD_CLOEXEC                                 = 0x1
 	MFD_HUGETLB                                 = 0x4
-	MFD_HUGE_16GB                               = 0x88000000
+	MFD_HUGE_16GB                               = -0x78000000
 	MFD_HUGE_16MB                               = 0x60000000
 	MFD_HUGE_1GB                                = 0x78000000
 	MFD_HUGE_1MB                                = 0x50000000
@@ -2222,11 +2212,6 @@ const (
 	PERF_AUX_FLAG_PARTIAL                       = 0x4
 	PERF_AUX_FLAG_PMU_FORMAT_TYPE_MASK          = 0xff00
 	PERF_AUX_FLAG_TRUNCATED                     = 0x1
-	PERF_BR_ARM64_DEBUG_DATA                    = 0x7
-	PERF_BR_ARM64_DEBUG_EXIT                    = 0x5
-	PERF_BR_ARM64_DEBUG_HALT                    = 0x4
-	PERF_BR_ARM64_DEBUG_INST                    = 0x6
-	PERF_BR_ARM64_FIQ                           = 0x3
 	PERF_FLAG_FD_CLOEXEC                        = 0x8
 	PERF_FLAG_FD_NO_GROUP                       = 0x1
 	PERF_FLAG_FD_OUTPUT                         = 0x2
@@ -2247,8 +2232,6 @@ const (
 	PERF_MEM_LOCK_NA                            = 0x1
 	PERF_MEM_LOCK_SHIFT                         = 0x18
 	PERF_MEM_LVLNUM_ANY_CACHE                   = 0xb
-	PERF_MEM_LVLNUM_CXL                         = 0x9
-	PERF_MEM_LVLNUM_IO                          = 0xa
 	PERF_MEM_LVLNUM_L1                          = 0x1
 	PERF_MEM_LVLNUM_L2                          = 0x2
 	PERF_MEM_LVLNUM_L3                          = 0x3
@@ -2282,7 +2265,6 @@ const (
 	PERF_MEM_REMOTE_REMOTE                      = 0x1
 	PERF_MEM_REMOTE_SHIFT                       = 0x25
 	PERF_MEM_SNOOPX_FWD                         = 0x1
-	PERF_MEM_SNOOPX_PEER                        = 0x2
 	PERF_MEM_SNOOPX_SHIFT                       = 0x26
 	PERF_MEM_SNOOP_HIT                          = 0x4
 	PERF_MEM_SNOOP_HITM                         = 0x10
@@ -2319,6 +2301,7 @@ const (
 	PERF_SAMPLE_BRANCH_PLM_ALL                  = 0x7
 	PERF_SAMPLE_WEIGHT_TYPE                     = 0x1004000
 	PIPEFS_MAGIC                                = 0x50495045
+	PPC_CMM_MAGIC                               = 0xc7571590
 	PPPIOCGNPMODE                               = 0xc008744c
 	PPPIOCNEWUNIT                               = 0xc004743e
 	PRIO_PGRP                                   = 0x1
@@ -3016,7 +2999,6 @@ const (
 	STATX_BLOCKS                                = 0x400
 	STATX_BTIME                                 = 0x800
 	STATX_CTIME                                 = 0x80
-	STATX_DIOALIGN                              = 0x2000
 	STATX_GID                                   = 0x10
 	STATX_INO                                   = 0x100
 	STATX_MNT_ID                                = 0x1000
@@ -3410,7 +3392,9 @@ const (
 	XDP_ZEROCOPY                                = 0x4
 	XENFS_SUPER_MAGIC                           = 0xabba1974
 	XFS_SUPER_MAGIC                             = 0x58465342
+	Z3FOLD_MAGIC                                = 0x33
 	ZONEFS_MAGIC                                = 0x5a4f4653
+	ZSMALLOC_MAGIC                              = 0x58295829
 	_HIDIOCGRAWNAME_LEN                         = 0x80
 	_HIDIOCGRAWPHYS_LEN                         = 0x40
 	_HIDIOCGRAWUNIQ_LEN                         = 0x40
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go
index a46df0f1e..36c0dfc7c 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go
@@ -133,7 +133,6 @@ const (
 	MEMGETREGIONCOUNT                = 0x80044d07
 	MEMISLOCKED                      = 0x80084d17
 	MEMLOCK                          = 0x40084d05
-	MEMREAD                          = 0xc03c4d1a
 	MEMREADOOB                       = 0xc00c4d04
 	MEMSETBADBLOCK                   = 0x40084d0c
 	MEMUNLOCK                        = 0x40084d06
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go
index 6cd4a3ea9..4ff942703 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go
@@ -133,7 +133,6 @@ const (
 	MEMGETREGIONCOUNT                = 0x80044d07
 	MEMISLOCKED                      = 0x80084d17
 	MEMLOCK                          = 0x40084d05
-	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc0104d04
 	MEMSETBADBLOCK                   = 0x40084d0c
 	MEMUNLOCK                        = 0x40084d06
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go
index c7ebee24d..3eaa0fb78 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go
@@ -131,7 +131,6 @@ const (
 	MEMGETREGIONCOUNT                = 0x80044d07
 	MEMISLOCKED                      = 0x80084d17
 	MEMLOCK                          = 0x40084d05
-	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc00c4d04
 	MEMSETBADBLOCK                   = 0x40084d0c
 	MEMUNLOCK                        = 0x40084d06
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go
index 9d5352c3e..d7995bdc3 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go
@@ -134,7 +134,6 @@ const (
 	MEMGETREGIONCOUNT                = 0x80044d07
 	MEMISLOCKED                      = 0x80084d17
 	MEMLOCK                          = 0x40084d05
-	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc0104d04
 	MEMSETBADBLOCK                   = 0x40084d0c
 	MEMUNLOCK                        = 0x40084d06
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go
index f26a164f4..928e24c20 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go
@@ -132,7 +132,6 @@ const (
 	MEMGETREGIONCOUNT                = 0x80044d07
 	MEMISLOCKED                      = 0x80084d17
 	MEMLOCK                          = 0x40084d05
-	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc0104d04
 	MEMSETBADBLOCK                   = 0x40084d0c
 	MEMUNLOCK                        = 0x40084d06
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go
index 890bc3c9b..179bffb47 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go
@@ -131,7 +131,6 @@ const (
 	MEMGETREGIONCOUNT                = 0x40044d07
 	MEMISLOCKED                      = 0x40084d17
 	MEMLOCK                          = 0x80084d05
-	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc00c4d04
 	MEMSETBADBLOCK                   = 0x80084d0c
 	MEMUNLOCK                        = 0x80084d06
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go
index 549f26ac6..1fba17bd7 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go
@@ -131,7 +131,6 @@ const (
 	MEMGETREGIONCOUNT                = 0x40044d07
 	MEMISLOCKED                      = 0x40084d17
 	MEMLOCK                          = 0x80084d05
-	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc0104d04
 	MEMSETBADBLOCK                   = 0x80084d0c
 	MEMUNLOCK                        = 0x80084d06
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go
index e0365e32c..b77dde315 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go
@@ -131,7 +131,6 @@ const (
 	MEMGETREGIONCOUNT                = 0x40044d07
 	MEMISLOCKED                      = 0x40084d17
 	MEMLOCK                          = 0x80084d05
-	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc0104d04
 	MEMSETBADBLOCK                   = 0x80084d0c
 	MEMUNLOCK                        = 0x80084d06
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go
index fdccce15c..78c6c751b 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go
@@ -131,7 +131,6 @@ const (
 	MEMGETREGIONCOUNT                = 0x40044d07
 	MEMISLOCKED                      = 0x40084d17
 	MEMLOCK                          = 0x80084d05
-	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc00c4d04
 	MEMSETBADBLOCK                   = 0x80084d0c
 	MEMUNLOCK                        = 0x80084d06
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go
index b2205c83f..1c0d31f0b 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go
@@ -131,7 +131,6 @@ const (
 	MEMGETREGIONCOUNT                = 0x40044d07
 	MEMISLOCKED                      = 0x40084d17
 	MEMLOCK                          = 0x80084d05
-	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc00c4d04
 	MEMSETBADBLOCK                   = 0x80084d0c
 	MEMUNLOCK                        = 0x80084d06
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go
index 81aa5ad0f..959dd9bb8 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go
@@ -131,7 +131,6 @@ const (
 	MEMGETREGIONCOUNT                = 0x40044d07
 	MEMISLOCKED                      = 0x40084d17
 	MEMLOCK                          = 0x80084d05
-	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc0104d04
 	MEMSETBADBLOCK                   = 0x80084d0c
 	MEMUNLOCK                        = 0x80084d06
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go
index 76807a1fd..5a873cdbc 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go
@@ -131,7 +131,6 @@ const (
 	MEMGETREGIONCOUNT                = 0x40044d07
 	MEMISLOCKED                      = 0x40084d17
 	MEMLOCK                          = 0x80084d05
-	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc0104d04
 	MEMSETBADBLOCK                   = 0x80084d0c
 	MEMUNLOCK                        = 0x80084d06
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go
index d4a5ab9e4..e336d141e 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go
@@ -131,7 +131,6 @@ const (
 	MEMGETREGIONCOUNT                = 0x80044d07
 	MEMISLOCKED                      = 0x80084d17
 	MEMLOCK                          = 0x40084d05
-	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc0104d04
 	MEMSETBADBLOCK                   = 0x40084d0c
 	MEMUNLOCK                        = 0x40084d06
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go
index 66e65db95..390c01d92 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go
@@ -131,7 +131,6 @@ const (
 	MEMGETREGIONCOUNT                = 0x80044d07
 	MEMISLOCKED                      = 0x80084d17
 	MEMLOCK                          = 0x40084d05
-	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc0104d04
 	MEMSETBADBLOCK                   = 0x40084d0c
 	MEMUNLOCK                        = 0x40084d06
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go
index f61925269..98a6e5f11 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go
@@ -136,7 +136,6 @@ const (
 	MEMGETREGIONCOUNT                = 0x40044d07
 	MEMISLOCKED                      = 0x40084d17
 	MEMLOCK                          = 0x80084d05
-	MEMREAD                          = 0xc0404d1a
 	MEMREADOOB                       = 0xc0104d04
 	MEMSETBADBLOCK                   = 0x80084d0c
 	MEMUNLOCK                        = 0x80084d06
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux.go b/vendor/golang.org/x/sys/unix/zsyscall_linux.go
index 36ea3a55b..293cf3680 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux.go
@@ -537,17 +537,6 @@ func Chroot(path string) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func ClockAdjtime(clockid int32, buf *Timex) (state int, err error) {
-	r0, _, e1 := Syscall(SYS_CLOCK_ADJTIME, uintptr(clockid), uintptr(unsafe.Pointer(buf)), 0)
-	state = int(r0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func ClockGetres(clockid int32, res *Timespec) (err error) {
 	_, _, e1 := Syscall(SYS_CLOCK_GETRES, uintptr(clockid), uintptr(unsafe.Pointer(res)), 0)
 	if e1 != 0 {
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux.go b/vendor/golang.org/x/sys/unix/ztypes_linux.go
index 7d9fc8f1c..ff6881167 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux.go
@@ -29,41 +29,6 @@ type Itimerval struct {
 	Value    Timeval
 }
 
-const (
-	ADJ_OFFSET            = 0x1
-	ADJ_FREQUENCY         = 0x2
-	ADJ_MAXERROR          = 0x4
-	ADJ_ESTERROR          = 0x8
-	ADJ_STATUS            = 0x10
-	ADJ_TIMECONST         = 0x20
-	ADJ_TAI               = 0x80
-	ADJ_SETOFFSET         = 0x100
-	ADJ_MICRO             = 0x1000
-	ADJ_NANO              = 0x2000
-	ADJ_TICK              = 0x4000
-	ADJ_OFFSET_SINGLESHOT = 0x8001
-	ADJ_OFFSET_SS_READ    = 0xa001
-)
-
-const (
-	STA_PLL       = 0x1
-	STA_PPSFREQ   = 0x2
-	STA_PPSTIME   = 0x4
-	STA_FLL       = 0x8
-	STA_INS       = 0x10
-	STA_DEL       = 0x20
-	STA_UNSYNC    = 0x40
-	STA_FREQHOLD  = 0x80
-	STA_PPSSIGNAL = 0x100
-	STA_PPSJITTER = 0x200
-	STA_PPSWANDER = 0x400
-	STA_PPSERROR  = 0x800
-	STA_CLOCKERR  = 0x1000
-	STA_NANO      = 0x2000
-	STA_MODE      = 0x4000
-	STA_CLK       = 0x8000
-)
-
 const (
 	TIME_OK    = 0x0
 	TIME_INS   = 0x1
@@ -88,30 +53,29 @@ type StatxTimestamp struct {
 }
 
 type Statx_t struct {
-	Mask             uint32
-	Blksize          uint32
-	Attributes       uint64
-	Nlink            uint32
-	Uid              uint32
-	Gid              uint32
-	Mode             uint16
-	_                [1]uint16
-	Ino              uint64
-	Size             uint64
-	Blocks           uint64
-	Attributes_mask  uint64
-	Atime            StatxTimestamp
-	Btime            StatxTimestamp
-	Ctime            StatxTimestamp
-	Mtime            StatxTimestamp
-	Rdev_major       uint32
-	Rdev_minor       uint32
-	Dev_major        uint32
-	Dev_minor        uint32
-	Mnt_id           uint64
-	Dio_mem_align    uint32
-	Dio_offset_align uint32
-	_                [12]uint64
+	Mask            uint32
+	Blksize         uint32
+	Attributes      uint64
+	Nlink           uint32
+	Uid             uint32
+	Gid             uint32
+	Mode            uint16
+	_               [1]uint16
+	Ino             uint64
+	Size            uint64
+	Blocks          uint64
+	Attributes_mask uint64
+	Atime           StatxTimestamp
+	Btime           StatxTimestamp
+	Ctime           StatxTimestamp
+	Mtime           StatxTimestamp
+	Rdev_major      uint32
+	Rdev_minor      uint32
+	Dev_major       uint32
+	Dev_minor       uint32
+	Mnt_id          uint64
+	_               uint64
+	_               [12]uint64
 }
 
 type Fsid struct {
@@ -1135,8 +1099,7 @@ const (
 	PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT    = 0xf
 	PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT    = 0x10
 	PERF_SAMPLE_BRANCH_HW_INDEX_SHIFT     = 0x11
-	PERF_SAMPLE_BRANCH_PRIV_SAVE_SHIFT    = 0x12
-	PERF_SAMPLE_BRANCH_MAX_SHIFT          = 0x13
+	PERF_SAMPLE_BRANCH_MAX_SHIFT          = 0x12
 	PERF_SAMPLE_BRANCH_USER               = 0x1
 	PERF_SAMPLE_BRANCH_KERNEL             = 0x2
 	PERF_SAMPLE_BRANCH_HV                 = 0x4
@@ -1155,8 +1118,7 @@ const (
 	PERF_SAMPLE_BRANCH_NO_CYCLES          = 0x8000
 	PERF_SAMPLE_BRANCH_TYPE_SAVE          = 0x10000
 	PERF_SAMPLE_BRANCH_HW_INDEX           = 0x20000
-	PERF_SAMPLE_BRANCH_PRIV_SAVE          = 0x40000
-	PERF_SAMPLE_BRANCH_MAX                = 0x80000
+	PERF_SAMPLE_BRANCH_MAX                = 0x40000
 	PERF_BR_UNKNOWN                       = 0x0
 	PERF_BR_COND                          = 0x1
 	PERF_BR_UNCOND                        = 0x2
@@ -1170,10 +1132,7 @@ const (
 	PERF_BR_COND_RET                      = 0xa
 	PERF_BR_ERET                          = 0xb
 	PERF_BR_IRQ                           = 0xc
-	PERF_BR_SERROR                        = 0xd
-	PERF_BR_NO_TX                         = 0xe
-	PERF_BR_EXTEND_ABI                    = 0xf
-	PERF_BR_MAX                           = 0x10
+	PERF_BR_MAX                           = 0xd
 	PERF_SAMPLE_REGS_ABI_NONE             = 0x0
 	PERF_SAMPLE_REGS_ABI_32               = 0x1
 	PERF_SAMPLE_REGS_ABI_64               = 0x2
@@ -1192,8 +1151,7 @@ const (
 	PERF_FORMAT_TOTAL_TIME_RUNNING        = 0x2
 	PERF_FORMAT_ID                        = 0x4
 	PERF_FORMAT_GROUP                     = 0x8
-	PERF_FORMAT_LOST                      = 0x10
-	PERF_FORMAT_MAX                       = 0x20
+	PERF_FORMAT_MAX                       = 0x10
 	PERF_IOC_FLAG_GROUP                   = 0x1
 	PERF_RECORD_MMAP                      = 0x1
 	PERF_RECORD_LOST                      = 0x2
@@ -3021,16 +2979,7 @@ const (
 	DEVLINK_CMD_TRAP_POLICER_NEW                       = 0x47
 	DEVLINK_CMD_TRAP_POLICER_DEL                       = 0x48
 	DEVLINK_CMD_HEALTH_REPORTER_TEST                   = 0x49
-	DEVLINK_CMD_RATE_GET                               = 0x4a
-	DEVLINK_CMD_RATE_SET                               = 0x4b
-	DEVLINK_CMD_RATE_NEW                               = 0x4c
-	DEVLINK_CMD_RATE_DEL                               = 0x4d
-	DEVLINK_CMD_LINECARD_GET                           = 0x4e
-	DEVLINK_CMD_LINECARD_SET                           = 0x4f
-	DEVLINK_CMD_LINECARD_NEW                           = 0x50
-	DEVLINK_CMD_LINECARD_DEL                           = 0x51
-	DEVLINK_CMD_SELFTESTS_GET                          = 0x52
-	DEVLINK_CMD_MAX                                    = 0x53
+	DEVLINK_CMD_MAX                                    = 0x51
 	DEVLINK_PORT_TYPE_NOTSET                           = 0x0
 	DEVLINK_PORT_TYPE_AUTO                             = 0x1
 	DEVLINK_PORT_TYPE_ETH                              = 0x2
@@ -3259,13 +3208,7 @@ const (
 	DEVLINK_ATTR_RATE_NODE_NAME                        = 0xa8
 	DEVLINK_ATTR_RATE_PARENT_NODE_NAME                 = 0xa9
 	DEVLINK_ATTR_REGION_MAX_SNAPSHOTS                  = 0xaa
-	DEVLINK_ATTR_LINECARD_INDEX                        = 0xab
-	DEVLINK_ATTR_LINECARD_STATE                        = 0xac
-	DEVLINK_ATTR_LINECARD_TYPE                         = 0xad
-	DEVLINK_ATTR_LINECARD_SUPPORTED_TYPES              = 0xae
-	DEVLINK_ATTR_NESTED_DEVLINK                        = 0xaf
-	DEVLINK_ATTR_SELFTESTS                             = 0xb0
-	DEVLINK_ATTR_MAX                                   = 0xb0
+	DEVLINK_ATTR_MAX                                   = 0xae
 	DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE              = 0x0
 	DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX           = 0x1
 	DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT               = 0x0
@@ -3374,8 +3317,7 @@ const (
 	LWTUNNEL_ENCAP_SEG6_LOCAL = 0x7
 	LWTUNNEL_ENCAP_RPL        = 0x8
 	LWTUNNEL_ENCAP_IOAM6      = 0x9
-	LWTUNNEL_ENCAP_XFRM       = 0xa
-	LWTUNNEL_ENCAP_MAX        = 0xa
+	LWTUNNEL_ENCAP_MAX        = 0x9
 
 	MPLS_IPTUNNEL_UNSPEC = 0x0
 	MPLS_IPTUNNEL_DST    = 0x1
@@ -3570,9 +3512,7 @@ const (
 	ETHTOOL_MSG_PHC_VCLOCKS_GET               = 0x21
 	ETHTOOL_MSG_MODULE_GET                    = 0x22
 	ETHTOOL_MSG_MODULE_SET                    = 0x23
-	ETHTOOL_MSG_PSE_GET                       = 0x24
-	ETHTOOL_MSG_PSE_SET                       = 0x25
-	ETHTOOL_MSG_USER_MAX                      = 0x25
+	ETHTOOL_MSG_USER_MAX                      = 0x23
 	ETHTOOL_MSG_KERNEL_NONE                   = 0x0
 	ETHTOOL_MSG_STRSET_GET_REPLY              = 0x1
 	ETHTOOL_MSG_LINKINFO_GET_REPLY            = 0x2
@@ -3610,8 +3550,7 @@ const (
 	ETHTOOL_MSG_PHC_VCLOCKS_GET_REPLY         = 0x22
 	ETHTOOL_MSG_MODULE_GET_REPLY              = 0x23
 	ETHTOOL_MSG_MODULE_NTF                    = 0x24
-	ETHTOOL_MSG_PSE_GET_REPLY                 = 0x25
-	ETHTOOL_MSG_KERNEL_MAX                    = 0x25
+	ETHTOOL_MSG_KERNEL_MAX                    = 0x24
 	ETHTOOL_A_HEADER_UNSPEC                   = 0x0
 	ETHTOOL_A_HEADER_DEV_INDEX                = 0x1
 	ETHTOOL_A_HEADER_DEV_NAME                 = 0x2
@@ -3670,8 +3609,7 @@ const (
 	ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG      = 0x7
 	ETHTOOL_A_LINKMODES_MASTER_SLAVE_STATE    = 0x8
 	ETHTOOL_A_LINKMODES_LANES                 = 0x9
-	ETHTOOL_A_LINKMODES_RATE_MATCHING         = 0xa
-	ETHTOOL_A_LINKMODES_MAX                   = 0xa
+	ETHTOOL_A_LINKMODES_MAX                   = 0x9
 	ETHTOOL_A_LINKSTATE_UNSPEC                = 0x0
 	ETHTOOL_A_LINKSTATE_HEADER                = 0x1
 	ETHTOOL_A_LINKSTATE_LINK                  = 0x2
@@ -4263,9 +4201,6 @@ const (
 	NL80211_ACL_POLICY_DENY_UNLESS_LISTED                   = 0x1
 	NL80211_AC_VI                                           = 0x1
 	NL80211_AC_VO                                           = 0x0
-	NL80211_AP_SETTINGS_EXTERNAL_AUTH_SUPPORT               = 0x1
-	NL80211_AP_SETTINGS_SA_QUERY_OFFLOAD_SUPPORT            = 0x2
-	NL80211_AP_SME_SA_QUERY_OFFLOAD                         = 0x1
 	NL80211_ATTR_4ADDR                                      = 0x53
 	NL80211_ATTR_ACK                                        = 0x5c
 	NL80211_ATTR_ACK_SIGNAL                                 = 0x107
@@ -4274,7 +4209,6 @@ const (
 	NL80211_ATTR_AIRTIME_WEIGHT                             = 0x112
 	NL80211_ATTR_AKM_SUITES                                 = 0x4c
 	NL80211_ATTR_AP_ISOLATE                                 = 0x60
-	NL80211_ATTR_AP_SETTINGS_FLAGS                          = 0x135
 	NL80211_ATTR_AUTH_DATA                                  = 0x9c
 	NL80211_ATTR_AUTH_TYPE                                  = 0x35
 	NL80211_ATTR_BANDS                                      = 0xef
@@ -4306,9 +4240,6 @@ const (
 	NL80211_ATTR_COALESCE_RULE_DELAY                        = 0x1
 	NL80211_ATTR_COALESCE_RULE_MAX                          = 0x3
 	NL80211_ATTR_COALESCE_RULE_PKT_PATTERN                  = 0x3
-	NL80211_ATTR_COLOR_CHANGE_COLOR                         = 0x130
-	NL80211_ATTR_COLOR_CHANGE_COUNT                         = 0x12f
-	NL80211_ATTR_COLOR_CHANGE_ELEMS                         = 0x131
 	NL80211_ATTR_CONN_FAILED_REASON                         = 0x9b
 	NL80211_ATTR_CONTROL_PORT                               = 0x44
 	NL80211_ATTR_CONTROL_PORT_ETHERTYPE                     = 0x66
@@ -4335,7 +4266,6 @@ const (
 	NL80211_ATTR_DEVICE_AP_SME                              = 0x8d
 	NL80211_ATTR_DFS_CAC_TIME                               = 0x7
 	NL80211_ATTR_DFS_REGION                                 = 0x92
-	NL80211_ATTR_DISABLE_EHT                                = 0x137
 	NL80211_ATTR_DISABLE_HE                                 = 0x12d
 	NL80211_ATTR_DISABLE_HT                                 = 0x93
 	NL80211_ATTR_DISABLE_VHT                                = 0xaf
@@ -4343,8 +4273,6 @@ const (
 	NL80211_ATTR_DONT_WAIT_FOR_ACK                          = 0x8e
 	NL80211_ATTR_DTIM_PERIOD                                = 0xd
 	NL80211_ATTR_DURATION                                   = 0x57
-	NL80211_ATTR_EHT_CAPABILITY                             = 0x136
-	NL80211_ATTR_EML_CAPABILITY                             = 0x13d
 	NL80211_ATTR_EXT_CAPA                                   = 0xa9
 	NL80211_ATTR_EXT_CAPA_MASK                              = 0xaa
 	NL80211_ATTR_EXTERNAL_AUTH_ACTION                       = 0x104
@@ -4409,11 +4337,10 @@ const (
 	NL80211_ATTR_MAC_HINT                                   = 0xc8
 	NL80211_ATTR_MAC_MASK                                   = 0xd7
 	NL80211_ATTR_MAX_AP_ASSOC_STA                           = 0xca
-	NL80211_ATTR_MAX                                        = 0x140
+	NL80211_ATTR_MAX                                        = 0x137
 	NL80211_ATTR_MAX_CRIT_PROT_DURATION                     = 0xb4
 	NL80211_ATTR_MAX_CSA_COUNTERS                           = 0xce
 	NL80211_ATTR_MAX_MATCH_SETS                             = 0x85
-	NL80211_ATTR_MAX_NUM_AKM_SUITES                         = 0x13c
 	NL80211_ATTR_MAX_NUM_PMKIDS                             = 0x56
 	NL80211_ATTR_MAX_NUM_SCAN_SSIDS                         = 0x2b
 	NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS                   = 0xde
@@ -4423,8 +4350,6 @@ const (
 	NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL                     = 0xdf
 	NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS                   = 0xe0
 	NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN                      = 0x7c
-	NL80211_ATTR_MBSSID_CONFIG                              = 0x132
-	NL80211_ATTR_MBSSID_ELEMS                               = 0x133
 	NL80211_ATTR_MCAST_RATE                                 = 0x6b
 	NL80211_ATTR_MDID                                       = 0xb1
 	NL80211_ATTR_MEASUREMENT_DURATION                       = 0xeb
@@ -4434,11 +4359,6 @@ const (
 	NL80211_ATTR_MESH_PEER_AID                              = 0xed
 	NL80211_ATTR_MESH_SETUP                                 = 0x70
 	NL80211_ATTR_MGMT_SUBTYPE                               = 0x29
-	NL80211_ATTR_MLD_ADDR                                   = 0x13a
-	NL80211_ATTR_MLD_CAPA_AND_OPS                           = 0x13e
-	NL80211_ATTR_MLO_LINK_ID                                = 0x139
-	NL80211_ATTR_MLO_LINKS                                  = 0x138
-	NL80211_ATTR_MLO_SUPPORT                                = 0x13b
 	NL80211_ATTR_MNTR_FLAGS                                 = 0x17
 	NL80211_ATTR_MPATH_INFO                                 = 0x1b
 	NL80211_ATTR_MPATH_NEXT_HOP                             = 0x1a
@@ -4451,7 +4371,6 @@ const (
 	NL80211_ATTR_NETNS_FD                                   = 0xdb
 	NL80211_ATTR_NOACK_MAP                                  = 0x95
 	NL80211_ATTR_NSS                                        = 0x106
-	NL80211_ATTR_OBSS_COLOR_BITMAP                          = 0x12e
 	NL80211_ATTR_OFFCHANNEL_TX_OK                           = 0x6c
 	NL80211_ATTR_OPER_CLASS                                 = 0xd6
 	NL80211_ATTR_OPMODE_NOTIF                               = 0xc2
@@ -4478,7 +4397,6 @@ const (
 	NL80211_ATTR_PROTOCOL_FEATURES                          = 0xad
 	NL80211_ATTR_PS_STATE                                   = 0x5d
 	NL80211_ATTR_QOS_MAP                                    = 0xc7
-	NL80211_ATTR_RADAR_BACKGROUND                           = 0x134
 	NL80211_ATTR_RADAR_EVENT                                = 0xa8
 	NL80211_ATTR_REASON_CODE                                = 0x36
 	NL80211_ATTR_RECEIVE_MULTICAST                          = 0x121
@@ -4494,7 +4412,6 @@ const (
 	NL80211_ATTR_RESP_IE                                    = 0x4e
 	NL80211_ATTR_ROAM_SUPPORT                               = 0x83
 	NL80211_ATTR_RX_FRAME_TYPES                             = 0x64
-	NL80211_ATTR_RX_HW_TIMESTAMP                            = 0x140
 	NL80211_ATTR_RXMGMT_FLAGS                               = 0xbc
 	NL80211_ATTR_RX_SIGNAL_DBM                              = 0x97
 	NL80211_ATTR_S1G_CAPABILITY                             = 0x128
@@ -4567,7 +4484,6 @@ const (
 	NL80211_ATTR_TSID                                       = 0xd2
 	NL80211_ATTR_TWT_RESPONDER                              = 0x116
 	NL80211_ATTR_TX_FRAME_TYPES                             = 0x63
-	NL80211_ATTR_TX_HW_TIMESTAMP                            = 0x13f
 	NL80211_ATTR_TX_NO_CCK_RATE                             = 0x87
 	NL80211_ATTR_TXQ_LIMIT                                  = 0x10a
 	NL80211_ATTR_TXQ_MEMORY_LIMIT                           = 0x10b
@@ -4641,10 +4557,6 @@ const (
 	NL80211_BAND_ATTR_RATES                                 = 0x2
 	NL80211_BAND_ATTR_VHT_CAPA                              = 0x8
 	NL80211_BAND_ATTR_VHT_MCS_SET                           = 0x7
-	NL80211_BAND_IFTYPE_ATTR_EHT_CAP_MAC                    = 0x8
-	NL80211_BAND_IFTYPE_ATTR_EHT_CAP_MCS_SET                = 0xa
-	NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PHY                    = 0x9
-	NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PPE                    = 0xb
 	NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA                   = 0x6
 	NL80211_BAND_IFTYPE_ATTR_HE_CAP_MAC                     = 0x2
 	NL80211_BAND_IFTYPE_ATTR_HE_CAP_MCS_SET                 = 0x4
@@ -4652,8 +4564,6 @@ const (
 	NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE                     = 0x5
 	NL80211_BAND_IFTYPE_ATTR_IFTYPES                        = 0x1
 	NL80211_BAND_IFTYPE_ATTR_MAX                            = 0xb
-	NL80211_BAND_IFTYPE_ATTR_VENDOR_ELEMS                   = 0x7
-	NL80211_BAND_LC                                         = 0x5
 	NL80211_BAND_S1GHZ                                      = 0x4
 	NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE                 = 0x2
 	NL80211_BITRATE_ATTR_MAX                                = 0x2
@@ -4674,9 +4584,7 @@ const (
 	NL80211_BSS_FREQUENCY_OFFSET                            = 0x14
 	NL80211_BSS_INFORMATION_ELEMENTS                        = 0x6
 	NL80211_BSS_LAST_SEEN_BOOTTIME                          = 0xf
-	NL80211_BSS_MAX                                         = 0x16
-	NL80211_BSS_MLD_ADDR                                    = 0x16
-	NL80211_BSS_MLO_LINK_ID                                 = 0x15
+	NL80211_BSS_MAX                                         = 0x14
 	NL80211_BSS_PAD                                         = 0x10
 	NL80211_BSS_PARENT_BSSID                                = 0x12
 	NL80211_BSS_PARENT_TSF                                  = 0x11
@@ -4704,7 +4612,6 @@ const (
 	NL80211_CHAN_WIDTH_20                                   = 0x1
 	NL80211_CHAN_WIDTH_20_NOHT                              = 0x0
 	NL80211_CHAN_WIDTH_2                                    = 0x9
-	NL80211_CHAN_WIDTH_320                                  = 0xd
 	NL80211_CHAN_WIDTH_40                                   = 0x2
 	NL80211_CHAN_WIDTH_4                                    = 0xa
 	NL80211_CHAN_WIDTH_5                                    = 0x6
@@ -4714,11 +4621,8 @@ const (
 	NL80211_CMD_ABORT_SCAN                                  = 0x72
 	NL80211_CMD_ACTION                                      = 0x3b
 	NL80211_CMD_ACTION_TX_STATUS                            = 0x3c
-	NL80211_CMD_ADD_LINK                                    = 0x94
-	NL80211_CMD_ADD_LINK_STA                                = 0x96
 	NL80211_CMD_ADD_NAN_FUNCTION                            = 0x75
 	NL80211_CMD_ADD_TX_TS                                   = 0x69
-	NL80211_CMD_ASSOC_COMEBACK                              = 0x93
 	NL80211_CMD_ASSOCIATE                                   = 0x26
 	NL80211_CMD_AUTHENTICATE                                = 0x25
 	NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL                    = 0x38
@@ -4726,10 +4630,6 @@ const (
 	NL80211_CMD_CHANNEL_SWITCH                              = 0x66
 	NL80211_CMD_CH_SWITCH_NOTIFY                            = 0x58
 	NL80211_CMD_CH_SWITCH_STARTED_NOTIFY                    = 0x6e
-	NL80211_CMD_COLOR_CHANGE_ABORTED                        = 0x90
-	NL80211_CMD_COLOR_CHANGE_COMPLETED                      = 0x91
-	NL80211_CMD_COLOR_CHANGE_REQUEST                        = 0x8e
-	NL80211_CMD_COLOR_CHANGE_STARTED                        = 0x8f
 	NL80211_CMD_CONNECT                                     = 0x2e
 	NL80211_CMD_CONN_FAILED                                 = 0x5b
 	NL80211_CMD_CONTROL_PORT_FRAME                          = 0x81
@@ -4778,9 +4678,8 @@ const (
 	NL80211_CMD_LEAVE_IBSS                                  = 0x2c
 	NL80211_CMD_LEAVE_MESH                                  = 0x45
 	NL80211_CMD_LEAVE_OCB                                   = 0x6d
-	NL80211_CMD_MAX                                         = 0x98
+	NL80211_CMD_MAX                                         = 0x93
 	NL80211_CMD_MICHAEL_MIC_FAILURE                         = 0x29
-	NL80211_CMD_MODIFY_LINK_STA                             = 0x97
 	NL80211_CMD_NAN_MATCH                                   = 0x78
 	NL80211_CMD_NEW_BEACON                                  = 0xf
 	NL80211_CMD_NEW_INTERFACE                               = 0x7
@@ -4793,7 +4692,6 @@ const (
 	NL80211_CMD_NEW_WIPHY                                   = 0x3
 	NL80211_CMD_NOTIFY_CQM                                  = 0x40
 	NL80211_CMD_NOTIFY_RADAR                                = 0x86
-	NL80211_CMD_OBSS_COLOR_COLLISION                        = 0x8d
 	NL80211_CMD_PEER_MEASUREMENT_COMPLETE                   = 0x85
 	NL80211_CMD_PEER_MEASUREMENT_RESULT                     = 0x84
 	NL80211_CMD_PEER_MEASUREMENT_START                      = 0x83
@@ -4809,8 +4707,6 @@ const (
 	NL80211_CMD_REGISTER_FRAME                              = 0x3a
 	NL80211_CMD_RELOAD_REGDB                                = 0x7e
 	NL80211_CMD_REMAIN_ON_CHANNEL                           = 0x37
-	NL80211_CMD_REMOVE_LINK                                 = 0x95
-	NL80211_CMD_REMOVE_LINK_STA                             = 0x98
 	NL80211_CMD_REQ_SET_REG                                 = 0x1b
 	NL80211_CMD_ROAM                                        = 0x2f
 	NL80211_CMD_SCAN_ABORTED                                = 0x23
@@ -4821,7 +4717,6 @@ const (
 	NL80211_CMD_SET_CHANNEL                                 = 0x41
 	NL80211_CMD_SET_COALESCE                                = 0x65
 	NL80211_CMD_SET_CQM                                     = 0x3f
-	NL80211_CMD_SET_FILS_AAD                                = 0x92
 	NL80211_CMD_SET_INTERFACE                               = 0x6
 	NL80211_CMD_SET_KEY                                     = 0xa
 	NL80211_CMD_SET_MAC_ACL                                 = 0x5d
@@ -4896,8 +4791,6 @@ const (
 	NL80211_EDMG_BW_CONFIG_MIN                              = 0x4
 	NL80211_EDMG_CHANNELS_MAX                               = 0x3c
 	NL80211_EDMG_CHANNELS_MIN                               = 0x1
-	NL80211_EHT_MAX_CAPABILITY_LEN                          = 0x33
-	NL80211_EHT_MIN_CAPABILITY_LEN                          = 0xd
 	NL80211_EXTERNAL_AUTH_ABORT                             = 0x1
 	NL80211_EXTERNAL_AUTH_START                             = 0x0
 	NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK               = 0x32
@@ -4914,7 +4807,6 @@ const (
 	NL80211_EXT_FEATURE_BEACON_RATE_HT                      = 0x7
 	NL80211_EXT_FEATURE_BEACON_RATE_LEGACY                  = 0x6
 	NL80211_EXT_FEATURE_BEACON_RATE_VHT                     = 0x8
-	NL80211_EXT_FEATURE_BSS_COLOR                           = 0x3a
 	NL80211_EXT_FEATURE_BSS_PARENT_TSF                      = 0x4
 	NL80211_EXT_FEATURE_CAN_REPLACE_PTK0                    = 0x1f
 	NL80211_EXT_FEATURE_CONTROL_PORT_NO_PREAUTH             = 0x2a
@@ -4926,7 +4818,6 @@ const (
 	NL80211_EXT_FEATURE_DFS_OFFLOAD                         = 0x19
 	NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER                = 0x20
 	NL80211_EXT_FEATURE_EXT_KEY_ID                          = 0x24
-	NL80211_EXT_FEATURE_FILS_CRYPTO_OFFLOAD                 = 0x3b
 	NL80211_EXT_FEATURE_FILS_DISCOVERY                      = 0x34
 	NL80211_EXT_FEATURE_FILS_MAX_CHANNEL_TIME               = 0x11
 	NL80211_EXT_FEATURE_FILS_SK_OFFLOAD                     = 0xe
@@ -4942,10 +4833,8 @@ const (
 	NL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION  = 0x14
 	NL80211_EXT_FEATURE_OCE_PROBE_REQ_HIGH_TX_RATE          = 0x13
 	NL80211_EXT_FEATURE_OPERATING_CHANNEL_VALIDATION        = 0x31
-	NL80211_EXT_FEATURE_POWERED_ADDR_CHANGE                 = 0x3d
 	NL80211_EXT_FEATURE_PROTECTED_TWT                       = 0x2b
 	NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE         = 0x39
-	NL80211_EXT_FEATURE_RADAR_BACKGROUND                    = 0x3c
 	NL80211_EXT_FEATURE_RRM                                 = 0x1
 	NL80211_EXT_FEATURE_SAE_OFFLOAD_AP                      = 0x33
 	NL80211_EXT_FEATURE_SAE_OFFLOAD                         = 0x26
@@ -5017,9 +4906,7 @@ const (
 	NL80211_FREQUENCY_ATTR_NO_10MHZ                         = 0x11
 	NL80211_FREQUENCY_ATTR_NO_160MHZ                        = 0xc
 	NL80211_FREQUENCY_ATTR_NO_20MHZ                         = 0x10
-	NL80211_FREQUENCY_ATTR_NO_320MHZ                        = 0x1a
 	NL80211_FREQUENCY_ATTR_NO_80MHZ                         = 0xb
-	NL80211_FREQUENCY_ATTR_NO_EHT                           = 0x1b
 	NL80211_FREQUENCY_ATTR_NO_HE                            = 0x13
 	NL80211_FREQUENCY_ATTR_NO_HT40_MINUS                    = 0x9
 	NL80211_FREQUENCY_ATTR_NO_HT40_PLUS                     = 0xa
@@ -5119,12 +5006,6 @@ const (
 	NL80211_MAX_SUPP_HT_RATES                               = 0x4d
 	NL80211_MAX_SUPP_RATES                                  = 0x20
 	NL80211_MAX_SUPP_REG_RULES                              = 0x80
-	NL80211_MBSSID_CONFIG_ATTR_EMA                          = 0x5
-	NL80211_MBSSID_CONFIG_ATTR_INDEX                        = 0x3
-	NL80211_MBSSID_CONFIG_ATTR_MAX                          = 0x5
-	NL80211_MBSSID_CONFIG_ATTR_MAX_EMA_PROFILE_PERIODICITY  = 0x2
-	NL80211_MBSSID_CONFIG_ATTR_MAX_INTERFACES               = 0x1
-	NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX                   = 0x4
 	NL80211_MESHCONF_ATTR_MAX                               = 0x1f
 	NL80211_MESHCONF_AUTO_OPEN_PLINKS                       = 0x7
 	NL80211_MESHCONF_AWAKE_WINDOW                           = 0x1b
@@ -5287,7 +5168,6 @@ const (
 	NL80211_PMSR_FTM_FAILURE_UNSPECIFIED                    = 0x0
 	NL80211_PMSR_FTM_FAILURE_WRONG_CHANNEL                  = 0x3
 	NL80211_PMSR_FTM_REQ_ATTR_ASAP                          = 0x1
-	NL80211_PMSR_FTM_REQ_ATTR_BSS_COLOR                     = 0xd
 	NL80211_PMSR_FTM_REQ_ATTR_BURST_DURATION                = 0x5
 	NL80211_PMSR_FTM_REQ_ATTR_BURST_PERIOD                  = 0x4
 	NL80211_PMSR_FTM_REQ_ATTR_FTMS_PER_BURST                = 0x6
@@ -5364,36 +5244,12 @@ const (
 	NL80211_RADAR_PRE_CAC_EXPIRED                           = 0x4
 	NL80211_RATE_INFO_10_MHZ_WIDTH                          = 0xb
 	NL80211_RATE_INFO_160_MHZ_WIDTH                         = 0xa
-	NL80211_RATE_INFO_320_MHZ_WIDTH                         = 0x12
 	NL80211_RATE_INFO_40_MHZ_WIDTH                          = 0x3
 	NL80211_RATE_INFO_5_MHZ_WIDTH                           = 0xc
 	NL80211_RATE_INFO_80_MHZ_WIDTH                          = 0x8
 	NL80211_RATE_INFO_80P80_MHZ_WIDTH                       = 0x9
 	NL80211_RATE_INFO_BITRATE32                             = 0x5
 	NL80211_RATE_INFO_BITRATE                               = 0x1
-	NL80211_RATE_INFO_EHT_GI_0_8                            = 0x0
-	NL80211_RATE_INFO_EHT_GI_1_6                            = 0x1
-	NL80211_RATE_INFO_EHT_GI_3_2                            = 0x2
-	NL80211_RATE_INFO_EHT_GI                                = 0x15
-	NL80211_RATE_INFO_EHT_MCS                               = 0x13
-	NL80211_RATE_INFO_EHT_NSS                               = 0x14
-	NL80211_RATE_INFO_EHT_RU_ALLOC_106                      = 0x3
-	NL80211_RATE_INFO_EHT_RU_ALLOC_106P26                   = 0x4
-	NL80211_RATE_INFO_EHT_RU_ALLOC_242                      = 0x5
-	NL80211_RATE_INFO_EHT_RU_ALLOC_26                       = 0x0
-	NL80211_RATE_INFO_EHT_RU_ALLOC_2x996                    = 0xb
-	NL80211_RATE_INFO_EHT_RU_ALLOC_2x996P484                = 0xc
-	NL80211_RATE_INFO_EHT_RU_ALLOC_3x996                    = 0xd
-	NL80211_RATE_INFO_EHT_RU_ALLOC_3x996P484                = 0xe
-	NL80211_RATE_INFO_EHT_RU_ALLOC_484                      = 0x6
-	NL80211_RATE_INFO_EHT_RU_ALLOC_484P242                  = 0x7
-	NL80211_RATE_INFO_EHT_RU_ALLOC_4x996                    = 0xf
-	NL80211_RATE_INFO_EHT_RU_ALLOC_52                       = 0x1
-	NL80211_RATE_INFO_EHT_RU_ALLOC_52P26                    = 0x2
-	NL80211_RATE_INFO_EHT_RU_ALLOC_996                      = 0x8
-	NL80211_RATE_INFO_EHT_RU_ALLOC_996P484                  = 0x9
-	NL80211_RATE_INFO_EHT_RU_ALLOC_996P484P242              = 0xa
-	NL80211_RATE_INFO_EHT_RU_ALLOC                          = 0x16
 	NL80211_RATE_INFO_HE_1XLTF                              = 0x0
 	NL80211_RATE_INFO_HE_2XLTF                              = 0x1
 	NL80211_RATE_INFO_HE_4XLTF                              = 0x2
@@ -5436,7 +5292,6 @@ const (
 	NL80211_RRF_GO_CONCURRENT                               = 0x1000
 	NL80211_RRF_IR_CONCURRENT                               = 0x1000
 	NL80211_RRF_NO_160MHZ                                   = 0x10000
-	NL80211_RRF_NO_320MHZ                                   = 0x40000
 	NL80211_RRF_NO_80MHZ                                    = 0x8000
 	NL80211_RRF_NO_CCK                                      = 0x2
 	NL80211_RRF_NO_HE                                       = 0x20000
diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go
index 41cb3c01f..a49853e9d 100644
--- a/vendor/golang.org/x/sys/windows/syscall_windows.go
+++ b/vendor/golang.org/x/sys/windows/syscall_windows.go
@@ -10,6 +10,7 @@ import (
 	errorspkg "errors"
 	"fmt"
 	"runtime"
+	"strings"
 	"sync"
 	"syscall"
 	"time"
@@ -86,13 +87,22 @@ func StringToUTF16(s string) []uint16 {
 // s, with a terminating NUL added. If s contains a NUL byte at any
 // location, it returns (nil, syscall.EINVAL).
 func UTF16FromString(s string) ([]uint16, error) {
-	return syscall.UTF16FromString(s)
+	if strings.IndexByte(s, 0) != -1 {
+		return nil, syscall.EINVAL
+	}
+	return utf16.Encode([]rune(s + "\x00")), nil
 }
 
 // UTF16ToString returns the UTF-8 encoding of the UTF-16 sequence s,
 // with a terminating NUL and any bytes after the NUL removed.
 func UTF16ToString(s []uint16) string {
-	return syscall.UTF16ToString(s)
+	for i, v := range s {
+		if v == 0 {
+			s = s[:i]
+			break
+		}
+	}
+	return string(utf16.Decode(s))
 }
 
 // StringToUTF16Ptr is deprecated. Use UTF16PtrFromString instead.
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 828dec86d..2935113b6 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -500,7 +500,7 @@ golang.org/x/oauth2/internal
 ## explicit
 golang.org/x/sync/semaphore
 golang.org/x/sync/singleflight
-# golang.org/x/sys v0.5.0
+# golang.org/x/sys v0.4.0
 ## explicit; go 1.17
 golang.org/x/sys/cpu
 golang.org/x/sys/internal/unsafeheader


Test patch:
diff --git a/pkg/provider/azure_controller_common_test.go b/pkg/provider/azure_controller_common_test.go
index dd35c533c..b72eba0d3 100644
--- a/pkg/provider/azure_controller_common_test.go
+++ b/pkg/provider/azure_controller_common_test.go
@@ -1199,10 +1199,10 @@ func TestAttachDiskRequestFuncs(t *testing.T) {
 			diskURI := fmt.Sprintf("%s%d", test.diskURI, i)
 			diskName := fmt.Sprintf("%s%d", test.diskName, i)
 			attachDiskOptions := &AttachDiskOptions{diskName: diskName}
-			_, err := common.insertAttachDiskRequest(diskURI, test.nodeName, attachDiskOptions)
+			err := common.insertAttachDiskRequest(diskURI, test.nodeName, attachDiskOptions)
 			assert.Equal(t, test.expectedErr, err != nil, "TestCase[%d]: %s", i, test.desc)
 			if test.duplicateDiskRequest {
-				_, err := common.insertAttachDiskRequest(diskURI, test.nodeName, attachDiskOptions)
+				err := common.insertAttachDiskRequest(diskURI, test.nodeName, attachDiskOptions)
 				assert.Equal(t, test.expectedErr, err != nil, "TestCase[%d]: %s", i, test.desc)
 			}
 		}
@@ -1275,10 +1275,10 @@ func TestDetachDiskRequestFuncs(t *testing.T) {
 		for i := 1; i <= test.diskNum; i++ {
 			diskURI := fmt.Sprintf("%s%d", test.diskURI, i)
 			diskName := fmt.Sprintf("%s%d", test.diskName, i)
-			_, err := common.insertDetachDiskRequest(diskName, diskURI, test.nodeName)
+			err := common.insertDetachDiskRequest(diskName, diskURI, test.nodeName)
 			assert.Equal(t, test.expectedErr, err != nil, "TestCase[%d]: %s", i, test.desc)
 			if test.duplicateDiskRequest {
-				_, err := common.insertDetachDiskRequest(diskName, diskURI, test.nodeName)
+				err := common.insertDetachDiskRequest(diskName, diskURI, test.nodeName)
 				assert.Equal(t, test.expectedErr, err != nil, "TestCase[%d]: %s", i, test.desc)
 			}
 		}
diff --git a/tests/e2e/network/ensureloadbalancer.go b/tests/e2e/network/ensureloadbalancer.go
index b4974fa08..fe4f6f306 100644
--- a/tests/e2e/network/ensureloadbalancer.go
+++ b/tests/e2e/network/ensureloadbalancer.go
@@ -356,7 +356,7 @@ var _ = Describe("Ensure LoadBalancer", Label(utils.TestSuiteLabelLB), func() {
 		}
 
 		By("Updating service to bound to specific public IP")
-		utils.Logf("will update IP to %q", targetIPs)
+		utils.Logf("will update IPs to %q", targetIPs)
 		service, err = cs.CoreV1().Services(ns.Name).Get(context.TODO(), testServiceName, metav1.GetOptions{})
 		service = updateServiceLBIPs(service, false, targetIPs)
 
@@ -436,7 +436,7 @@ var _ = Describe("Ensure LoadBalancer", Label(utils.TestSuiteLabelLB), func() {
 			if utils.CompareStrings(targetIPs, ingressIPs) {
 				return false, nil
 			}
-			utils.Logf("External IP changed unexpectedly to: %q", ingressIPs)
+			utils.Logf("External IPs changed unexpectedly to: %q", ingressIPs)
 			return true, nil
 		})
 		Expect(err).To(Equal(wait.ErrWaitTimeout))
diff --git a/tests/e2e/network/service_annotations.go b/tests/e2e/network/service_annotations.go
index acb742299..1787fe134 100644
--- a/tests/e2e/network/service_annotations.go
+++ b/tests/e2e/network/service_annotations.go
@@ -174,24 +174,32 @@ var _ = Describe("Service with annotation", Label(utils.TestSuiteLabelServiceAnn
 		err = utils.DeleteService(cs, ns.Name, serviceName)
 		Expect(err).NotTo(HaveOccurred())
 
-		By("Create a PIP")
-		ipName := fmt.Sprintf("%s-public-IP-%s", basename, uuid.NewUUID()[0:4])
-		nsName := ns.Name
-		rgName := tc.GetResourceGroup()
-		pip, err := utils.WaitCreatePIP(tc, ipName, rgName, defaultPublicIPAddress(ipName, tc.IPFamily == utils.IPv6))
+		By("Create PIPs")
+		ipNameBase := fmt.Sprintf("%s-public-IP-%s", basename, uuid.NewUUID()[0:4])
+		v4Enabled, v6Enabled := utils.IfIPFamiliesEnabled(tc.IPFamily)
+		pipNames, targetIPs := []string{}, []string{}
+		deleteFuncs := []func(){}
+		if v4Enabled {
+			targetIP, deleteFunc := createPIP(tc, ipNameBase, false)
+			targetIPs = append(targetIPs, targetIP)
+			deleteFuncs = append(deleteFuncs, deleteFunc)
+		}
+		if v6Enabled {
+			targetIP, deleteFunc := createPIP(tc, ipNameBase, true)
+			targetIPs = append(targetIPs, targetIP)
+			deleteFuncs = append(deleteFuncs, deleteFunc)
+		}
 		defer func() {
-			err := utils.DeletePIPWithRetry(tc, ipName, rgName)
-			Expect(err).NotTo(HaveOccurred())
+			for _, deleteFunc := range deleteFuncs {
+				deleteFunc()
+			}
 		}()
-		Expect(err).NotTo(HaveOccurred())
-		targetIP := pointer.StringDeref(pip.IPAddress, "")
-		pipName := pointer.StringDeref(pip.Name, "")
-		utils.Logf("PIP %q to %q", pipName, targetIP)
 
 		By("Create a Service which will be deleted with the PIP")
+		nsName := ns.Name
 		oldServiceName := fmt.Sprintf("%s-old", serviceName)
 		service := utils.CreateLoadBalancerServiceManifest(oldServiceName, annotation, labels, nsName, ports)
-		service = updateServiceLBIPs(service, false, []string{targetIP})
+		service = updateServiceLBIPs(service, false, targetIPs)
 
 		// create service with given annotation and wait it to expose
 		_, err = cs.CoreV1().Services(nsName).Create(context.TODO(), service, metav1.CreateOptions{})
@@ -201,7 +209,7 @@ var _ = Describe("Service with annotation", Label(utils.TestSuiteLabelServiceAnn
 			Expect(err).NotTo(HaveOccurred())
 		}()
 		Expect(err).NotTo(HaveOccurred())
-		_, err = utils.WaitServiceExposureAndValidateConnectivity(cs, tc.IPFamily, nsName, oldServiceName, []string{targetIP})
+		_, err = utils.WaitServiceExposureAndValidateConnectivity(cs, tc.IPFamily, nsName, oldServiceName, targetIPs)
 		Expect(err).NotTo(HaveOccurred())
 
 		By("Delete the old Service")
@@ -209,9 +217,11 @@ var _ = Describe("Service with annotation", Label(utils.TestSuiteLabelServiceAnn
 		Expect(err).NotTo(HaveOccurred())
 
 		By("Check if PIP DNS label is deleted")
-		deleted, err := ifPIPDNSLabelDeleted(tc, pipName)
-		Expect(err).NotTo(HaveOccurred())
-		Expect(deleted).To(BeTrue())
+		for _, pipName := range pipNames {
+			deleted, err := ifPIPDNSLabelDeleted(tc, pipName)
+			Expect(err).NotTo(HaveOccurred())
+			Expect(deleted).To(BeTrue())
+		}
 
 		By("Create a different Service with the same azure-dns-label-name tag")
 		service.Name = serviceName
@@ -261,7 +271,7 @@ var _ = Describe("Service with annotation", Label(utils.TestSuiteLabelServiceAnn
 		vNet, err := tc.GetClusterVirtualNetwork()
 		Expect(err).NotTo(HaveOccurred())
 
-		var newSubnetCIDR *net.IPNet
+		var newSubnetCIDRs []*net.IPNet
 		for _, existingSubnet := range *vNet.Subnets {
 			if *existingSubnet.Name != subnetName {
 				continue
@@ -269,36 +279,30 @@ var _ = Describe("Service with annotation", Label(utils.TestSuiteLabelServiceAnn
 			utils.Logf("Test subnet have existed, skip creating")
 			if existingSubnet.AddressPrefix != nil {
 				// IPv4 picks the only AddressPrefix.
-				_, newSubnetCIDR, err = net.ParseCIDR(*existingSubnet.AddressPrefix)
+				_, newSubnetCIDR, err := net.ParseCIDR(*existingSubnet.AddressPrefix)
 				Expect(err).NotTo(HaveOccurred())
+				newSubnetCIDRs = append(newSubnetCIDRs, newSubnetCIDR)
 			} else {
 				Expect(existingSubnet.AddressPrefixes).NotTo(BeNil(),
 					"subnet AddressPrefix and AddressPrefixes shouldn't be both nil")
 
-				addrPrefixPicked := false
+				expectedAddrPrefixPickedCount := 1
+				if tc.IPFamily == utils.DualStack {
+					expectedAddrPrefixPickedCount = 2
+				}
 				for _, addrPrefix := range *existingSubnet.AddressPrefixes {
-					var parsedIP net.IP
-					parsedIP, newSubnetCIDR, err = net.ParseCIDR(addrPrefix)
+					_, newSubnetCIDR, err := net.ParseCIDR(addrPrefix)
 					Expect(err).NotTo(HaveOccurred(), "failed to parse CIDR %q", addrPrefix)
-					if tc.IPFamily == utils.DualStack && parsedIP.To4() != nil {
-						// Dual-stack picks IPv4 prefix.
-						addrPrefixPicked = true
-						break
-					}
-					if tc.IPFamily == utils.IPv6 && parsedIP.To4() == nil {
-						// IPv6 picks IPv6 prefix.
-						addrPrefixPicked = true
-						break
-					}
+					newSubnetCIDRs = append(newSubnetCIDRs, newSubnetCIDR)
 				}
-				Expect(addrPrefixPicked).To(BeTrue(), "there's no matching AddressPrefixes")
+				Expect(len(newSubnetCIDRs)).To(Equal(expectedAddrPrefixPickedCount), "incorrect new subnet CIDRs %v", newSubnetCIDRs)
 			}
 			break
 		}
 
-		if newSubnetCIDR == nil {
+		if len(newSubnetCIDRs) == 0 {
 			By("Test subnet doesn't exist. Creating a new one...")
-			newSubnetCIDRs, err := utils.GetNextSubnetCIDRs(vNet, tc.IPFamily)
+			newSubnetCIDRs, err = utils.GetNextSubnetCIDRs(vNet, tc.IPFamily)
 			Expect(err).NotTo(HaveOccurred())
 			newSubnetCIDRStrs := []string{}
 			for _, newSubnetCIDR := range newSubnetCIDRs {
@@ -311,8 +315,6 @@ var _ = Describe("Service with annotation", Label(utils.TestSuiteLabelServiceAnn
 				err = tc.DeleteSubnet(*vNet.Name, subnetName)
 				Expect(err).NotTo(HaveOccurred())
 			}()
-			Expect(len(newSubnetCIDRs)).NotTo(BeZero())
-			newSubnetCIDR = newSubnetCIDRs[0]
 		}
 
 		annotation := map[string]string{
@@ -327,13 +329,20 @@ var _ = Describe("Service with annotation", Label(utils.TestSuiteLabelServiceAnn
 			err := utils.DeleteService(cs, ns.Name, serviceName)
 			Expect(err).NotTo(HaveOccurred())
 		}()
-		Expect(len(ips)).NotTo(BeZero())
-		ip := ips[0]
-		utils.Logf("Get External IP: %s", ip)
+		utils.Logf("Get External IPs: %q", ips)
 
 		By("Validating external ip in target subnet")
-		contains := newSubnetCIDR.Contains(net.ParseIP(ip))
-		Expect(contains).To(BeTrue(), "external ip %s is not in the target subnet %s", ip, newSubnetCIDR)
+		Expect(len(ips)).NotTo(BeZero())
+		for _, ip := range ips {
+			contains := false
+			for _, newSubnetCIDR := range newSubnetCIDRs {
+				if newSubnetCIDR.Contains(net.ParseIP(ip)) {
+					contains = true
+					break
+				}
+			}
+			Expect(contains).To(BeTrue(), "external IP %q is not in the target subnets %q", ip, newSubnetCIDRs)
+		}
 	})
 
 	It("should support service annotation 'service.beta.kubernetes.io/azure-load-balancer-enable-high-availability-ports'", func() {
@@ -357,7 +366,7 @@ var _ = Describe("Service with annotation", Label(utils.TestSuiteLabelServiceAnn
 
 		lb := getAzureInternalLoadBalancerFromPrivateIP(tc, ip, "")
 
-		Expect(len(*lb.LoadBalancingRules)).To(Equal(1))
+		Expect(len(*lb.LoadBalancingRules)).To(Equal(len(ips)))
 		rule := (*lb.LoadBalancingRules)[0]
 		Expect(*rule.FrontendPort).To(Equal(int32(0)))
 		Expect(*rule.BackendPort).To(Equal(int32(0)))
@@ -399,15 +408,31 @@ var _ = Describe("Service with annotation", Label(utils.TestSuiteLabelServiceAnn
 		defer cleanup(pointer.StringDeref(rg.Name, ""))
 
 		By("creating test PIP in the test resource group")
-		testPIPName := "testPIP-" + string(uuid.NewUUID())[0:4]
-		pip, err := utils.WaitCreatePIP(tc, testPIPName, *rg.Name, defaultPublicIPAddress(testPIPName, tc.IPFamily == utils.IPv6))
-		Expect(err).NotTo(HaveOccurred())
+		pips := []string{}
+		testPIPNames := []string{}
+		v4Enabled, v6Enabled := utils.IfIPFamiliesEnabled(tc.IPFamily)
+		if v4Enabled {
+			testPIPName := "testPIP-" + utils.GetNameWithSuffix(string(uuid.NewUUID())[0:4], utils.Suffixes[false])
+			pip, err := utils.WaitCreatePIP(tc, testPIPName, *rg.Name, defaultPublicIPAddress(testPIPName, false))
+			Expect(err).NotTo(HaveOccurred())
+			testPIPNames = append(testPIPNames, testPIPName)
+			pips = append(pips, pointer.StringDeref(pip.Name, ""))
+		}
+		if v6Enabled {
+			testPIPName := "testPIP-" + utils.GetNameWithSuffix(string(uuid.NewUUID())[0:4], utils.Suffixes[true])
+			pip, err := utils.WaitCreatePIP(tc, testPIPName, *rg.Name, defaultPublicIPAddress(testPIPName, true))
+			Expect(err).NotTo(HaveOccurred())
+			testPIPNames = append(testPIPNames, testPIPName)
+			pips = append(pips, pointer.StringDeref(pip.Name, ""))
+		}
 		defer func() {
 			utils.Logf("Cleaning up service and public IP")
-			err = utils.DeleteService(cs, ns.Name, serviceName)
-			Expect(err).NotTo(HaveOccurred())
-			err = utils.DeletePIPWithRetry(tc, testPIPName, *rg.Name)
+			err := utils.DeleteService(cs, ns.Name, serviceName)
 			Expect(err).NotTo(HaveOccurred())
+			for _, testPIPName := range testPIPNames {
+				err = utils.DeletePIPWithRetry(tc, testPIPName, *rg.Name)
+				Expect(err).NotTo(HaveOccurred())
+			}
 		}()
 
 		annotation := map[string]string{
@@ -415,45 +440,56 @@ var _ = Describe("Service with annotation", Label(utils.TestSuiteLabelServiceAnn
 		}
 		By("Creating service " + serviceName + " in namespace " + ns.Name)
 		service := utils.CreateLoadBalancerServiceManifest(serviceName, annotation, labels, ns.Name, ports)
-		service = updateServiceLBIPs(service, false, []string{*pip.IPAddress})
-		_, err = cs.CoreV1().Services(ns.Name).Create(context.TODO(), service, metav1.CreateOptions{})
+		service = updateServiceLBIPs(service, false, pips)
+		_, err := cs.CoreV1().Services(ns.Name).Create(context.TODO(), service, metav1.CreateOptions{})
 		Expect(err).NotTo(HaveOccurred())
 		utils.Logf("Successfully created LoadBalancer service " + serviceName + " in namespace " + ns.Name)
 
 		//wait and get service's public IP Address
 		By("Waiting service to expose...")
-		_, err = utils.WaitServiceExposureAndValidateConnectivity(cs, tc.IPFamily, ns.Name, serviceName, []string{pointer.StringDeref(pip.IPAddress, "")})
+		_, err = utils.WaitServiceExposureAndValidateConnectivity(cs, tc.IPFamily, ns.Name, serviceName, pips)
 		Expect(err).NotTo(HaveOccurred())
 
-		lb := getAzureLoadBalancerFromPIP(tc, *pip.IPAddress, *rg.Name, "")
+		Expect(len(pips)).NotTo(BeZero())
+		lb := getAzureLoadBalancerFromPIP(tc, pips[0], *rg.Name, "")
 		Expect(lb).NotTo(BeNil())
 	})
 
 	It("should support service annotation `service.beta.kubernetes.io/azure-additional-public-ips`", func() {
-		By("creating a public IP")
-		ipName := basename + "-public-IP" + string(uuid.NewUUID())[0:4]
-		pip := defaultPublicIPAddress(ipName, tc.IPFamily == utils.IPv6)
-		pip, err := utils.WaitCreatePIP(tc, ipName, tc.GetResourceGroup(), pip)
-		Expect(err).NotTo(HaveOccurred())
-		additionalPIP := pointer.StringDeref(pip.IPAddress, "")
-		utils.Logf("created pip with address %s", additionalPIP)
+		By("creating public IPs")
+		ipNameBase := basename + "-public-IP" + string(uuid.NewUUID())[0:4]
+		v4Enabled, v6Enabled := utils.IfIPFamiliesEnabled(tc.IPFamily)
+		additionalPIPs := []string{}
+		deleteFuncs := []func(){}
+		if v4Enabled {
+			targetIP, deleteFunc := createPIP(tc, ipNameBase, false)
+			additionalPIPs = append(additionalPIPs, targetIP)
+			deleteFuncs = append(deleteFuncs, deleteFunc)
+		}
+		if v6Enabled {
+			targetIP, deleteFunc := createPIP(tc, ipNameBase, true)
+			additionalPIPs = append(additionalPIPs, targetIP)
+			deleteFuncs = append(deleteFuncs, deleteFunc)
+		}
+		defer func() {
+			for _, deleteFunc := range deleteFuncs {
+				deleteFunc()
+			}
+		}()
 
-		By("Exposing service with additional pip")
+		By("Exposing service with additional pips")
+		additionalPIPsStr := strings.Join(additionalPIPs, ",")
 		annotation := map[string]string{
-			consts.ServiceAnnotationAdditionalPublicIPs: additionalPIP,
+			consts.ServiceAnnotationAdditionalPublicIPs: additionalPIPsStr,
 		}
 		ips := createAndExposeDefaultServiceWithAnnotation(cs, tc.IPFamily, serviceName, ns.Name, labels, annotation, ports)
 		defer func() {
 			By("cleaning up")
 			err := utils.DeleteService(cs, ns.Name, serviceName)
 			Expect(err).NotTo(HaveOccurred())
-			err = utils.DeletePIPWithRetry(tc, ipName, "")
-			Expect(err).NotTo(HaveOccurred())
 		}()
-		Expect(len(ips)).NotTo(BeZero())
-		ip := ips[0]
 
-		err = wait.PollImmediate(10*time.Second, 2*time.Minute, func() (bool, error) {
+		err := wait.PollImmediate(10*time.Second, 2*time.Minute, func() (bool, error) {
 			service, err := cs.CoreV1().Services(ns.Name).Get(context.TODO(), serviceName, metav1.GetOptions{})
 			if err != nil {
 				if utils.IsRetryableAPIError(err) {
@@ -463,26 +499,49 @@ var _ = Describe("Service with annotation", Label(utils.TestSuiteLabelServiceAnn
 			}
 
 			utils.Logf("Checking additionalPIP in ingress")
-			foundInIngress := false
+			foundInIngress := 0
 			ingressList := service.Status.LoadBalancer.Ingress
 			Expect(ingressList).NotTo(BeNil())
+			expectedAdditionalPIPCount := 1
+			if tc.IPFamily == utils.DualStack {
+				expectedAdditionalPIPCount = 2
+			}
 			for _, ingress := range ingressList {
-				if additionalPIP == ingress.IP {
-					foundInIngress = true
-					break
+				for _, additionalPIP := range additionalPIPs {
+					if additionalPIP == ingress.IP {
+						foundInIngress++
+						break
+					}
 				}
 			}
+			if foundInIngress != expectedAdditionalPIPCount {
+				return false, nil
+			}
 
 			utils.Logf("Checking additionalPIP in nsg")
-			ipList := []string{ip, additionalPIP}
+			ipList := append(ips, additionalPIPs...)
 			port := fmt.Sprintf("%d", serverPort)
 			nsgs, err := tc.GetClusterSecurityGroups()
 			if err != nil {
 				return false, err
 			}
-			foundInNsg := validateSharedSecurityRuleExists(nsgs, ipList, port)
+			utils.Logf("ipList %q", ipList)
+			ipListV4, ipListV6 := []string{}, []string{}
+			for _, ip := range ipList {
+				if net.ParseIP(ip).To4() != nil {
+					ipListV4 = append(ipListV4, ip)
+				} else {
+					ipListV6 = append(ipListV6, ip)
+				}
+			}
+			if v4Enabled && !validateSharedSecurityRuleExists(nsgs, ipListV4, port) {
+				return false, nil
+			}
+			if v6Enabled && !validateSharedSecurityRuleExists(nsgs, ipListV6, port) {
+				return false, nil
+			}
 
-			return foundInIngress && foundInNsg, nil
+			return true, nil
 		})
 		Expect(err).NotTo(HaveOccurred())
 	})
@@ -500,8 +559,6 @@ var _ = Describe("Service with annotation", Label(utils.TestSuiteLabelServiceAnn
 		By("Waiting service to expose...")
 		ips, err := utils.WaitServiceExposureAndValidateConnectivity(cs, tc.IPFamily, ns.Name, serviceName, []string{})
 		Expect(err).NotTo(HaveOccurred())
-		Expect(len(ips)).NotTo(BeZero())
-		ip := ips[0]
 
 		defer func() {
 			By("Cleaning up test service")
@@ -517,13 +574,15 @@ var _ = Describe("Service with annotation", Label(utils.TestSuiteLabelServiceAnn
 		}
 		pips, err := tc.ListPublicIPs(tc.GetResourceGroup())
 		Expect(err).NotTo(HaveOccurred())
-		var targetPIP network.PublicIPAddress
+		var targetPIPs []network.PublicIPAddress
 		for _, pip := range pips {
-			if strings.EqualFold(pointer.StringDeref(pip.IPAddress, ""), ip) {
-				targetPIP = pip
-				err := waitComparePIPTags(tc, expectedTags, pointer.StringDeref(pip.Name, ""))
-				Expect(err).NotTo(HaveOccurred())
-				break
+			for _, ip := range ips {
+				if strings.EqualFold(pointer.StringDeref(pip.IPAddress, ""), ip) {
+					targetPIPs = append(targetPIPs, pip)
+					err := waitComparePIPTags(tc, expectedTags, pointer.StringDeref(pip.Name, ""))
+					Expect(err).NotTo(HaveOccurred())
+					break
+				}
 			}
 		}
 
@@ -541,35 +600,63 @@ var _ = Describe("Service with annotation", Label(utils.TestSuiteLabelServiceAnn
 			"e": pointer.String(""),
 			"x": pointer.String("y"),
 		}
-		err = waitComparePIPTags(tc, expectedTags, pointer.StringDeref(targetPIP.Name, ""))
-		Expect(err).NotTo(HaveOccurred())
+		for _, targetPIP := range targetPIPs {
+			err = waitComparePIPTags(tc, expectedTags, pointer.StringDeref(targetPIP.Name, ""))
+			Expect(err).NotTo(HaveOccurred())
+		}
 	})
 
 	It("should support service annotation `service.beta.kubernetes.io/azure-pip-name`", func() {
-		By("Creating two test pips")
-		pipName1 := "pip1"
-		pip1, err := utils.WaitCreatePIP(tc, pipName1, tc.GetResourceGroup(), defaultPublicIPAddress(pipName1, tc.IPFamily == utils.IPv6))
-		defer func() {
-			By("Cleaning up test PIP")
-			err := utils.DeletePIPWithRetry(tc, pipName1, tc.GetResourceGroup())
-			Expect(err).NotTo(HaveOccurred())
-		}()
-		Expect(err).NotTo(HaveOccurred())
-		pipName2 := "pip2"
-		pip2, err := utils.WaitCreatePIP(tc, pipName2, tc.GetResourceGroup(), defaultPublicIPAddress(pipName2, tc.IPFamily == utils.IPv6))
+		By("Creating two test pips or more if DualStack")
+		v4Enabled, v6Enabled := utils.IfIPFamiliesEnabled(tc.IPFamily)
+		pipNames1, pipNames2 := map[bool]string{}, map[bool]string{}
+		pipNamesSlice1, pipNamesSlice2 := []string{}, []string{}
+		pipNameBase1, pipNameBase2 := "pip1", "pip2"
+		targetIPs1, targetIPs2 := []string{}, []string{}
+		deleteFuncs := []func(){}
+		doPIP := func(isIPv6 bool) {
+			pipName1 := utils.GetNameWithSuffix(pipNameBase1, utils.Suffixes[isIPv6])
+			pipNames1[isIPv6] = pipName1
+			pipNamesSlice1 = append(pipNamesSlice1, pipName1)
+			targetIP1, deleteFunc1 := createPIP(tc, pipNameBase1, isIPv6)
+			targetIPs1 = append(targetIPs1, targetIP1)
+			deleteFuncs = append(deleteFuncs, deleteFunc1)
+
+			pipName2 := utils.GetNameWithSuffix(pipNameBase2, utils.Suffixes[isIPv6])
+			pipNames2[isIPv6] = pipName2
+			pipNamesSlice2 = append(pipNamesSlice2, pipName2)
+			targetIP2, deleteFunc2 := createPIP(tc, pipNameBase2, isIPv6)
+			targetIPs2 = append(targetIPs2, targetIP2)
+			deleteFuncs = append(deleteFuncs, deleteFunc2)
+		}
+		if v4Enabled {
+			doPIP(false)
+		}
+		if v6Enabled {
+			doPIP(true)
+		}
 		defer func() {
-			By("Cleaning up test PIP")
-			err := utils.DeletePIPWithRetry(tc, pipName2, tc.GetResourceGroup())
-			Expect(err).NotTo(HaveOccurred())
+			for _, deleteFunc := range deleteFuncs {
+				deleteFunc()
+			}
 		}()
-		Expect(err).NotTo(HaveOccurred())
 
 		By("Creating a service referring to the first pip")
-		annotation := map[string]string{
-			consts.ServiceAnnotationPIPName: pipName1,
+		annotation := map[string]string{}
+		// TODO: dual-stack
+		if utils.DualstackSupported {
+			if v4Enabled {
+				annotation[consts.ServiceAnnotationPIPNameDualStack[false]] = pipNames1[false]
+			}
+			if v6Enabled {
+				annotation[consts.ServiceAnnotationPIPNameDualStack[true]] = pipNames1[true]
+			}
+		} else {
+			annotation[consts.ServiceAnnotationPIPName] = pipNames1[tc.IPFamily == utils.IPv6]
 		}
+
 		service := utils.CreateLoadBalancerServiceManifest(serviceName, annotation, labels, ns.Name, ports)
-		_, err = cs.CoreV1().Services(ns.Name).Create(context.TODO(), service, metav1.CreateOptions{})
+		_, err := cs.CoreV1().Services(ns.Name).Create(context.TODO(), service, metav1.CreateOptions{})
 		defer func() {
 			By("Cleaning up test service")
 			err := utils.DeleteService(cs, ns.Name, serviceName)
@@ -578,18 +665,28 @@ var _ = Describe("Service with annotation", Label(utils.TestSuiteLabelServiceAnn
 		Expect(err).NotTo(HaveOccurred())
 
 		By("Waiting for the service to expose")
-		_, err = utils.WaitServiceExposureAndValidateConnectivity(cs, tc.IPFamily, ns.Name, serviceName, []string{pointer.StringDeref(pip1.IPAddress, "")})
+		_, err = utils.WaitServiceExposureAndValidateConnectivity(cs, tc.IPFamily, ns.Name, serviceName, targetIPs1)
 		Expect(err).NotTo(HaveOccurred())
 
 		By("Updating the service to refer to the second service")
 		service, err = cs.CoreV1().Services(ns.Name).Get(context.TODO(), serviceName, metav1.GetOptions{})
 		Expect(err).NotTo(HaveOccurred())
-		service.Annotations[consts.ServiceAnnotationPIPName] = pipName2
+		if utils.DualstackSupported {
+			if v4Enabled {
+				service.Annotations[consts.ServiceAnnotationPIPNameDualStack[false]] = pipNames2[false]
+			}
+			if v6Enabled {
+				service.Annotations[consts.ServiceAnnotationPIPNameDualStack[true]] = pipNames2[true]
+			}
+		} else {
+			service.Annotations[consts.ServiceAnnotationPIPName] = pipNames2[tc.IPFamily == utils.IPv6]
+		}
+
 		_, err = cs.CoreV1().Services(ns.Name).Update(context.TODO(), service, metav1.UpdateOptions{})
 		Expect(err).NotTo(HaveOccurred())
 
 		By("Waiting for service IP to be updated")
-		_, err = utils.WaitServiceExposureAndValidateConnectivity(cs, tc.IPFamily, ns.Name, serviceName, []string{pointer.StringDeref(pip2.IPAddress, "")})
+		_, err = utils.WaitServiceExposureAndValidateConnectivity(cs, tc.IPFamily, ns.Name, serviceName, targetIPs2)
 		Expect(err).NotTo(HaveOccurred())
 	})
 
@@ -597,33 +694,61 @@ var _ = Describe("Service with annotation", Label(utils.TestSuiteLabelServiceAnn
 		if !strings.EqualFold(os.Getenv(utils.LoadBalancerSkuEnv), string(network.PublicIPAddressSkuNameStandard)) {
 			Skip("pip-prefix-id only work with Standard Load Balancer")
 		}
+
+		By("Creating two test PIPPrefixes or more if DualStack")
 		const (
-			prefix1Name = "prefix1"
-			prefix2Name = "prefix2"
+			prefix1NameBase = "prefix1"
+			prefix2NameBase = "prefix2"
 		)
+		prefixIDs1, prefixIDs2 := map[bool]string{}, map[bool]string{}
+		prefixNames1, prefixNames2 := map[bool]string{}, map[bool]string{}
+		deleteFuncs := []func(){}
+
+		v4Enabled, v6Enabled := utils.IfIPFamiliesEnabled(tc.IPFamily)
+		createPIPPrefix := func(isIPv6 bool) {
+			prefixName := utils.GetNameWithSuffix(prefix1NameBase, utils.Suffixes[isIPv6])
+			prefixNames1[isIPv6] = prefixName
+			prefix, err := utils.WaitCreatePIPPrefix(tc, prefixName, tc.GetResourceGroup(), defaultPublicIPPrefix(prefixName, isIPv6))
+			deleteFuncs = append(deleteFuncs, func() {
+				Expect(utils.DeletePIPPrefixWithRetry(tc, prefixName)).NotTo(HaveOccurred())
+			})
+			Expect(err).NotTo(HaveOccurred())
+			prefixIDs1[isIPv6] = pointer.StringDeref(prefix.ID, "")
 
-		By("Creating two test PIPPrefix")
-		prefix1, err := utils.WaitCreatePIPPrefix(tc, prefix1Name, tc.GetResourceGroup(), defaultPublicIPPrefix(prefix1Name, tc.IPFamily == utils.IPv6))
-		defer func() {
-			By(fmt.Sprintf("Cleaning up pip-prefix: %s", prefix1Name))
-			Expect(utils.DeletePIPPrefixWithRetry(tc, prefix1Name)).NotTo(HaveOccurred())
-		}()
-		Expect(err).NotTo(HaveOccurred())
-
-		prefix2, err := utils.WaitCreatePIPPrefix(tc, prefix2Name, tc.GetResourceGroup(), defaultPublicIPPrefix(prefix2Name, tc.IPFamily == utils.IPv6))
+			prefixName = utils.GetNameWithSuffix(prefix2NameBase, utils.Suffixes[isIPv6])
+			prefixNames2[isIPv6] = prefixName
+			prefix, err = utils.WaitCreatePIPPrefix(tc, prefixName, tc.GetResourceGroup(), defaultPublicIPPrefix(prefixName, isIPv6))
+			deleteFuncs = append(deleteFuncs, func() {
+				Expect(utils.DeletePIPPrefixWithRetry(tc, prefixName)).NotTo(HaveOccurred())
+			})
+			Expect(err).NotTo(HaveOccurred())
+			prefixIDs2[isIPv6] = pointer.StringDeref(prefix.ID, "")
+		}
+		if v4Enabled {
+			createPIPPrefix(false)
+		}
+		if v6Enabled {
+			createPIPPrefix(true)
+		}
 		defer func() {
-			By(fmt.Sprintf("Cleaning up pip-prefix: %s", prefix2Name))
-			Expect(utils.DeletePIPPrefixWithRetry(tc, prefix2Name)).NotTo(HaveOccurred())
+			for _, deleteFunc := range deleteFuncs {
+				deleteFunc()
+			}
 		}()
-		Expect(err).NotTo(HaveOccurred())
 
 		By("Creating a service referring to the prefix")
 		{
-			annotation := map[string]string{
-				consts.ServiceAnnotationPIPPrefixID: pointer.StringDeref(prefix1.ID, ""),
+			annotation := map[string]string{}
+			for isIPv6, id := range prefixIDs1 {
+				// TODO: Update after dual-stack implementation finishes
+				if utils.DualstackSupported {
+					annotation[consts.ServiceAnnotationPIPPrefixIDDualStack[isIPv6]] = id
+				} else {
+					annotation[consts.ServiceAnnotationPIPPrefixID] = id
+				}
 			}
 			service := utils.CreateLoadBalancerServiceManifest(serviceName, annotation, labels, ns.Name, ports)
-			_, err = cs.CoreV1().Services(ns.Name).Create(context.TODO(), service, metav1.CreateOptions{})
+			_, err := cs.CoreV1().Services(ns.Name).Create(context.TODO(), service, metav1.CreateOptions{})
 			Expect(err).NotTo(HaveOccurred())
 		}
 
@@ -636,38 +761,53 @@ var _ = Describe("Service with annotation", Label(utils.TestSuiteLabelServiceAnn
 		{
 			ips, err := utils.WaitServiceExposureAndValidateConnectivity(cs, tc.IPFamily, ns.Name, serviceName, []string{})
 			Expect(err).NotTo(HaveOccurred())
-			Expect(len(ips)).NotTo(BeZero())
-			ip := ips[0]
-
-			pip, err := utils.WaitGetPIPByPrefix(tc, prefix1Name, true)
-			Expect(err).NotTo(HaveOccurred())
+			for _, ip := range ips {
+				isIPv6 := net.ParseIP(ip).To4() == nil
+				pip, err := utils.WaitGetPIPByPrefix(tc, prefixNames1[isIPv6], true)
+				Expect(err).NotTo(HaveOccurred())
 
-			Expect(pip.IPAddress).NotTo(BeNil())
-			Expect(pip.PublicIPPrefix.ID).To(Equal(prefix1.ID))
-			Expect(ip).To(Equal(pointer.StringDeref(pip.IPAddress, "")))
+				Expect(pip.IPAddress).NotTo(BeNil())
+				Expect(pointer.StringDeref(pip.PublicIPPrefix.ID, "")).To(Equal(prefixIDs1[isIPv6]))
+				Expect(ip).To(Equal(pointer.StringDeref(pip.IPAddress, "")))
+			}
 		}
 
 		By("Updating the service to refer to the second prefix")
 		{
 			service, err := cs.CoreV1().Services(ns.Name).Get(context.TODO(), serviceName, metav1.GetOptions{})
 			Expect(err).NotTo(HaveOccurred())
-			service.Annotations[consts.ServiceAnnotationPIPPrefixID] = pointer.StringDeref(prefix2.ID, "")
+			for isIPv6, id := range prefixIDs2 {
+				// TODO: Update after dual-stack implementation finishes
+				if utils.DualstackSupported {
+					service.Annotations[consts.ServiceAnnotationPIPPrefixIDDualStack[isIPv6]] = id
+				} else {
+					service.Annotations[consts.ServiceAnnotationPIPPrefixID] = id
+				}
+			}
 			_, err = cs.CoreV1().Services(ns.Name).Update(context.TODO(), service, metav1.UpdateOptions{})
 			Expect(err).NotTo(HaveOccurred())
 		}
 
 		By("Waiting for service IP to be updated")
 		{
-			var pip network.PublicIPAddress
-
 			// wait until ip created by prefix
-			pip, err := utils.WaitGetPIPByPrefix(tc, prefix2Name, true)
-			Expect(err).NotTo(HaveOccurred())
+			pipAddrs := []string{}
+			doPIPByPrefix := func(isIPv6 bool) {
+				pip, err := utils.WaitGetPIPByPrefix(tc, prefixNames2[isIPv6], true)
+				Expect(err).NotTo(HaveOccurred())
 
-			Expect(pip.IPAddress).NotTo(BeNil())
-			Expect(pip.PublicIPPrefix.ID).To(Equal(prefix2.ID))
+				Expect(pip.IPAddress).NotTo(BeNil())
+				Expect(pointer.StringDeref(pip.PublicIPPrefix.ID, "")).To(Equal(prefixIDs2[isIPv6]))
+				pipAddrs = append(pipAddrs, pointer.StringDeref(pip.IPAddress, ""))
+			}
+			if v4Enabled {
+				doPIPByPrefix(false)
+			}
+			if v6Enabled {
+				doPIPByPrefix(true)
+			}
 
-			_, err = utils.WaitServiceExposureAndValidateConnectivity(cs, tc.IPFamily, ns.Name, serviceName, []string{pointer.StringDeref(pip.IPAddress, "")})
+			_, err := utils.WaitServiceExposureAndValidateConnectivity(cs, tc.IPFamily, ns.Name, serviceName, pipAddrs)
 			Expect(err).NotTo(HaveOccurred())
 		}
 	})
@@ -691,28 +831,42 @@ var _ = Describe("Service with annotation", Label(utils.TestSuiteLabelServiceAnn
 			Expect(err).NotTo(HaveOccurred())
 		}()
 		Expect(len(publicIPs)).NotTo(BeZero())
-		publicIP := publicIPs[0]
-		pipFrontendConfigID := getPIPFrontendConfigurationID(tc, publicIP, tc.GetResourceGroup(), "")
-		pipFrontendConfigIDSplit := strings.Split(pipFrontendConfigID, "/")
-		Expect(len(pipFrontendConfigIDSplit)).NotTo(Equal(0))
+		ids := []string{}
+		for _, publicIP := range publicIPs {
+			pipFrontendConfigID := getPIPFrontendConfigurationID(tc, publicIP, tc.GetResourceGroup(), "")
+			pipFrontendConfigIDSplit := strings.Split(pipFrontendConfigID, "/")
+			Expect(len(pipFrontendConfigIDSplit)).NotTo(Equal(0))
+			ids = append(ids, pipFrontendConfigIDSplit[len(pipFrontendConfigIDSplit)-1])
+		}
 
 		var lb *network.LoadBalancer
 		var targetProbes []*network.Probe
+		expectedTargetProbesCount := 1
+		if tc.IPFamily == utils.DualStack {
+			expectedTargetProbesCount = 2
+		}
 		//wait for backend update
 		err := wait.PollImmediate(5*time.Second, 60*time.Second, func() (bool, error) {
-			lb = getAzureLoadBalancerFromPIP(tc, publicIP, tc.GetResourceGroup(), "")
+			lb = getAzureLoadBalancerFromPIP(tc, publicIPs[0], tc.GetResourceGroup(), "")
 			targetProbes = []*network.Probe{}
 			for i := range *lb.LoadBalancerPropertiesFormat.Probes {
 				probe := (*lb.LoadBalancerPropertiesFormat.Probes)[i]
 				utils.Logf("One probe of LB is %q", *probe.Name)
 				probeSplit := strings.Split(*probe.Name, "-")
 				Expect(len(probeSplit)).NotTo(Equal(0))
-				if pipFrontendConfigIDSplit[len(pipFrontendConfigIDSplit)-1] == probeSplit[0] {
-					targetProbes = append(targetProbes, &probe)
+				probeSplitID := probeSplit[0]
+				if len(probeSplit) > 1 &&
+					(probeSplit[len(probeSplit)-1] == "IPv4" || probeSplit[len(probeSplit)-1] == "IPv6") {
+					probeSplitID += "-" + probeSplit[len(probeSplit)-1]
+				}
+				for _, id := range ids {
+					if id == probeSplitID {
+						targetProbes = append(targetProbes, &probe)
+					}
 				}
 			}
 
-			return len(targetProbes) == 1, nil
+			return len(targetProbes) == expectedTargetProbesCount, nil
 		})
 		Expect(err).NotTo(HaveOccurred())
 
@@ -732,8 +886,10 @@ var _ = Describe("Service with annotation", Label(utils.TestSuiteLabelServiceAnn
 		utils.Logf("Validating health probe config intervalInSeconds")
 		Expect(*intervalInSeconds).To(Equal(int32(10)))
 		utils.Logf("Validating health probe config protocol")
-		Expect((len(targetProbes))).To(Equal(1))
-		Expect(targetProbes[0].Protocol).To(Equal(network.ProbeProtocolHTTP))
+		Expect(len(targetProbes)).To(Equal(expectedTargetProbesCount))
+		for _, targetProbe := range targetProbes {
+			Expect(targetProbe.Protocol).To(Equal(network.ProbeProtocolHTTP))
+		}
 	})
 
 	It("should generate health probe configs in multi-port scenario", func() {
@@ -762,23 +918,28 @@ var _ = Describe("Service with annotation", Label(utils.TestSuiteLabelServiceAnn
 			Expect(err).NotTo(HaveOccurred())
 		}()
 		Expect(len(publicIPs)).NotTo(BeZero())
-		publicIP := publicIPs[0]
-		pipFrontendConfigID := getPIPFrontendConfigurationID(tc, publicIP, tc.GetResourceGroup(), "")
-		pipFrontendConfigIDSplit := strings.Split(pipFrontendConfigID, "/")
-		Expect(len(pipFrontendConfigIDSplit)).NotTo(Equal(0))
+		for _, publicIP := range publicIPs {
+			pipFrontendConfigID := getPIPFrontendConfigurationID(tc, publicIP, tc.GetResourceGroup(), "")
+			pipFrontendConfigIDSplit := strings.Split(pipFrontendConfigID, "/")
+			Expect(len(pipFrontendConfigIDSplit)).NotTo(Equal(0))
+		}
 
 		var lb *network.LoadBalancer
 		var targetProbes []*network.Probe
+		expectedTargetProbesCount := 1
+		if tc.IPFamily == utils.DualStack {
+			expectedTargetProbesCount = 2
+		}
 		//wait for backend update
 		err := wait.PollImmediate(5*time.Second, 60*time.Second, func() (bool, error) {
-			lb = getAzureLoadBalancerFromPIP(tc, publicIP, tc.GetResourceGroup(), "")
+			lb = getAzureLoadBalancerFromPIP(tc, publicIPs[0], tc.GetResourceGroup(), "")
 			targetProbes = []*network.Probe{}
 			for i := range *lb.LoadBalancerPropertiesFormat.Probes {
 				probe := (*lb.LoadBalancerPropertiesFormat.Probes)[i]
 				utils.Logf("One probe of LB is %q", *probe.Name)
 				targetProbes = append(targetProbes, &probe)
 			}
-			return len(targetProbes) == 1, nil
+			return len(targetProbes) == expectedTargetProbesCount, nil
 		})
 		Expect(err).NotTo(HaveOccurred())
 
@@ -798,51 +959,78 @@ var _ = Describe("Service with annotation", Label(utils.TestSuiteLabelServiceAnn
 		utils.Logf("Validating health probe config intervalInSeconds")
 		Expect(*intervalInSeconds).To(Equal(int32(10)))
 		utils.Logf("Validating health probe config protocol")
-		Expect((len(targetProbes))).To(Equal(1))
-		Expect(targetProbes[0].Protocol).To(Equal(network.ProbeProtocolHTTP))
+		Expect((len(targetProbes))).To(Equal(expectedTargetProbesCount))
+		for _, targetProbe := range targetProbes {
+			Expect(targetProbe.Protocol).To(Equal(network.ProbeProtocolHTTP))
+		}
 	})
 
 	// Check if the following annotations are correctly set with Service LB IP
 	// service.beta.kubernetes.io/azure-load-balancer-ipv4 or service.beta.kubernetes.io/azure-load-balancer-ipv6
 	It("should support service annotation 'service.beta.kubernetes.io/azure-load-balancer-ip'", func() {
-		pipName := fmt.Sprintf("%s-public-IP%s", basename, string(uuid.NewUUID())[0:4])
-		By(fmt.Sprintf("Creating a public IP %q", pipName))
-		var pip network.PublicIPAddress
-		// TODO: dual-stack support
-		if tc.IPFamily != utils.DualStack {
-			pip = defaultPublicIPAddress(pipName, tc.IPFamily == utils.IPv6)
-		}
+		v4Enabled, v6Enabled := utils.IfIPFamiliesEnabled(tc.IPFamily)
 		rg := tc.GetResourceGroup()
-		pip, err := utils.WaitCreatePIP(tc, pipName, rg, pip)
-		Expect(err).NotTo(HaveOccurred())
-		defer func() {
-			utils.Logf("Cleaning up public IP")
-			err = utils.DeletePIPWithRetry(tc, pipName, rg)
-			Expect(err).NotTo(HaveOccurred())
-		}()
-		pipAddr := pointer.StringDeref(pip.IPAddress, "")
-		utils.Logf("Created pip with address %s", pipAddr)
 
 		annotation := map[string]string{}
-		// TODO: dual-stack support
-		if tc.IPFamily == utils.IPv4 {
-			annotation[consts.ServiceAnnotationLoadBalancerIPDualStack[false]] = pipAddr
-		} else if tc.IPFamily == utils.IPv6 {
-			annotation[consts.ServiceAnnotationLoadBalancerIPDualStack[true]] = pipAddr
+
+		createPIPWithIPFamily := func(isIPv6 bool) (string, func()) {
+			pipName := fmt.Sprintf("%s-public-IP%s", basename, string(uuid.NewUUID())[0:4])
+			By(fmt.Sprintf("Creating a public IP %q, isIPv6: %v", pipName, isIPv6))
+			pip := defaultPublicIPAddress(pipName, isIPv6)
+			pip, err := utils.WaitCreatePIP(tc, pipName, rg, pip)
+			Expect(err).NotTo(HaveOccurred())
+			cleanup := func() {
+				utils.Logf("Cleaning up public IP %q", pipName)
+				err := utils.DeletePIPWithRetry(tc, pipName, rg)
+				Expect(err).NotTo(HaveOccurred())
+			}
+
+			pipAddr := pointer.StringDeref(pip.IPAddress, "")
+			utils.Logf("Created pip with address %s", pipAddr)
+			annotation[consts.ServiceAnnotationLoadBalancerIPDualStack[isIPv6]] = pipAddr
+			return pipAddr, cleanup
 		}
 
-		By("Creating a Service")
-		publicIPs := createAndExposeDefaultServiceWithAnnotation(cs, tc.IPFamily, serviceName, ns.Name, labels, annotation, ports)
+		var pipAddrV4, pipAddrV6 string
+		var cleanPIPV4, cleanPIPV6 func()
+		if v4Enabled {
+			pipAddrV4, cleanPIPV4 = createPIPWithIPFamily(false)
+			defer cleanPIPV4()
+		}
+		if v6Enabled {
+			pipAddrV6, cleanPIPV6 = createPIPWithIPFamily(true)
+			defer cleanPIPV6()
+		}
+
+		By("Creating Services")
+		ips := createAndExposeDefaultServiceWithAnnotation(cs, tc.IPFamily, serviceName, ns.Name, labels, annotation, ports)
 		defer func() {
 			By("Cleaning up service")
 			err := utils.DeleteService(cs, ns.Name, serviceName)
 			Expect(err).NotTo(HaveOccurred())
 		}()
-		Expect(len(publicIPs)).NotTo(BeZero())
-		publicIP := publicIPs[0]
 
-		By("Check if the Service has the correct address")
-		Expect(publicIP).To(Equal(pipAddr))
+		By("Check if the Service has the correct addresses")
+		if v4Enabled {
+			found := false
+			for _, ip := range ips {
+				if ip == pipAddrV4 {
+					found = true
+					break
+				}
+			}
+			Expect(found).To(BeTrue())
+		}
+		if v6Enabled {
+			found := false
+			for _, ip := range ips {
+				if ip == pipAddrV6 {
+					found = true
+					break
+				}
+			}
+			Expect(found).To(BeTrue())
+		}
 	})
 })
 
@@ -1026,15 +1214,19 @@ var _ = Describe("Multi-ports service", Label(utils.TestSuiteLabelMultiPorts), f
 			publicIPs, err := utils.WaitServiceExposureAndValidateConnectivity(cs, tc.IPFamily, ns.Name, serviceName, []string{})
 			Expect(err).NotTo(HaveOccurred())
 			Expect(len(publicIPs)).NotTo(BeZero())
-			publicIP := publicIPs[0]
 			// create service with given annotation and wait it to expose
 
 			defer func() {
-				By("Cleaning up service and public IP")
+				By("Cleaning up service")
 				err := utils.DeleteService(cs, ns.Name, serviceName)
 				Expect(err).NotTo(HaveOccurred())
-				err = utils.DeletePIPWithRetry(tc, publicIP, tc.GetResourceGroup())
-				Expect(err).NotTo(HaveOccurred())
+				for _, ip := range publicIPs {
+					By(fmt.Sprintf("Cleaning up public IP %q", ip))
+					pip, err := tc.GetPublicIPFromAddress(tc.GetResourceGroup(), ip)
+					Expect(err).NotTo(HaveOccurred())
+					err = utils.DeletePIPWithRetry(tc, pointer.StringDeref(pip.Name, ""), tc.GetResourceGroup())
+					Expect(err).NotTo(HaveOccurred())
+				}
 			}()
 
 			By("Changing ExternalTrafficPolicy of the service to Local")
@@ -1065,27 +1257,49 @@ var _ = Describe("Multi-ports service", Label(utils.TestSuiteLabelMultiPorts), f
 			})
 			Expect(retryErr).NotTo(HaveOccurred())
 
-			pipFrontendConfigID := getPIPFrontendConfigurationID(tc, publicIP, tc.GetResourceGroup(), "")
-			pipFrontendConfigIDSplit := strings.Split(pipFrontendConfigID, "/")
-			Expect(len(pipFrontendConfigIDSplit)).NotTo(Equal(0))
+			ids := []string{}
+			for _, publicIP := range publicIPs {
+				pipFrontendConfigID := getPIPFrontendConfigurationID(tc, publicIP, tc.GetResourceGroup(), "")
+				pipFrontendConfigIDSplit := strings.Split(pipFrontendConfigID, "/")
+				Expect(len(pipFrontendConfigIDSplit)).NotTo(Equal(0))
+				ids = append(ids, pipFrontendConfigIDSplit[len(pipFrontendConfigIDSplit)-1])
+			}
 
 			var lb *network.LoadBalancer
 			var targetProbes []*network.Probe
+			expectedTargetProbesCount := 1
+			if tc.IPFamily == utils.DualStack {
+				expectedTargetProbesCount = 2
+			}
 			//wait for backend update
+			checkPort := func(port int32, targetProbes []*network.Probe) bool {
+				utils.Logf("Checking port %d", port)
+				match := true
+				for _, targetProbe := range targetProbes {
+					if *(targetProbe.Port) != port {
+						match = false
+						break
+					}
+				}
+				utils.Logf("match %v", match)
+				return match
+			}
 			err = wait.PollImmediate(5*time.Second, 2*time.Minute, func() (bool, error) {
-				lb = getAzureLoadBalancerFromPIP(tc, publicIP, tc.GetResourceGroup(), "")
+				lb = getAzureLoadBalancerFromPIP(tc, publicIPs[0], tc.GetResourceGroup(), "")
 				targetProbes = []*network.Probe{}
 				for i := range *lb.LoadBalancerPropertiesFormat.Probes {
 					probe := (*lb.LoadBalancerPropertiesFormat.Probes)[i]
 					utils.Logf("One probe of LB is %q", *probe.Name)
 					probeSplit := strings.Split(*probe.Name, "-")
 					Expect(len(probeSplit)).NotTo(Equal(0))
-					if pipFrontendConfigIDSplit[len(pipFrontendConfigIDSplit)-1] == probeSplit[0] {
-						targetProbes = append(targetProbes, &probe)
+					for _, id := range ids {
+						utils.Logf("ID %q", id)
+						if id == probeSplit[0] {
+							targetProbes = append(targetProbes, &probe)
+						}
 					}
 				}
-				return len(targetProbes) == 1 &&
-					*(targetProbes)[0].Port == service.Spec.HealthCheckNodePort, nil
+				return len(targetProbes) == expectedTargetProbesCount && checkPort(service.Spec.HealthCheckNodePort, targetProbes), nil
 			})
 			Expect(err).NotTo(HaveOccurred())
 
@@ -1105,21 +1319,31 @@ var _ = Describe("Multi-ports service", Label(utils.TestSuiteLabelMultiPorts), f
 			utils.Logf("Successfully updated LoadBalancer service " + serviceName + " in namespace " + ns.Name)
 
 			//wait for backend update
+			expectedTargetProbesCount = 2
+			if tc.IPFamily == utils.DualStack {
+				expectedTargetProbesCount = 4
+			}
 			err = wait.PollImmediate(5*time.Second, 2*time.Minute, func() (bool, error) {
-				lb := getAzureLoadBalancerFromPIP(tc, publicIP, tc.GetResourceGroup(), "")
+				lb := getAzureLoadBalancerFromPIP(tc, publicIPs[0], tc.GetResourceGroup(), "")
 				targetProbes = []*network.Probe{}
 				for i := range *lb.LoadBalancerPropertiesFormat.Probes {
 					probe := (*lb.LoadBalancerPropertiesFormat.Probes)[i]
 					utils.Logf("One probe of LB is %q", *probe.Name)
 					probeSplit := strings.Split(*probe.Name, "-")
 					Expect(len(probeSplit)).NotTo(Equal(0))
-					if pipFrontendConfigIDSplit[len(pipFrontendConfigIDSplit)-1] == probeSplit[0] {
-						targetProbes = append(targetProbes, &probe)
+					for _, id := range ids {
+						utils.Logf("ID %q", id)
+						if id == probeSplit[0] {
+							targetProbes = append(targetProbes, &probe)
+						}
+					}
+				}
+				for _, targetProbe := range targetProbes {
+					if checkPort(nodeHealthCheckPort, []*network.Probe{targetProbe}) {
+						return false, nil
 					}
 				}
-				return len(targetProbes) == 2 &&
-					*(targetProbes)[0].Port != nodeHealthCheckPort &&
-					*(targetProbes)[1].Port != nodeHealthCheckPort, nil
+				return len(targetProbes) == expectedTargetProbesCount, nil
 			})
 			Expect(err).NotTo(HaveOccurred())
 		})
diff --git a/tests/e2e/utils/network_utils.go b/tests/e2e/utils/network_utils.go
index 8f939136a..cd21bffae 100644
--- a/tests/e2e/utils/network_utils.go
+++ b/tests/e2e/utils/network_utils.go
@@ -390,6 +390,9 @@ func DeletePIPPrefixWithRetry(cli *AzureTestClient, name string) error {
 
 // DeletePIPWithRetry tries to delete a public ip resource
 func DeletePIPWithRetry(azureTestClient *AzureTestClient, ipName, rgName string) error {
+	if ipName == "" {
+		return nil
+	}
 	if rgName == "" {
 		rgName = azureTestClient.GetResourceGroup()
 	}