@@ -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