code: func (c *Conn) Signal(req Signal, rsp Signal) error {
  	data := req.Marshal()
  	buf := bytes.NewBuffer(make([]byte, 0))
  	binary.Write(buf, binary.LittleEndian, uint16(4+len(data)))
  	binary.Write(buf, binary.LittleEndian, uint16(cidLESignal))
  
  	binary.Write(buf, binary.LittleEndian, uint8(req.Code()))
  	binary.Write(buf, binary.LittleEndian, uint8(c.sigID))
  	binary.Write(buf, binary.LittleEndian, uint16(len(data)))
  	binary.Write(buf, binary.LittleEndian, data)
  
  	c.sigSent = make(chan []byte)
  	defer close(c.sigSent)
  	if _, err := c.writePDU(buf.Bytes()); err != nil {
  		return err
  	}
  	var s sigCmd
  	select {
  	case s = <-c.sigSent:
  	case <-time.After(time.Second):
  		// TODO: Find the proper timed out defined in spec, if any.
  		return errors.New("signaling request timed out")
  	}
  
  	if s.code() != req.Code() {
  		return errors.New("mismatched signaling response")
  	}
  	if s.id() != c.sigID {
  		return errors.New("mismatched signaling id")
  	}
  	c.sigID++
  	if rsp == nil {
  		return nil
  	}
  	return rsp.Unmarshal(s.data())
  }
docs: // Signal ...