1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <errno.h> 18 #include <sys/socket.h> 19 #include <netinet/in.h> 20 #include <arpa/inet.h> 21 22 #define LOG_TAG "DhcpListener" 23 #include <cutils/log.h> 24 25 #include <DhcpListener.h> 26 #include "IDhcpEventHandlers.h" 27 #include "DhcpState.h" 28 #include "DhcpEvent.h" 29 #include "Controller.h" 30 31 DhcpListener::DhcpListener(Controller *c, int socket, IDhcpEventHandlers *handlers) : 32 SocketListener(socket, false) { 33 mHandlers = handlers; 34 mController = c; 35 } 36 37 DhcpListener::~DhcpListener() { 38 } 39 40 bool DhcpListener::onDataAvailable(SocketClient *cli) { 41 char buffer[255]; 42 int rc; 43 44 if ((rc = read(cli->getSocket(), buffer, sizeof(buffer))) < 0) { 45 LOGW("Error reading dhcp status msg (%s)", strerror(errno)); 46 return true; 47 } 48 49 if (!strncmp(buffer, "STATE:", 6)) { 50 char *next = buffer; 51 char *tmp; 52 int i; 53 54 for (i = 0; i < 2; i++) { 55 if (!(tmp = strsep(&next, ":"))) { 56 LOGW("Error parsing state '%s'", buffer); 57 return true; 58 } 59 } 60 61 int st = DhcpState::parseString(tmp); 62 mHandlers->onDhcpStateChanged(mController, st); 63 } else if (!strncmp(buffer, "ADDRINFO:", 9)) { 64 char *next = buffer + 9; 65 struct in_addr ipaddr, netmask, gateway, broadcast, dns1, dns2; 66 67 if (!inet_aton(strsep(&next, ":"), &ipaddr)) { 68 LOGW("Malformatted IP specified"); 69 } 70 if (!inet_aton(strsep(&next, ":"), &netmask)) { 71 LOGW("Malformatted netmask specified"); 72 } 73 if (!inet_aton(strsep(&next, ":"), &broadcast)) { 74 LOGW("Malformatted broadcast specified"); 75 } 76 if (!inet_aton(strsep(&next, ":"), &gateway)) { 77 LOGW("Malformatted gateway specified"); 78 } 79 if (!inet_aton(strsep(&next, ":"), &dns1)) { 80 LOGW("Malformatted dns1 specified"); 81 } 82 if (!inet_aton(strsep(&next, ":"), &dns2)) { 83 LOGW("Malformatted dns2 specified"); 84 } 85 mHandlers->onDhcpLeaseUpdated(mController, &ipaddr, &netmask, 86 &broadcast, &gateway, &dns1, &dns2); 87 88 } else if (!strncmp(buffer, "EVENT:", 6)) { 89 char *next = buffer; 90 char *tmp; 91 int i; 92 93 for (i = 0; i < 2; i++) { 94 if (!(tmp = strsep(&next, ":"))) { 95 LOGW("Error parsing event '%s'", buffer); 96 return true; 97 } 98 } 99 100 int ev = DhcpEvent::parseString(tmp); 101 mHandlers->onDhcpEvent(mController, ev); 102 103 } else { 104 LOGW("Unknown DHCP monitor msg '%s'", buffer); 105 } 106 107 return true; 108 } 109