-
Notifications
You must be signed in to change notification settings - Fork 313
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Allow to allocate cache manager with custom refill socket #378
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -148,17 +148,46 @@ static int event_input(struct nl_msg *msg, void *arg) | |
*/ | ||
int nl_cache_mngr_alloc(struct nl_sock *sk, int protocol, int flags, | ||
struct nl_cache_mngr **result) | ||
{ | ||
return nl_cache_mngr_alloc_ex(sk, NULL, protocol, flags, result); | ||
} | ||
|
||
/** | ||
* Allocate new cache manager, with custom callback on refill socket | ||
* @arg sk Netlink socket or NULL to auto allocate | ||
* @arg sync_sk Blocking Netlink socket for cache refills | ||
* @arg protocol Netlink protocol this manager is used for | ||
* @arg flags Flags (\c NL_AUTO_PROVIDE) | ||
* @arg result Result pointer | ||
* | ||
* Same as \f nl_cache_mngr_alloc, but sets custom refill socket | ||
* Note: ownership of the sync_sk passes to the cache manager | ||
*/ | ||
int nl_cache_mngr_alloc_ex(struct nl_sock *sk, struct nl_sock *sync_sk, int protocol, int flags, | ||
struct nl_cache_mngr **result) | ||
{ | ||
struct nl_cache_mngr *mngr; | ||
int err = -NLE_NOMEM; | ||
|
||
/* Catch abuse of flags */ | ||
if (flags & NL_ALLOCATED_SOCK) | ||
if (flags & (NL_ALLOCATED_SOCK|NL_ALLOCATED_SYNC_SOCK)) | ||
BUG(); | ||
|
||
mngr = calloc(1, sizeof(*mngr)); | ||
if (!mngr) | ||
if (!mngr) { | ||
return -NLE_NOMEM; | ||
} | ||
|
||
if(!sync_sk) { | ||
if (!(sync_sk = nl_socket_alloc())) | ||
goto errout; | ||
|
||
flags |= NL_ALLOCATED_SOCK; | ||
} | ||
/* have to assign before calling nl_connect, so that it gets freed in case | ||
* of an nl_socket_allock error for sk | ||
*/ | ||
mngr->cm_sync_sock = sync_sk; | ||
|
||
if (!sk) { | ||
if (!(sk = nl_socket_alloc())) | ||
|
@@ -176,6 +205,10 @@ int nl_cache_mngr_alloc(struct nl_sock *sk, int protocol, int flags, | |
if (!mngr->cm_assocs) | ||
goto errout; | ||
|
||
if ((err = nl_connect(sync_sk, protocol)) < 0) { | ||
goto errout; | ||
} | ||
|
||
/* Required to receive async event notifications */ | ||
nl_socket_disable_seq_check(mngr->cm_sock); | ||
|
||
|
@@ -185,23 +218,13 @@ int nl_cache_mngr_alloc(struct nl_sock *sk, int protocol, int flags, | |
if ((err = nl_socket_set_nonblocking(mngr->cm_sock)) < 0) | ||
goto errout; | ||
|
||
/* Create and allocate socket for sync cache fills */ | ||
mngr->cm_sync_sock = nl_socket_alloc(); | ||
if (!mngr->cm_sync_sock) { | ||
err = -NLE_NOMEM; | ||
goto errout; | ||
} | ||
if ((err = nl_connect(mngr->cm_sync_sock, protocol)) < 0) | ||
goto errout_free_sync_sock; | ||
|
||
NL_DBG(1, "Allocated cache manager %p, protocol %d, %d caches\n", | ||
mngr, protocol, mngr->cm_nassocs); | ||
|
||
*result = mngr; | ||
return 0; | ||
|
||
errout_free_sync_sock: | ||
nl_socket_free(mngr->cm_sync_sock); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. like You need to right logic, so that all internally allocated data is correctly freed on every error path. Use |
||
errout: | ||
nl_cache_mngr_free(mngr); | ||
return err; | ||
|
@@ -624,9 +647,11 @@ void nl_cache_mngr_free(struct nl_cache_mngr *mngr) | |
|
||
if (mngr->cm_sync_sock) { | ||
nl_close(mngr->cm_sync_sock); | ||
nl_socket_free(mngr->cm_sync_sock); | ||
} | ||
|
||
if (mngr->cm_flags & NL_ALLOCATED_SYNC_SOCK) | ||
nl_socket_free(mngr->cm_sync_sock); | ||
|
||
if (mngr->cm_flags & NL_ALLOCATED_SOCK) | ||
nl_socket_free(mngr->cm_sock); | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -372,3 +372,8 @@ global: | |
|
||
libnl_3_6 { | ||
} libnl_3_5; | ||
|
||
libnl_3_10 { | ||
global: | ||
nl_cache_mngr_alloc_ex; | ||
} libnl_3_6; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
not how for
mngr->cm_sock
, we call connect and non-blocking above. That means, for thesk
argument, the caller is not expected to do that. That may be a questionable choice, but it is probably better to handle his consistently. Meaning: leave thenl_connect(cm_sync_sock)
call here, also for the externally providedsk_blocking
.