X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fdnsproxy.c;h=7956e7fb17bdf335e665bcf441c39f5ffcc80ea0;hb=6d2cf90574c81cd30340116270e17af058703afb;hp=b244a02efa02209c503d7fc32745fc1e2d2a0ff9;hpb=2b88c43eaf88a11793496ea840d33407603113e1;p=platform%2Fupstream%2Fconnman.git diff --git a/src/dnsproxy.c b/src/dnsproxy.c index b244a02..7956e7f 100755 --- a/src/dnsproxy.c +++ b/src/dnsproxy.c @@ -472,7 +472,7 @@ static void send_cached_response(int sk, unsigned char *buf, int len, hdr->nscount = 0; hdr->arcount = 0; - /* if this is a negative reply, we are authorative */ + /* if this is a negative reply, we are authoritative */ if (answers == 0) hdr->aa = 1; else @@ -2177,8 +2177,15 @@ static int forward_dns_reply(unsigned char *reply, int reply_len, int protocol, req->resplen = 0; req->resp = g_try_malloc(reply_len); +#if defined TIZEN_EXT + if (!req->resp) { + g_free(new_reply); + return -ENOMEM; + } +#else if (!req->resp) return -ENOMEM; +#endif memcpy(req->resp, reply, reply_len); req->resplen = reply_len; @@ -3152,10 +3159,46 @@ static void dnsproxy_default_changed(struct connman_service *service) cache_refresh(); } +static void dnsproxy_service_state_changed(struct connman_service *service, + enum connman_service_state state) +{ + GSList *list; + int index; + + switch (state) { + case CONNMAN_SERVICE_STATE_DISCONNECT: + case CONNMAN_SERVICE_STATE_IDLE: + break; + case CONNMAN_SERVICE_STATE_ASSOCIATION: + case CONNMAN_SERVICE_STATE_CONFIGURATION: + case CONNMAN_SERVICE_STATE_FAILURE: + case CONNMAN_SERVICE_STATE_ONLINE: + case CONNMAN_SERVICE_STATE_READY: + case CONNMAN_SERVICE_STATE_UNKNOWN: + return; + } + + index = __connman_service_get_index(service); + list = server_list; + + while (list) { + struct server_data *data = list->data; + + /* Get next before the list is changed by destroy_server() */ + list = list->next; + + if (data->index == index) { + DBG("removing server data of index %d", index); + destroy_server(data); + } + } +} + static const struct connman_notifier dnsproxy_notifier = { .name = "dnsproxy", .default_changed = dnsproxy_default_changed, .offline_mode = dnsproxy_offline_mode, + .service_state_changed = dnsproxy_service_state_changed, }; static const unsigned char opt_edns0_type[2] = { 0x00, 0x29 }; @@ -3739,6 +3782,39 @@ static gboolean tcp6_listener_event(GIOChannel *channel, GIOCondition condition, &ifdata->tcp6_listener_watch); } +#if defined TIZEN_EXT +struct request_data * create_request(int sk, unsigned char *buf, size_t len, + const struct sockaddr *to, socklen_t tolen, + int protocol) +{ + struct request_data *req; + req = g_try_new0(struct request_data, 1); + if (!req) + return NULL; + memcpy(&req->sa, to, tolen); + req->sa_len = tolen; + req->client_sk = sk; + req->protocol = protocol; + req->request_len = len; + req->request = g_malloc(len); + memcpy(req->request, buf, len); + return req; + +} +static gboolean send_response_timeout (gpointer user_data) +{ + struct request_data *req = user_data; + + send_response(req->client_sk, req->request,(size_t) req->request_len, (const struct sockaddr *)&req->sa, + (socklen_t)req->sa_len, req->protocol); + g_free(req->request); + g_free(req); + + return FALSE; + +} +#endif + static bool udp_listener_event(GIOChannel *channel, GIOCondition condition, struct listener_data *ifdata, int family, guint *listener_watch) @@ -3785,8 +3861,22 @@ static bool udp_listener_event(GIOChannel *channel, GIOCondition condition, err = parse_request(buf, len, query, sizeof(query)); if (err < 0 || (g_slist_length(server_list) == 0)) { +#if defined TIZEN_EXT + /** TEMP Fix + * Reason: In tizen6.0 same code working fine because it seems some delay in 6.0 platform + * where as in tizen6.5 this loop is continuously executing due to this unable to receive + * the response from telephony deamon and wpa_supplicant. To stop continuously execution + * of this code added 10ms delay. + */ + req = create_request(sk, buf, len, client_addr, + *client_addr_len, IPPROTO_UDP); + if(!req) + return true;; + g_timeout_add(10, send_response_timeout, req); +#else send_response(sk, buf, len, client_addr, *client_addr_len, IPPROTO_UDP); +#endif return true; }