All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.ebay.jetstream.util.NetMask Maven / Gradle / Ivy

/*******************************************************************************
 *  Copyright © 2012-2015 eBay Software Foundation
 *  This program is dual licensed under the MIT and Apache 2.0 licenses.
 *  Please see LICENSE for more information.
 *******************************************************************************/
/**
 *
 */
package com.ebay.jetstream.util;

import java.net.InetAddress;
import java.util.StringTokenizer;

import com.ebay.jetstream.config.ConfigException;

public class NetMask {
  private final String m_map;
  private final byte m_baseAddr[];
  private final byte m_mask[];

  public NetMask(String map) throws ConfigException {
    int slash = map.indexOf("/");
    if (slash < 0) {
      throw new ConfigException("Invalid network specification, missing slash: " + map);
    }

    String addr = map.substring(0, slash);
    StringTokenizer toks = new StringTokenizer(addr, ".");
    int comps = toks.countTokens();
    if (comps != 4 && comps != 8) {
      throw new ConfigException("Wrong number of components for IP address: " + map);
    }

    m_map = map;
    m_baseAddr = new byte[comps];
    m_mask = new byte[comps];

    for (int c = 0; c < comps; c++) {
      m_baseAddr[c] = (byte) Integer.parseInt(toks.nextToken());
    }

    int mask = Integer.parseInt(map.substring(slash + 1));

    for (int c = 0; c < comps; c++) {
      if (mask > 8) {
        m_mask[c] = (byte) 0xff;
        mask = mask - 8;
      }
      else if (mask > 0) {
        int bit = 7;
        int m = 0;
        while (mask > 0) {
          m |= 1 << bit;
          bit -= 1;
          mask -= 1;
        }
        m_mask[c] = (byte) m;
      }
      else {
        m_mask[c] = 0;
      }
    }
  }

  public String getMask() {
    return m_map;
  }

  public boolean isWithinMask(InetAddress addr) {
    byte baddr[] = addr.getAddress();
    if (baddr.length != m_baseAddr.length) {
      // IPv4 and IPv6 not compatible
      return false;
    }

    for (int b = 0; b < m_baseAddr.length; b++) {
      int m1 = baddr[b] & m_mask[b];
      int m2 = m_baseAddr[b] & m_mask[b];
      if (m1 != m2) {
        return false;
      }
    }

    return true;
  }

  @Override
  public String toString() {
    return super.toString() + ": " + m_map;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy