| 227 | } |
| 228 | |
| 229 | int UnixSocketPort::SendPackets(queue_t qid, bess::Packet **pkts, int cnt) { |
| 230 | int sent = 0; |
| 231 | int client_fd = client_fd_; |
| 232 | |
| 233 | DCHECK_EQ(qid, 0); |
| 234 | |
| 235 | if (client_fd == kNotConnectedFd) { |
| 236 | return 0; |
| 237 | } |
| 238 | |
| 239 | for (int i = 0; i < cnt; i++) { |
| 240 | bess::Packet *pkt = pkts[i]; |
| 241 | |
| 242 | int nb_segs = pkt->nb_segs(); |
| 243 | struct iovec iov[nb_segs]; |
| 244 | |
| 245 | struct msghdr msg = msghdr(); |
| 246 | msg.msg_iov = iov; |
| 247 | msg.msg_iovlen = nb_segs; |
| 248 | |
| 249 | ssize_t ret; |
| 250 | |
| 251 | for (int j = 0; j < nb_segs; j++) { |
| 252 | iov[j].iov_base = pkt->head_data(); |
| 253 | iov[j].iov_len = pkt->head_len(); |
| 254 | pkt = pkt->next(); |
| 255 | } |
| 256 | |
| 257 | ret = sendmsg(client_fd, &msg, 0); |
| 258 | if (ret < 0) { |
| 259 | break; |
| 260 | } |
| 261 | |
| 262 | sent++; |
| 263 | } |
| 264 | |
| 265 | if (sent) { |
| 266 | bess::Packet::Free(pkts, sent); |
| 267 | } |
| 268 | |
| 269 | return sent; |
| 270 | } |
| 271 | |
| 272 | ADD_DRIVER(UnixSocketPort, "unix_port", |
| 273 | "packet exchange via a UNIX domain socket") |