public SnmpTable getTable(OID root, List<OID> cols)
			throws IOException {
		SnmpTable table = new SnmpTable();
		if (cols == null || cols.isEmpty()) {
			return table;
		}
		for (OID col : cols) {
			table.addCol(col);
		}

		initLL(PDU.GETBULK);
		ll.setOperation(SnmpLL.TABLE);
		for (OID col : table.getCols()) {
			ll.addVb(new org.snmp4j.smi.OID(col.toString()));
		}

		org.snmp4j.smi.OID rootOid = new org.snmp4j.smi.OID(root.toString());
		boolean comeOut = false;
		while (!comeOut) {
			PDU response = ll.send();
			if (response.getErrorStatus() != org.snmp4j.mp.SnmpConstants.SNMP_ERROR_SUCCESS) {
				comeOut = true;
				break;
			}

			ll.clearVbs();
			for (VariableBinding vb : response.getVariableBindings()) {
				if (!vb.getOid().startsWith(rootOid)) {
					comeOut = true;
					break;
				}
				ll.addVb(vb.getOid());
				table.addValue(toVarBind(vb));
			}
		}

		return table;
	}