aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2022-05-11 23:26:32 +0000
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2022-05-11 23:26:32 +0000
commit3ee97215ab2479e998071d7b4d1911de794a3107 (patch)
treec1fac420594b03065160abfcdde310daf83271b6
parenta4434c81a357f2078469572ef7a66ee4c2e18f13 (diff)
parenta3efc04dbeee57a6857adf7597bdb7f1c44fb288 (diff)
downloadslirp-3ee97215ab2479e998071d7b4d1911de794a3107.zip
slirp-3ee97215ab2479e998071d7b4d1911de794a3107.tar.gz
slirp-3ee97215ab2479e998071d7b4d1911de794a3107.tar.bz2
Merge branch 'iana' into 'master'
ncsi: Add basic Get Version ID response See merge request slirp/libslirp!122
-rw-r--r--src/libslirp.h6
-rw-r--r--src/ncsi.c23
-rw-r--r--src/slirp.c6
-rw-r--r--src/slirp.h2
4 files changed, 30 insertions, 7 deletions
diff --git a/src/libslirp.h b/src/libslirp.h
index 77396f0..35ddab6 100644
--- a/src/libslirp.h
+++ b/src/libslirp.h
@@ -90,7 +90,7 @@ typedef struct SlirpCb {
} SlirpCb;
#define SLIRP_CONFIG_VERSION_MIN 1
-#define SLIRP_CONFIG_VERSION_MAX 4
+#define SLIRP_CONFIG_VERSION_MAX 5
typedef struct SlirpConfig {
/* Version must be provided */
@@ -140,6 +140,10 @@ typedef struct SlirpConfig {
* Fields introduced in SlirpConfig version 4 begin
*/
bool disable_dhcp; /* slirp will not reply to any DHCP requests */
+ /*
+ * Fields introduced in SlirpConfig version 5 begin
+ */
+ uint32_t mfr_id; /* Manufacturer ID (IANA Private Enterprise number) */
} SlirpConfig;
/* Create a new instance of a slirp stack */
diff --git a/src/ncsi.c b/src/ncsi.c
index f3427bd..5bf731b 100644
--- a/src/ncsi.c
+++ b/src/ncsi.c
@@ -55,8 +55,19 @@ static uint32_t ncsi_calculate_checksum(uint8_t *data, int len)
return checksum;
}
+/* Get Version ID */
+static int ncsi_rsp_handler_gvi(Slirp *slirp, struct ncsi_rsp_pkt_hdr *rnh)
+{
+ struct ncsi_rsp_gvi_pkt *rsp = (struct ncsi_rsp_gvi_pkt *)rnh;
+
+ rsp->ncsi_version = htonl(0xF1F0F000);
+ rsp->mf_id = htonl(slirp->mfr_id);
+
+ return 0;
+}
+
/* Get Capabilities */
-static int ncsi_rsp_handler_gc(struct ncsi_rsp_pkt_hdr *rnh)
+static int ncsi_rsp_handler_gc(Slirp *slirp, struct ncsi_rsp_pkt_hdr *rnh)
{
struct ncsi_rsp_gc_pkt *rsp = (struct ncsi_rsp_gc_pkt *)rnh;
@@ -71,7 +82,7 @@ static int ncsi_rsp_handler_gc(struct ncsi_rsp_pkt_hdr *rnh)
}
/* Get Link status */
-static int ncsi_rsp_handler_gls(struct ncsi_rsp_pkt_hdr *rnh)
+static int ncsi_rsp_handler_gls(Slirp *slirp, struct ncsi_rsp_pkt_hdr *rnh)
{
struct ncsi_rsp_gls_pkt *rsp = (struct ncsi_rsp_gls_pkt *)rnh;
@@ -80,7 +91,7 @@ static int ncsi_rsp_handler_gls(struct ncsi_rsp_pkt_hdr *rnh)
}
/* Get Parameters */
-static int ncsi_rsp_handler_gp(struct ncsi_rsp_pkt_hdr *rnh)
+static int ncsi_rsp_handler_gp(Slirp *slirp, struct ncsi_rsp_pkt_hdr *rnh)
{
struct ncsi_rsp_gp_pkt *rsp = (struct ncsi_rsp_gp_pkt *)rnh;
@@ -96,7 +107,7 @@ static int ncsi_rsp_handler_gp(struct ncsi_rsp_pkt_hdr *rnh)
static const struct ncsi_rsp_handler {
unsigned char type;
int payload;
- int (*handler)(struct ncsi_rsp_pkt_hdr *rnh);
+ int (*handler)(Slirp *slirp, struct ncsi_rsp_pkt_hdr *rnh);
} ncsi_rsp_handlers[] = { { NCSI_PKT_RSP_CIS, 4, NULL },
{ NCSI_PKT_RSP_SP, 4, NULL },
{ NCSI_PKT_RSP_DP, 4, NULL },
@@ -117,7 +128,7 @@ static const struct ncsi_rsp_handler {
{ NCSI_PKT_RSP_EGMF, 4, NULL },
{ NCSI_PKT_RSP_DGMF, 4, NULL },
{ NCSI_PKT_RSP_SNFC, 4, NULL },
- { NCSI_PKT_RSP_GVI, 40, NULL },
+ { NCSI_PKT_RSP_GVI, 40, ncsi_rsp_handler_gvi },
{ NCSI_PKT_RSP_GC, 32, ncsi_rsp_handler_gc },
{ NCSI_PKT_RSP_GP, 40, ncsi_rsp_handler_gp },
{ NCSI_PKT_RSP_GCPS, 172, NULL },
@@ -178,7 +189,7 @@ void ncsi_input(Slirp *slirp, const uint8_t *pkt, int pkt_len)
if (handler->handler) {
/* TODO: handle errors */
- handler->handler(rnh);
+ handler->handler(slirp, rnh);
}
ncsi_rsp_len += handler->payload;
} else {
diff --git a/src/slirp.c b/src/slirp.c
index 04bce41..588cada 100644
--- a/src/slirp.c
+++ b/src/slirp.c
@@ -648,6 +648,12 @@ Slirp *slirp_new(const SlirpConfig *cfg, const SlirpCb *callbacks, void *opaque)
slirp->cb->init_completed(slirp, slirp->opaque);
}
+ if (cfg->version >= 5) {
+ slirp->mfr_id = cfg->mfr_id;
+ } else {
+ slirp->mfr_id = 0;
+ }
+
ip6_post_init(slirp);
return slirp;
}
diff --git a/src/slirp.h b/src/slirp.h
index 35c2be3..a61ea15 100644
--- a/src/slirp.h
+++ b/src/slirp.h
@@ -151,6 +151,8 @@ struct Slirp {
bool disable_host_loopback;
+ uint32_t mfr_id;
+
/* mbuf states */
struct slirp_quehead m_freelist;
struct slirp_quehead m_usedlist;