code: func (v *vserver) expandFWMServices() map[serviceKey]*service {
  	svcs := make(map[serviceKey]*service)
  	for _, af := range seesaw.AFs() {
  		var ip net.IP
  		switch af {
  		case seesaw.IPv4:
  			ip = v.config.Host.IPv4Addr
  		case seesaw.IPv6:
  			ip = v.config.Host.IPv6Addr
  		}
  		if ip == nil {
  			continue
  		}
  
  		// Persistence, etc., is stored in the VserverEntry. For FWM services, these
  		// values must be the same for all VserverEntries, so just use the first
  		// one.
  		var ventry *config.VserverEntry
  		for _, entry := range v.config.Entries {
  			ventry = entry
  			break
  		}
  
  		if v.fwm[af] == 0 {
  			mark, err := v.engine.fwmAlloc.get()
  			if err != nil {
  				log.Fatalf("%v: failed to get mark: %v", v, err)
  			}
  			v.fwm[af] = mark
  		}
  		svc := &service{
  			serviceKey: serviceKey{
  				af:  af,
  				fwm: v.fwm[af],
  			},
  			ip:      seesaw.NewIP(ip),
  			ventry:  ventry,
  			vserver: v,
  			stats:   &seesaw.ServiceStats{},
  		}
  		svc.ipvsSvc = svc.ipvsService()
  		svcs[svc.serviceKey] = svc
  	}
  	return svcs
  }
docs: // expandFWMServices returns a list of services that have been expanded from the
  // vserver configuration for a firewall mark based vserver.