Skip to content

Commit 23e6599

Browse files
committed
Improve send/recv vf rate process
1 parent 96a6bf9 commit 23e6599

File tree

1 file changed

+43
-37
lines changed

1 file changed

+43
-37
lines changed

src/dp_netlink.c

Lines changed: 43 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -131,22 +131,56 @@ int dp_nl_get_pf_neigh_mac(uint32_t if_idx, struct rte_ether_addr *neigh, const
131131
}
132132

133133

134-
int dp_nl_set_vf_rate(uint32_t pf_if_idx, uint32_t vf_index, uint32_t min_tx_rate, uint32_t max_tx_rate)
134+
static int dp_nl_send_recv_vf_rate_msg(int sock, struct dp_nl_vf_rate_req *req)
135135
{
136-
struct dp_nl_vf_rate_req req = {0};
137-
struct rtattr *linkinfo, *vfinfo, *vfrate;
138-
struct ifla_vf_rate *rate;
136+
// ssize_t sent_len;
139137
ssize_t reply_len, sent_len;
138+
char reply[4096];
140139
struct nlmsghdr *nh;
141140
struct nlmsgerr *err;
142-
int sock;
143-
int ret = DP_ERROR;
144-
char reply[4096];
145141

146142
struct sockaddr_nl sa = {
147143
.nl_family = AF_NETLINK,
148144
};
149145

146+
if (bind(sock, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
147+
DPS_LOG_ERR("Cannot bind to netlink", DP_LOG_NETLINK(strerror(errno)));
148+
return DP_ERROR;
149+
}
150+
151+
sent_len = send(sock, req, req->nl.nlmsg_len, 0);
152+
if (sent_len < 0 || sent_len != req->nl.nlmsg_len) {
153+
DPS_LOG_ERR("Failed to send VF rate message", DP_LOG_NETLINK(strerror(errno)));
154+
return DP_ERROR;
155+
}
156+
157+
// Wait for ACK, ensure it gets at least NLMSG_LENGTH(0) bytes
158+
reply_len = recv(sock, reply, sizeof(reply), 0);
159+
if (reply_len < (ssize_t)NLMSG_LENGTH(sizeof(struct nlmsgerr))) {
160+
DPS_LOG_ERR("Cannot receive ACK from netlink", DP_LOG_NETLINK(strerror(errno)));
161+
return DP_ERROR;
162+
}
163+
164+
nh = (struct nlmsghdr *)reply;
165+
if (nh->nlmsg_type == NLMSG_ERROR) {
166+
err = (struct nlmsgerr *)NLMSG_DATA(nh);
167+
if (err->error != 0) {
168+
DPS_LOG_ERR("Netlink error setting VF rate", DP_LOG_NETLINK(strerror(-err->error)));
169+
return DP_ERROR;
170+
}
171+
}
172+
173+
return DP_OK;
174+
}
175+
176+
int dp_nl_set_vf_rate(uint32_t pf_if_idx, uint32_t vf_index, uint32_t min_tx_rate, uint32_t max_tx_rate)
177+
{
178+
struct dp_nl_vf_rate_req req = {0};
179+
struct rtattr *linkinfo, *vfinfo, *vfrate;
180+
struct ifla_vf_rate *rate;
181+
int sock;
182+
int ret;
183+
150184
req.nl.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
151185
req.nl.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
152186
req.nl.nlmsg_type = RTM_SETLINK;
@@ -182,36 +216,8 @@ int dp_nl_set_vf_rate(uint32_t pf_if_idx, uint32_t vf_index, uint32_t min_tx_rat
182216
return DP_ERROR;
183217
}
184218

185-
if (bind(sock, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
186-
DPS_LOG_ERR("Cannot bind to netlink", DP_LOG_NETLINK(strerror(errno)));
187-
goto cleanup;
188-
}
189-
190-
sent_len = send(sock, &req, req.nl.nlmsg_len, 0);
191-
if (sent_len < 0 || sent_len != req.nl.nlmsg_len) {
192-
DPS_LOG_ERR("Failed to send VF rate message", DP_LOG_NETLINK(strerror(errno)));
193-
goto cleanup;
194-
}
195-
196-
// Wait for ACK, ensure it gets at least NLMSG_LENGTH(0) bytes
197-
reply_len = recv(sock, reply, sizeof(reply), 0);
198-
if (reply_len < (ssize_t)NLMSG_LENGTH(0)) {
199-
DPS_LOG_ERR("Cannot receive ACK from netlink", DP_LOG_NETLINK(strerror(errno)));
200-
goto cleanup;
201-
}
202-
203-
nh = (struct nlmsghdr *)reply;
204-
if (nh->nlmsg_type == NLMSG_ERROR) {
205-
err = (struct nlmsgerr *)NLMSG_DATA(nh);
206-
if (err->error != 0) {
207-
DPS_LOG_ERR("Netlink error setting VF rate", DP_LOG_NETLINK(strerror(-err->error)));
208-
goto cleanup;
209-
}
210-
}
211-
212-
ret = DP_OK;
213-
214-
cleanup:
219+
ret = dp_nl_send_recv_vf_rate_msg(sock, &req);
215220
close(sock);
221+
216222
return ret;
217223
}

0 commit comments

Comments
 (0)