Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c2cdb2c7 authored by Frank Li's avatar Frank Li Committed by Automerger Merge Worker
Browse files

Fix NullPointerException on addErrorCode when input is Invalid error code am: ad90e1bf

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/modules/NetworkStack/+/11987398

Change-Id: I78c4025468341c9a515bcedd83cf19ea6795e283
parents 4a61b59c ad90e1bf
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -120,12 +120,21 @@ public class IpProvisioningMetrics {
                transSuccess ? HostnameTransResult.HTR_SUCCESS : HostnameTransResult.HTR_FAILURE);
    }

    private static DhcpErrorCode dhcpErrorFromNumberSafe(int number) {
        // See DhcpErrorCode.errorCodeWithOption
        // TODO: add a DhcpErrorCode method to extract the code;
        //       or replace legacy error codes with the new metrics.
        final DhcpErrorCode error = DhcpErrorCode.forNumber(number & 0xFFFF0000);
        if (error == null) return DhcpErrorCode.ET_UNKNOWN;
        return error;
    }

    /**
     * write the DHCP error code into DhcpSession.
     */
    public void addDhcpErrorCode(final int errorCode) {
        if (mDhcpSessionBuilder.getErrorCodeCount() >= MAX_DHCP_ERROR_COUNT) return;
        mDhcpSessionBuilder.addErrorCode(DhcpErrorCode.forNumber(errorCode));
        mDhcpSessionBuilder.addErrorCode(dhcpErrorFromNumberSafe(errorCode));
    }

    /**
+14 −14
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.networkstack.metrics;

import android.net.dhcp.DhcpPacket;
import android.net.metrics.DhcpErrorEvent;
import android.stats.connectivity.DhcpErrorCode;
import android.stats.connectivity.DhcpFeature;
@@ -64,25 +65,24 @@ public class NetworkIpProvisioningMetricsTest {
        final NetworkIpProvisioningReported mStats;
        final IpProvisioningMetrics mMetrics = new IpProvisioningMetrics();
        mMetrics.reset();
        mMetrics.addDhcpErrorCode(DhcpErrorEvent.DHCP_ERROR);
        mMetrics.addDhcpErrorCode(DhcpErrorEvent.L2_WRONG_ETH_TYPE);
        mMetrics.addDhcpErrorCode(DhcpErrorEvent.L3_INVALID_IP);
        mMetrics.addDhcpErrorCode(DhcpErrorEvent.L4_WRONG_PORT);
        mMetrics.addDhcpErrorCode(DhcpErrorEvent.BOOTP_TOO_SHORT);
        mMetrics.addDhcpErrorCode(DhcpErrorEvent.DHCP_NO_COOKIE);
        mMetrics.addDhcpErrorCode(DhcpErrorEvent.errorCodeWithOption(
                DhcpErrorEvent.BUFFER_UNDERFLOW, DhcpPacket.DHCP_HOST_NAME));
        // Write the incorrect input number 50000 as DHCP error number
        int incorrectErrorCodeNumber = 50000;
        mMetrics.addDhcpErrorCode(incorrectErrorCodeNumber);
        for (int i = 0; i < mMetrics.MAX_DHCP_ERROR_COUNT; i++) {
            mMetrics.addDhcpErrorCode(DhcpErrorEvent.PARSING_ERROR);
        }
        mStats = mMetrics.statsWrite();
        assertEquals(DhcpErrorCode.ET_DHCP_ERROR, mStats.getDhcpSession().getErrorCode(0));
        assertEquals(DhcpErrorCode.ET_L2_WRONG_ETH_TYPE, mStats.getDhcpSession().getErrorCode(1));
        assertEquals(DhcpErrorCode.ET_L3_INVALID_IP, mStats.getDhcpSession().getErrorCode(2));
        assertEquals(DhcpErrorCode.ET_L4_WRONG_PORT, mStats.getDhcpSession().getErrorCode(3));
        assertEquals(DhcpErrorCode.ET_BOOTP_TOO_SHORT, mStats.getDhcpSession().getErrorCode(4));
        assertEquals(DhcpErrorCode.ET_DHCP_NO_COOKIE, mStats.getDhcpSession().getErrorCode(5));
        // Check can record the same error code
        assertEquals(DhcpErrorCode.ET_PARSING_ERROR, mStats.getDhcpSession().getErrorCode(6));
        assertEquals(DhcpErrorCode.ET_PARSING_ERROR, mStats.getDhcpSession().getErrorCode(6));
        assertEquals(DhcpErrorCode.ET_BOOTP_TOO_SHORT, mStats.getDhcpSession().getErrorCode(0));
        assertEquals(DhcpErrorCode.ET_BUFFER_UNDERFLOW, mStats.getDhcpSession().getErrorCode(1));
        // When the input is an invalid integer value (such as incorrectErrorCodeNumber),
        // the DhcpErrorCode will be ET_UNKNOWN
        assertEquals(DhcpErrorCode.ET_UNKNOWN, mStats.getDhcpSession().getErrorCode(2));
        // If the same error code appears, it must be recorded
        assertEquals(DhcpErrorCode.ET_PARSING_ERROR, mStats.getDhcpSession().getErrorCode(3));
        assertEquals(DhcpErrorCode.ET_PARSING_ERROR, mStats.getDhcpSession().getErrorCode(4));
        // The maximum number of DHCP error code counts is MAX_DHCP_ERROR_COUNT
        assertEquals(mMetrics.MAX_DHCP_ERROR_COUNT, mStats.getDhcpSession().getErrorCodeCount());
    }