NetlinkHandler.cpp revision 67c5753274ee828b56f96b5e9cdae64c8562ad52
1932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines/*
2cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines * Copyright (C) 2008 The Android Open Source Project
3932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines *
4932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
5932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * you may not use this file except in compliance with the License.
6932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * You may obtain a copy of the License at
7932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines *
8932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines *      http://www.apache.org/licenses/LICENSE-2.0
9932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines *
10932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Unless required by applicable law or agreed to in writing, software
11932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
12932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * See the License for the specific language governing permissions and
14932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * limitations under the License.
15932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */
16932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
17932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <stdio.h>
1804261e0bf97b15033efd697bd0e4cfbae7107f4bStephen Hines#include <stdlib.h>
19932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <errno.h>
20932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
21e126b62760b4bf115cfed162f0234e4e722011dfStephen Hines#define LOG_TAG "Netd"
22e126b62760b4bf115cfed162f0234e4e722011dfStephen Hines
23e126b62760b4bf115cfed162f0234e4e722011dfStephen Hines#include <cutils/log.h>
24e126b62760b4bf115cfed162f0234e4e722011dfStephen Hines
25e126b62760b4bf115cfed162f0234e4e722011dfStephen Hines#include <sysutils/NetlinkEvent.h>
26e126b62760b4bf115cfed162f0234e4e722011dfStephen Hines#include "NetlinkHandler.h"
27e126b62760b4bf115cfed162f0234e4e722011dfStephen Hines#include "NetlinkManager.h"
28e126b62760b4bf115cfed162f0234e4e722011dfStephen Hines#include "ResponseCode.h"
29e126b62760b4bf115cfed162f0234e4e722011dfStephen Hines
30e126b62760b4bf115cfed162f0234e4e722011dfStephen HinesNetlinkHandler::NetlinkHandler(NetlinkManager *nm, int listenerSocket) :
31932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines                NetlinkListener(listenerSocket) {
32932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    mNm = nm;
33932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}
34932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
35932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen HinesNetlinkHandler::~NetlinkHandler() {
36932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}
37932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
38932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesint NetlinkHandler::start() {
39932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    return this->startListener();
40932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}
41932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
42932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesint NetlinkHandler::stop() {
43932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    return this->stopListener();
44932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}
45932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
46e126b62760b4bf115cfed162f0234e4e722011dfStephen Hinesvoid NetlinkHandler::onEvent(NetlinkEvent *evt) {
47932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    const char *subsys = evt->getSubsystem();
48932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    if (!subsys) {
49932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines        LOGW("No subsystem found in netlink event");
50932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines        return;
51932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    }
52e126b62760b4bf115cfed162f0234e4e722011dfStephen Hines    if (!strcmp(subsys, "net")) {
53e126b62760b4bf115cfed162f0234e4e722011dfStephen Hines        int action = evt->getAction();
543ffc8330d765599e357197883f72c01bd43837c8Stephen Hines        if (action == evt->NlActionAdd) {
55932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines            const char *iface = evt->findParam("INTERFACE");
56932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines            notifyInterfaceAdded(iface);
57932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines        } else if (action == evt->NlActionRemove) {
58932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines            const char *iface = evt->findParam("INTERFACE");
5904261e0bf97b15033efd697bd0e4cfbae7107f4bStephen Hines            notifyInterfaceRemoved(iface);
603ffc8330d765599e357197883f72c01bd43837c8Stephen Hines        } else if (action == evt->NlActionChange) {
613ffc8330d765599e357197883f72c01bd43837c8Stephen Hines            evt->dump();
62932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines            const char *iface = evt->findParam("INTERFACE");
63932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines            notifyInterfaceChanged("nana", true);
64932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines        }
653ffc8330d765599e357197883f72c01bd43837c8Stephen Hines    }
66932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}
67932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
68932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesvoid NetlinkHandler::notifyInterfaceAdded(const char *name) {
69932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    char msg[255];
70932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    snprintf(msg, sizeof(msg), "Iface added %s", name);
71932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
72932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    mNm->getBroadcaster()->sendBroadcast(ResponseCode::InterfaceChange,
73932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines            msg, false);
7404261e0bf97b15033efd697bd0e4cfbae7107f4bStephen Hines}
75932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
76932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesvoid NetlinkHandler::notifyInterfaceRemoved(const char *name) {
773ffc8330d765599e357197883f72c01bd43837c8Stephen Hines    char msg[255];
783ffc8330d765599e357197883f72c01bd43837c8Stephen Hines    snprintf(msg, sizeof(msg), "Iface removed %s", name);
793ffc8330d765599e357197883f72c01bd43837c8Stephen Hines
803ffc8330d765599e357197883f72c01bd43837c8Stephen Hines    mNm->getBroadcaster()->sendBroadcast(ResponseCode::InterfaceChange,
813ffc8330d765599e357197883f72c01bd43837c8Stephen Hines            msg, false);
823ffc8330d765599e357197883f72c01bd43837c8Stephen Hines}
833ffc8330d765599e357197883f72c01bd43837c8Stephen Hines
843ffc8330d765599e357197883f72c01bd43837c8Stephen Hinesvoid NetlinkHandler::notifyInterfaceChanged(const char *name, bool isUp) {
853ffc8330d765599e357197883f72c01bd43837c8Stephen Hines    char msg[255];
863ffc8330d765599e357197883f72c01bd43837c8Stephen Hines    snprintf(msg, sizeof(msg), "Iface is %s %s", (isUp ? "up" : "down"), name);
87932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
88932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    mNm->getBroadcaster()->sendBroadcast(ResponseCode::InterfaceChange,
89932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines            msg, false);
90932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}
91932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines