code: func (c *Conn) recombine() error {
  	pkt, ok := <-c.chInPkt
  	if !ok {
  		return io.EOF
  	}
  
  	p := pdu(pkt.data())
  
  	// Currently, check for LE-U only. For channels that we don't recognizes,
  	// re-combine them anyway, and discard them later when we dispatch the PDU
  	// according to CID.
  	if p.cid() == cidLEAtt && p.dlen() > c.rxMPS {
  		return fmt.Errorf("fragment size (%d) larger than rxMPS (%d)", p.dlen(), c.rxMPS)
  	}
  
  	// If this pkt is not a complete PDU, and we'll be receiving more
  	// fragments, re-allocate the whole PDU (including Header).
  	if len(p.payload()) < p.dlen() {
  		p = make([]byte, 0, 4+p.dlen())
  		p = append(p, pdu(pkt.data())...)
  	}
  	for len(p) < 4+p.dlen() {
  		if pkt, ok = <-c.chInPkt; !ok || (pkt.pbf()&pbfContinuing) == 0 {
  			return io.ErrUnexpectedEOF
  		}
  		p = append(p, pdu(pkt.data())...)
  	}
  
  	// TODO: support dynamic or assigned channels for LE-Frames.
  	switch p.cid() {
  	case cidLEAtt:
  		c.chInPDU <- p
  	case cidLESignal:
  		c.handleSignal(p)
  	case cidSMP:
  		c.handleSMP(p)
  	default:
  		logger.Info("recombine()", "unrecognized CID", fmt.Sprintf("%04X, [%X]", p.cid(), p))
  	}
  	return nil
  }
docs: // Recombines fragments into a L2CAP PDU. [Vol 3, Part A, 7.2.2]