14e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick/*
24e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick * Copyright (C) 2010 The Android Open Source Project
34e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick *
44e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick * Licensed under the Apache License, Version 2.0 (the "License");
54e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick * you may not use this file except in compliance with the License.
64e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick * You may obtain a copy of the License at
74e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick *
84e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick *      http://www.apache.org/licenses/LICENSE-2.0
94e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick *
104e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick * Unless required by applicable law or agreed to in writing, software
114e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick * distributed under the License is distributed on an "AS IS" BASIS,
124e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick * See the License for the specific language governing permissions and
144e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick * limitations under the License.
154e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick */
164e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick
174e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick#ifndef _DNSPROXYLISTENER_H__
184e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick#define _DNSPROXYLISTENER_H__
194e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick
204e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick#include <sysutils/FrameworkListener.h>
214e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick
224e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick#include "NetdCommand.h"
237dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen
247dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensenclass NetworkController;
254e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick
264e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrickclass DnsProxyListener : public FrameworkListener {
274e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrickpublic:
28f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran    explicit DnsProxyListener(const NetworkController* netCtrl);
294e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick    virtual ~DnsProxyListener() {}
304e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick
314e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrickprivate:
32a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak    const NetworkController *mNetCtrl;
334e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick    class GetAddrInfoCmd : public NetdCommand {
344e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick    public:
357dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen        GetAddrInfoCmd(const DnsProxyListener* dnsProxyListener);
364e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick        virtual ~GetAddrInfoCmd() {}
374e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick        int runCommand(SocketClient *c, int argc, char** argv);
38d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker    private:
397dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen        const DnsProxyListener* mDnsProxyListener;
404e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick    };
414e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick
424e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick    class GetAddrInfoHandler {
434e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick    public:
444e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick        // Note: All of host, service, and hints may be NULL
454e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick        GetAddrInfoHandler(SocketClient *c,
464e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick                           char* host,
474e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick                           char* service,
482d4610ec34cc78799a3353638fa05ee53276892aMattias Falk                           struct addrinfo* hints,
497dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen                           unsigned netId,
507dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen                           uint32_t mark);
514e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick        ~GetAddrInfoHandler();
524e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick
534e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick        static void* threadStart(void* handler);
544e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick        void start();
554e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick
564e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick    private:
574e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick        void run();
5834ffd85aed3838d53bd1136c751a7825de1940e0Brad Fitzpatrick        SocketClient* mClient;  // ref counted
594e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick        char* mHost;    // owned
604e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick        char* mService; // owned
614e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick        struct addrinfo* mHints;  // owned
62a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak        unsigned mNetId;
637dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen        uint32_t mMark;
642d4610ec34cc78799a3353638fa05ee53276892aMattias Falk    };
652d4610ec34cc78799a3353638fa05ee53276892aMattias Falk
662d4610ec34cc78799a3353638fa05ee53276892aMattias Falk    /* ------ gethostbyname ------*/
672d4610ec34cc78799a3353638fa05ee53276892aMattias Falk    class GetHostByNameCmd : public NetdCommand {
682d4610ec34cc78799a3353638fa05ee53276892aMattias Falk    public:
697dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen        GetHostByNameCmd(const DnsProxyListener* dnsProxyListener);
702d4610ec34cc78799a3353638fa05ee53276892aMattias Falk        virtual ~GetHostByNameCmd() {}
712d4610ec34cc78799a3353638fa05ee53276892aMattias Falk        int runCommand(SocketClient *c, int argc, char** argv);
72d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker    private:
737dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen        const DnsProxyListener* mDnsProxyListener;
742d4610ec34cc78799a3353638fa05ee53276892aMattias Falk    };
752d4610ec34cc78799a3353638fa05ee53276892aMattias Falk
762d4610ec34cc78799a3353638fa05ee53276892aMattias Falk    class GetHostByNameHandler {
772d4610ec34cc78799a3353638fa05ee53276892aMattias Falk    public:
782d4610ec34cc78799a3353638fa05ee53276892aMattias Falk        GetHostByNameHandler(SocketClient *c,
792d4610ec34cc78799a3353638fa05ee53276892aMattias Falk                            char *name,
80d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker                            int af,
817dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen                            unsigned netId,
827dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen                            uint32_t mark);
832d4610ec34cc78799a3353638fa05ee53276892aMattias Falk        ~GetHostByNameHandler();
842d4610ec34cc78799a3353638fa05ee53276892aMattias Falk        static void* threadStart(void* handler);
852d4610ec34cc78799a3353638fa05ee53276892aMattias Falk        void start();
862d4610ec34cc78799a3353638fa05ee53276892aMattias Falk    private:
872d4610ec34cc78799a3353638fa05ee53276892aMattias Falk        void run();
882d4610ec34cc78799a3353638fa05ee53276892aMattias Falk        SocketClient* mClient; //ref counted
892d4610ec34cc78799a3353638fa05ee53276892aMattias Falk        char* mName; // owned
902d4610ec34cc78799a3353638fa05ee53276892aMattias Falk        int mAf;
91a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak        unsigned mNetId;
927dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen        uint32_t mMark;
934e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick    };
941dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk
951dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk    /* ------ gethostbyaddr ------*/
961dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk    class GetHostByAddrCmd : public NetdCommand {
971dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk    public:
987dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen        GetHostByAddrCmd(const DnsProxyListener* dnsProxyListener);
991dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk        virtual ~GetHostByAddrCmd() {}
1001dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk        int runCommand(SocketClient *c, int argc, char** argv);
101d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker    private:
1027dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen        const DnsProxyListener* mDnsProxyListener;
1031dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk    };
1041dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk
1051dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk    class GetHostByAddrHandler {
1061dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk    public:
1071dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk        GetHostByAddrHandler(SocketClient *c,
1080475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom                            void* address,
109a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak                            int addressLen,
110a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak                            int addressFamily,
1117dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen                            unsigned netId,
1127dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen                            uint32_t mark);
1131dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk        ~GetHostByAddrHandler();
1141dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk
1151dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk        static void* threadStart(void* handler);
1161dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk        void start();
1171dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk
1181dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk    private:
1191dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk        void run();
12034ffd85aed3838d53bd1136c751a7825de1940e0Brad Fitzpatrick        SocketClient* mClient;  // ref counted
1210475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom        void* mAddress;    // address to lookup; owned
122a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak        int mAddressLen; // length of address to look up
123a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak        int mAddressFamily;  // address family
124a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak        unsigned mNetId;
1257dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen        uint32_t mMark;
1261dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk    };
1274e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick};
1284e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick
1294e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick#endif
130