Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 12|回复: 12
打印 上一主题 下一主题

再次追踪RJ45插入流程

[复制链接]

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
跳转到指定楼层
楼主
发表于 2016-4-11 13:11:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
        public void run() {
            //noinspection InfiniteLoopStatement
            for (;;) {
                int index;
                int i;
                int cmd;
                String dev;

                if (localLOGV) Slog.v(TAG, "zcfdebug go poll events");

                String eventName = EthernetNative.waitForEvent();

                if (eventName == null) {
                    if (localLOGV) Slog.v(TAG, "zcfdebug no ethernet monitor events");
                    continue;
                }

                if (localLOGV) Slog.v(TAG, "zcfdebug get event " + eventName);

                /*
                 * Map event name into event enum
                 */
                 if (eventName.length()==0) {
                    EthUeventFail=true;
                    Slog.v(TAG, "the eventName length is " + eventName.length());
                }
                i = 0;
                while (i < eventName.length()) {
                    index = eventName.substring(i).indexOf(":");
                    if (index == -1)
                        break;
                    dev = eventName.substring(i, index);
                    i += index + 1;
                    index = eventName.substring(i).indexOf(":");
                    if (index == -1)
                        break;
                    cmd = Integer.parseInt(eventName.substring(i, i+index));
                    i += index + 1;
                    if (localLOGV) Slog.v(TAG, "zcfdebug dev: " + dev + " ev " + cmd);
                    switch (cmd) {
                        case DEL_LINK:
                            handleEvent(dev, DISCONNECTED);
                            break;
                        case ADD_ADDR:
                            handleEvent(dev, CONNECTED);
                            break;
                        case NEW_LINK:
                            handleEvent(dev, PHYUP);
                            break;
                    }
                }

            }
        }


回复

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
沙发
 楼主| 发表于 2016-4-11 13:21:44 | 只看该作者
本帖最后由 zangcf 于 2016-4-11 13:22 编辑

        void handleEvent(String ifname,int event) {
            switch (event) {
                case DISCONNECTED:
                    Log.e("zcfdebug","DISCONNECTED in EthernetMonitor");//zcfdebug++
                    mTracker.notifyStateChange(ifname,NetworkInfo.DetailedState.DISCONNECTED);
                    break;
                case CONNECTED:
                    Log.e("zcfdebug","CONNECTED in EthernetMonitor");//zcfdebug++
                    mTracker.notifyStateChange(ifname,NetworkInfo.DetailedState.CONNECTED);
                    break;
                case PHYUP:
                    Log.e("zcfdebug","PHYUP in EthernetMonitor");//zcfdebug++
                    mTracker.notifyPhyConnected(ifname);
                    mTracker.notifyStateChange(ifname,NetworkInfo.DetailedState.CONNECTED); //zcfdebug++
                    break;
                default:
                    Log.e("zcfdebug","default in EthernetMonitor");//zcfdebug++
                    mTracker.notifyStateChange(ifname,NetworkInfo.DetailedState.FAILED);
                    break;
            }
        }

这里面与其他地方不同是走了两个通知
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
板凳
 楼主| 发表于 2016-4-11 13:23:59 | 只看该作者
    public void notifyPhyConnected(String ifname) {
        if (localLOGV) Slog.v(TAG, "report interface is up for " + ifname);
        synchronized(this) {
            this.sendEmptyMessage(EVENT_HW_PHYCONNECTED);
        }
    }
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
地板
 楼主| 发表于 2016-4-11 13:24:59 | 只看该作者
            case EVENT_HW_PHYCONNECTED:
                if (localLOGV) Slog.i(TAG, "interface up event, kick off connection request");
                if (!mStartingDhcp) {
                    int state = mEM.getState();
                    if (state != mEM.ETHERNET_STATE_DISABLED) {
                        EthernetDevInfo info = mEM.getSavedConfig();
                        if (info != null && mEM.isConfigured()) {
                            try {
                               configureInterface(info);
                            } catch (UnknownHostException e) {
                                 // TODO Auto-generated catch block
                                 //e.printStackTrace();
                                 Slog.e(TAG, "Cannot configure interface");
                            }
                        }
                    }
                }
                break;
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
5#
 楼主| 发表于 2016-4-11 15:05:32 | 只看该作者
