diff options
author | Subhani Shaik <subhanis@codeaurora.org> | 2017-08-11 11:39:06 -0700 |
---|---|---|
committer | Ecco Park <eccopark@google.com> | 2017-08-11 12:28:40 -0700 |
commit | 111c8ab79807364ea73359b84951031c43a1ec4a (patch) | |
tree | 40017705de7942d14d63428dfd177666cf90eab1 /cld80211-lib/cld80211_lib.c | |
parent | 9aebcc18e7228ae1aaf9b4ca8706cb2aa632c0b2 (diff) | |
download | wlan-111c8ab79807364ea73359b84951031c43a1ec4a.tar.gz |
cld80211lib: Remove sendmsg to driver during cleanuporeo-dr1-dev
The get_multicast_id initiates a sendmsg to the driver and waits
in busywait to receive the msg. In certain failures where driver
is stopped prior to cleanup, the error handler is not returning
to terminate the bsywait. Subsequently we don't send a cleanup
notification to the framework. This triggers a subsequent start
of HAL interface and a hang state.
Bug: 64350646
Change-Id: I4cb078a98830f667beceb78a356cd7a4808b2f73
Diffstat (limited to 'cld80211-lib/cld80211_lib.c')
-rw-r--r-- | cld80211-lib/cld80211_lib.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/cld80211-lib/cld80211_lib.c b/cld80211-lib/cld80211_lib.c index 491fb3e..5c8255b 100644 --- a/cld80211-lib/cld80211_lib.c +++ b/cld80211-lib/cld80211_lib.c @@ -225,7 +225,7 @@ static int family_handler(struct nl_msg *msg, void *arg) } -static int get_multicast_id(struct cld80211_ctx *ctx, const char *group) +static int get_multicast_id(struct cld80211_ctx *ctx, const char *group, bool sync_driver) { struct family_data res = { group, -ENOENT }; struct nl_msg *nlmsg = nlmsg_alloc(); @@ -238,9 +238,11 @@ static int get_multicast_id(struct cld80211_ctx *ctx, const char *group) CTRL_CMD_GETFAMILY, 0); nla_put_string(nlmsg, CTRL_ATTR_FAMILY_NAME, "cld80211"); - cld80211_send_recv_msg(ctx, nlmsg, family_handler, &res); - ALOGI("%s: nlctrl family id: %d group: %s mcast_id: %d", getprogname(), - ctx->nlctrl_familyid, group, res.id); + if (sync_driver == true) { + cld80211_send_recv_msg(ctx, nlmsg, family_handler, &res); + ALOGI("%s: nlctrl family id: %d group: %s mcast_id: %d", getprogname(), + ctx->nlctrl_familyid, group, res.id); + } nlmsg_free(nlmsg); return res.id; } @@ -252,7 +254,7 @@ int cld80211_add_mcast_group(struct cld80211_ctx *ctx, const char* mcgroup) ALOGE("%s: ctx/mcgroup is NULL: %s", getprogname(), __func__); return 0; } - int id = get_multicast_id(ctx, mcgroup); + int id = get_multicast_id(ctx, mcgroup, true); if (id < 0) { ALOGE("%s: Could not find group %s, errno: %d id: %d", getprogname(), mcgroup, errno, id); @@ -275,7 +277,7 @@ int cld80211_remove_mcast_group(struct cld80211_ctx *ctx, const char* mcgroup) ALOGE("%s: ctx/mcgroup is NULL: %s", getprogname(), __func__); return 0; } - int id = get_multicast_id(ctx, mcgroup); + int id = get_multicast_id(ctx, mcgroup, false); if (id < 0) { ALOGE("%s: Could not find group %s, errno: %d id: %d", getprogname(), mcgroup, errno, id); |