> struct dpif_handler {
> struct dpif_channel *channels;/* Array of channels for each handler. */
> struct epoll_event *epoll_events;
> int epoll_fd; /* epoll fd that includes channel socks. */
> int n_events; /* Num events returned by epoll_wait(). */
> int event_offset; /* Offset into 'epoll_events'. */
> +
> +#ifdef _WIN32
> [EITAN]
> Is there any reason why not allocating the memory here for the socket pool
I am taking that you mean that I should declare something like:
struct dpif_windows_vport_sock
dpif_win_vport_sock_pool[VPORT_SOCK_POOL_SIZE];
rather than allocating the array later. I don't have any strong reason as such.
It seemed only cleaner to have a pointer to check for validity later on.
For Eg. in the following code:
struct dpif_windows_vport_sock *sock_pool = handler->
dpif_win_vport_sock_pool;
/* A pool of sockets is allocated when the handler is initialized. */
if (sock_pool == NULL) {
*error = EINVAL;
return NULL;
}
It is easier to check for a pointer rather than check the validity based on the
first socket or something like that.
if (sock_pool[0].nl_sock == NULL) {
}
I feel checking the pointer is more intuitive for checking for validity.
> [EITAN]
> Assert(sock_pool[i].nl_sock ->read_ioctl ==OVS_IOCTL_READ_PACKET)
Definition of 'struct nl_sock' is not available in dpif-netlink.c. I can write
an API for checking the type. FWIW, there's no such check after
nl_sock_join_mcgroup().
> + sock_pool = xzalloc(VPORT_SOCK_POOL_SIZE * sizeof *sock_pool);
> [EITAN]
> If ( !sock_pool) return error;
xzalloc() panics if it fails. No need for explit checking for memory allocation
failures. You can refer to usages of xzalloc().
> + for (i = 0; i < VPORT_SOCK_POOL_SIZE; i++) {
> + error = nl_sock_create(NETLINK_GENERIC, &sock_pool[i].nl_sock);
> + if (error) {
> + goto error;
> + }
> +
> + error = nl_sock_subscribe_packets(sock_pool[i].nl_sock);
> + if (error) {
> [EITAN]
> You want to unsubscribe for all socket index < i
Sure, I can add a check for that.
> [EITAN]
> Check sockp != NULL
> [EITAN]
> + /* Pick netlink sockets to use in a round-robin fashion from each
> + * handler's pool of sockets. */
> + for (i = 0; i < n_socks; i++) {
> + struct dpif_handler *handler = &dpif->handlers[i];
> + struct dpif_windows_vport_sock *sock_pool =
> + handler->dpif_win_vport_sock_pool;
> + size_t index = handler->dpif_win_last_used_vport_sock;
> +
> + /* A pool of sockets is allocated when the handler is initialized. */
> + if (sock_pool == NULL) {
> + *error = EINVAL;
> + return NULL;
> + }
> +
> +
> [EITAN]
> < not <=
Did you mean to say for 'i < n_socks'? We are iterating over the array,
starting at index 0. What do you see wrong?
> ovs_assert(index <= VPORT_SOCK_POOL_SIZE);
> + index = (index == VPORT_SOCK_POOL_SIZE - 1) ? 0 : index + 1;
> +
> [EITAN]
> Remove one line
Sure.
> [EITAN] Can we have the number of iterations (50_ as pre compiler variable
> + if (++read_tries > 50) {
> + return EAGAIN;
> + }
Sure. I can create a #define.
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev