code: func (r ribout) update(p *table.Path) bool {
  	key := p.GetNlri().String() // TODO expose (*Path).getPrefix()
  	l := r[key]
  	if p.IsWithdraw {
  		if len(l) == 0 {
  			return false
  		}
  		n := make([]*table.Path, 0, len(l))
  		for _, q := range l {
  			if p.GetSource() == q.GetSource() {
  				continue
  			}
  			n = append(n, q)
  		}
  		if len(n) == 0 {
  			delete(r, key)
  		} else {
  			r[key] = n
  		}
  		return true
  	}
  
  	if len(l) == 0 {
  		r[key] = []*table.Path{p}
  		return true
  	}
  
  	doAppend := true
  	for idx, q := range l {
  		if p.GetSource() == q.GetSource() {
  			// if we have sent the same path, don't send it again
  			if p.Equal(q) {
  				return false
  			}
  			l[idx] = p
  			doAppend = false
  		}
  	}
  	if doAppend {
  		r[key] = append(r[key], p)
  	}
  	return true
  }
docs: // return true if we need to send the path to the BMP server