loc_database_unref;
# Network
+ loc_network_get_asn;
loc_network_get_country_code;
loc_network_new;
loc_network_new_from_string;
+ loc_network_set_asn;
loc_network_set_country_code;
loc_network_str;
loc_network_unref;
const char* loc_network_get_country_code(struct loc_network* network);
int loc_network_set_country_code(struct loc_network* network, const char* country_code);
+uint32_t loc_network_get_asn(struct loc_network* network);
+int loc_network_set_asn(struct loc_network* network, uint32_t asn);
+
int loc_network_to_database_v0(struct loc_network* network, struct loc_database_network_v0* dbobj);
struct loc_network_tree;
#include <assert.h>
#include <endian.h>
#include <errno.h>
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <loc/libloc.h>
-#include <loc/as.h>
#include <loc/network.h>
#include <loc/private.h>
unsigned int prefix;
char country_code[3];
-
- struct loc_as* as;
+ uint32_t asn;
};
LOC_EXPORT int loc_network_new(struct loc_ctx* ctx, struct loc_network** network,
static void loc_network_free(struct loc_network* network) {
DEBUG(network->ctx, "Releasing network at %p\n", network);
- if (network->as)
- loc_as_unref(network->as);
-
loc_unref(network->ctx);
free(network);
}
return 0;
}
+LOC_EXPORT uint32_t loc_network_get_asn(struct loc_network* network) {
+ return network->asn;
+}
+
+LOC_EXPORT int loc_network_set_asn(struct loc_network* network, uint32_t asn) {
+ network->asn = asn;
+
+ return 0;
+}
+
LOC_EXPORT int loc_network_to_database_v0(struct loc_network* network, struct loc_database_network_v0* dbobj) {
dbobj->prefix = htobe16(network->prefix);
}
// Add ASN
- uint32_t asn = 0;
- if (network->as) {
- asn = loc_as_get_number(network->as);
- }
- dbobj->asn = htobe32(asn);
+ dbobj->asn = htobe32(network->asn);
return 0;
}
return 0;
}
+static PyObject* Network_get_asn(NetworkObject* self) {
+ uint32_t asn = loc_network_get_asn(self->network);
+
+ if (asn)
+ return PyLong_FromLong(asn);
+
+ Py_RETURN_NONE;
+}
+
+static int Network_set_asn(NetworkObject* self, PyObject* value) {
+ long int asn = PyLong_AsLong(value);
+
+ // Check if the ASN is within the valid range
+ if (asn <= 0 || asn > UINT32_MAX) {
+ PyErr_Format(PyExc_ValueError, "Invalid ASN %ld", asn);
+ return -1;
+ }
+
+ int r = loc_network_set_asn(self->network, asn);
+ if (r)
+ return -1;
+
+ return 0;
+}
+
static struct PyGetSetDef Network_getsetters[] = {
+ {
+ "asn",
+ (getter)Network_get_asn,
+ (setter)Network_set_asn,
+ NULL,
+ NULL,
+ },
{
"country_code",
(getter)Network_get_country_code,