code: func (n *upnpNAT) AddPortMapping(protocol string, externalPort, internalPort int, description string, timeout int) (mappedExternalPort int, err error) {
  	// A single concatenation would break ARM compilation.
  	message := "<u:AddPortMapping xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\">\r\n" +
  		"<NewRemoteHost></NewRemoteHost><NewExternalPort>" + strconv.Itoa(externalPort)
  	message += "</NewExternalPort><NewProtocol>" + strings.ToUpper(protocol) + "</NewProtocol>"
  	message += "<NewInternalPort>" + strconv.Itoa(internalPort) + "</NewInternalPort>" +
  		"<NewInternalClient>" + n.ourIP + "</NewInternalClient>" +
  		"<NewEnabled>1</NewEnabled><NewPortMappingDescription>"
  	message += description +
  		"</NewPortMappingDescription><NewLeaseDuration>" + strconv.Itoa(timeout) +
  		"</NewLeaseDuration></u:AddPortMapping>"
  
  	response, err := soapRequest(n.serviceURL, "AddPortMapping", message)
  	if err != nil {
  		return
  	}
  
  	// TODO: check response to see if the port was forwarded
  	// If the port was not wildcard we don't get an reply with the port in
  	// it. Not sure about wildcard yet. miniupnpc just checks for error
  	// codes here.
  	mappedExternalPort = externalPort
  	_ = response
  	return
  }
docs: // AddPortMapping implements the NAT interface by setting up a port forwarding
  // from the UPnP router to the local machine with the given ports and protocol.