code: func LogUplinkFrameForGateways(p *redis.Pool, uplinkFrameSet gw.UplinkFrameSet) error {
  	c := p.Get()
  	defer c.Close()
  
  	c.Send("MULTI")
  	for _, rx := range uplinkFrameSet.RxInfo {
  		var id lorawan.EUI64
  		copy(id[:], rx.GatewayId)
  
  		frameLog := gw.UplinkFrameSet{
  			PhyPayload: uplinkFrameSet.PhyPayload,
  			TxInfo:     uplinkFrameSet.TxInfo,
  			RxInfo:     []*gw.UplinkRXInfo{rx},
  		}
  
  		b, err := proto.Marshal(&frameLog)
  		if err != nil {
  			return errors.Wrap(err, "marshal uplink frame-set error")
  		}
  
  		key := fmt.Sprintf(gatewayFrameLogUplinkPubSubKeyTempl, id)
  		c.Send("PUBLISH", key, b)
  	}
  	_, err := c.Do("EXEC")
  	if err != nil {
  		return errors.Wrap(err, "publish frame to gateway channel error")
  	}
  
  	return nil
  }
docs: // LogUplinkFrameForGateways logs the given frame to all the gateway pub-sub keys.