code: func (h *Handle) BridgeVlanList() (map[int32][]*nl.BridgeVlanInfo, error) {
  	req := h.newNetlinkRequest(unix.RTM_GETLINK, unix.NLM_F_DUMP)
  	msg := nl.NewIfInfomsg(unix.AF_BRIDGE)
  	req.AddData(msg)
  	req.AddData(nl.NewRtAttr(unix.IFLA_EXT_MASK, nl.Uint32Attr(uint32(nl.RTEXT_FILTER_BRVLAN))))
  
  	msgs, err := req.Execute(unix.NETLINK_ROUTE, unix.RTM_NEWLINK)
  	if err != nil {
  		return nil, err
  	}
  	ret := make(map[int32][]*nl.BridgeVlanInfo)
  	for _, m := range msgs {
  		msg := nl.DeserializeIfInfomsg(m)
  
  		attrs, err := nl.ParseRouteAttr(m[msg.Len():])
  		if err != nil {
  			return nil, err
  		}
  		for _, attr := range attrs {
  			switch attr.Attr.Type {
  			case unix.IFLA_AF_SPEC:
  				//nested attr
  				nestAttrs, err := nl.ParseRouteAttr(attr.Value)
  				if err != nil {
  					return nil, fmt.Errorf("failed to parse nested attr %v", err)
  				}
  				for _, nestAttr := range nestAttrs {
  					switch nestAttr.Attr.Type {
  					case nl.IFLA_BRIDGE_VLAN_INFO:
  						vlanInfo := nl.DeserializeBridgeVlanInfo(nestAttr.Value)
  						ret[msg.Index] = append(ret[msg.Index], vlanInfo)
  					}
  				}
  			}
  		}
  	}
  	return ret, nil
  }
docs: // BridgeVlanList gets a map of device id to bridge vlan infos.
  // Equivalent to: `bridge vlan show`