code: func (proxier *Proxier) addServiceOnPortInternal(service proxy.ServicePortName, protocol v1.Protocol, proxyPort int, timeout time.Duration) (*ServiceInfo, error) {
  	sock, err := proxier.makeProxySocket(protocol, proxier.listenIP, proxyPort)
  	if err != nil {
  		return nil, err
  	}
  	_, portStr, err := net.SplitHostPort(sock.Addr().String())
  	if err != nil {
  		sock.Close()
  		return nil, err
  	}
  	portNum, err := strconv.Atoi(portStr)
  	if err != nil {
  		sock.Close()
  		return nil, err
  	}
  	si := &ServiceInfo{
  		Timeout:             timeout,
  		ActiveClients:       newClientCache(),
  		isAliveAtomic:       1,
  		proxyPort:           portNum,
  		protocol:            protocol,
  		socket:              sock,
  		sessionAffinityType: v1.ServiceAffinityNone, // default
  	}
  	proxier.serviceMap[service] = si
  
  	klog.V(2).Infof("Proxying for service %q on %s port %d", service, protocol, portNum)
  	go func(service proxy.ServicePortName, proxier *Proxier) {
  		defer runtime.HandleCrash()
  		atomic.AddInt32(&proxier.numProxyLoops, 1)
  		sock.ProxyLoop(service, si, proxier.loadBalancer)
  		atomic.AddInt32(&proxier.numProxyLoops, -1)
  	}(service, proxier)
  
  	return si, nil
  }
docs: // addServiceOnPortInternal starts listening for a new service, returning the ServiceInfo.
  // Pass proxyPort=0 to allocate a random port. The timeout only applies to UDP
  // connections, for now.