code: func structMaxAttrID(v reflect.Value) (uint16, error) {
  	if v.Kind() != reflect.Struct {
  		return 0, fmt.Errorf("%v is not a struct", v.Type())
  	}
  	st := v.Type()
  
  	var maxAttrID uint16
  	for i := 0; i < st.NumField(); i++ {
  		ft, fv := st.Field(i), v.Field(i)
  		fp, err := parseFieldParams(ft.Tag.Get("netlink"))
  		if err != nil {
  			return 0, err
  		}
  		if fp != nil && fp.attr > maxAttrID {
  			maxAttrID = fp.attr
  		}
  		if fp == nil && fv.Kind() == reflect.Struct {
  			attrID, err := structMaxAttrID(fv)
  			if err != nil {
  				return 0, err
  			}
  			if attrID > maxAttrID {
  				maxAttrID = attrID
  			}
  		}
  	}
  	return maxAttrID, nil
  }
docs: // structMaxAttrID returns the maximum attribute ID found on netlink tagged
  // fields within the given struct and any untagged structs it contains.