以上部分log如下:
V/zcfdebug EthernetStateTracker(  460): report interface is up for eth0
E/zcfdebug EthernetStateTracker(  460): notifyStateChange in EthernetStateTracker!
I/zcfdebug EthernetStateTracker(  460): interface up event, kick off connection request
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
6#
 楼主| 发表于 2016-4-11 15:11:47 | 只看该作者
本帖最后由 zangcf 于 2016-4-11 15:24 编辑

后面奇怪了,configureInterface怎么没有打印出来任何信息呢?
如果这样将这个通知几乎没有做任何工作。
-----------------------------------
主要就是trigger DHCP!
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
7#
 楼主| 发表于 2016-4-11 15:18:56 | 只看该作者
下面追踪:
mTracker.notifyStateChange(ifname,NetworkInfo.DetailedState.CONNECTED);
----------------------------------------------------------------
    public void notifyStateChange(String ifname,DetailedState state) {
        Log.e(TAG,"notifyStateChange in EthernetStateTracker!");
        if(state.equals(DetailedState.CONNECTED)){
            Log.e(TAG,"Ethernet connected in EthernetStateTracker!");
        }else
        {
            Log.e(TAG,"Ethernet disconnected in EthernetStateTracker!");        
            setState(mHWConnected = false, EVENT_HW_DISCONNECTED);    //zcfdebug++20150508
        }
        if (localLOGV) Slog.i(TAG, "zcfdebug report new state " + state.toString() + " on dev " + ifname);
        if (ifname.equals(mInterfaceName)) {
            if (localLOGV) Slog.v(TAG, "zcfdebug update network state tracker");
            synchronized(this) {
                this.sendEmptyMessage(state.equals(DetailedState.CONNECTED)
                    ? EVENT_HW_CONNECTED : EVENT_HW_DISCONNECTED);
            }
        }
    }

回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
8#
 楼主| 发表于 2016-4-11 15:19:59 | 只看该作者
            case EVENT_HW_CONNECTED:
                if (localLOGV) Slog.i(TAG, "zcfdebug received HW connected, stack=" + mStackConnected + " HW=" + mHWConnected);
                mHWConnected = true;
                mStackConnected = true; //zcfdebug++
                if (mStackConnected)
                   setState(true, msg.what);
                break;


回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
9#
 楼主| 发表于 2016-4-11 15:25:49 | 只看该作者
本帖最后由 zangcf 于 2016-4-11 15:28 编辑

    private void setState(boolean state, int event) {
            Log.e(TAG,"in setState program!");
        if (mNetworkInfo.isConnected() != state) {
            if (state) {
                mNetworkInfo.setDetailedState(DetailedState.CONNECTED, null, null);
                mNetworkInfo.setIsAvailable(true);    //zcfdebug++20150510
                Log.e(TAG,"Ethernet connect in EthernetStateTracker!");
            } else {
                mNetworkInfo.setDetailedState(DetailedState.DISCONNECTED, null, null);
                stopInterface(true);
                Log.e(TAG,"Ethernet disconnect in EthernetStateTracker!");
            }
            mNetworkInfo.setIsAvailable(state);
            postNotification(event);
        }
    }
////////////////////////
这段代码中间有废的代码

回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
10#
 楼主| 发表于 2016-4-11 15:28:24 | 只看该作者
本帖最后由 zangcf 于 2016-4-11 16:16 编辑

    private void postNotification(int event) {
        //zcfdebug-- Message msg = mCsHandler.obtainMessage(EVENT_STATE_CHANGED, new NetworkInfo(mNetworkInfo));
//zcfdebug++<<
        Message msg = mCsHandler.obtainMessage(EVENT_CONFIGURATION_CHANGED, mNetworkInfo);
        msg.sendToTarget();

        msg = mCsHandler.obtainMessage(EVENT_STATE_CHANGED, mNetworkInfo);
                Slog.d(TAG, "Send Message to EVENT_STATE_CHANGED");
//zcfdebug>>++
        msg.sendToTarget();
    }
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Comsenz Inc.

GMT+8, 2025-12-15 02:05 , Processed in 0.015271 second(s), 7 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表