diff --git a/sgsnemu/cmdline.c b/sgsnemu/cmdline.c index e287116..9039339 100644 --- a/sgsnemu/cmdline.c +++ b/sgsnemu/cmdline.c @@ -80,7 +80,7 @@ const char *gengetopt_args_info_help[] = { " --pingcount=INT Number of ping req to send (default=`0')", " --pingquiet Do not print ping packet info (default=off)", " --no-tx-gpdu-seq Don't transmit G-PDU sequence nums\n (default=off)", - " -t, --pdp-type=(v4|v6) PDP Type (default=`v4')", + " -t, --pdp-type=(v4|v6|v4v6) PDP Type (default=`v4')", 0 }; diff --git a/sgsnemu/cmdline.ggo b/sgsnemu/cmdline.ggo index 54db05b..d8d5c35 100644 --- a/sgsnemu/cmdline.ggo +++ b/sgsnemu/cmdline.ggo @@ -68,4 +68,4 @@ modeoption "pingcount" - "Number of ping req to send" int default="0" d modeoption "pingquiet" - "Do not print ping packet info" flag dependon="pinghost" off mode="pinghost" option "no-tx-gpdu-seq" - "Don't transmit G-PDU sequence nums" flag off -option "pdp-type" t "PDP Type" string default="v4" no typestr="(v4|v6)" +option "pdp-type" t "PDP Type" string default="v4" no typestr="(v4|v6|v4v6)" diff --git a/sgsnemu/sgsnemu.c b/sgsnemu/sgsnemu.c index afa7339..ee74def 100644 --- a/sgsnemu/sgsnemu.c +++ b/sgsnemu/sgsnemu.c @@ -925,6 +925,8 @@ static int process_options(int argc, char **argv) options.pdp_type = PDP_EUA_TYPE_v6; else if (!strcmp(args_info.pdp_type_arg, "v4")) options.pdp_type = PDP_EUA_TYPE_v4; + else if (!strcmp(args_info.pdp_type_arg, "v4v6")) + options.pdp_type = PDP_EUA_TYPE_v4v6; else { SYS_ERR(DSGSN, LOGL_ERROR, 0, "Unsupported/unknown PDP Type '%s'\n", args_info.pdp_type_arg); @@ -944,6 +946,9 @@ static int process_options(int argc, char **argv) case PDP_EUA_TYPE_v6: hints.ai_family = AF_INET6; break; + case PDP_EUA_TYPE_v4v6: + hints.ai_family = AF_UNSPEC; + break; default: SYS_ERR(DSGSN, LOGL_ERROR, 0, "lookup(AF_UNSPEC) %d", options.pdp_type); hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */ @@ -1664,7 +1669,8 @@ static int create_pdp_conf(struct pdp_t *pdp, void *cbp, int cause) } } - if (options.createif && options.pdp_type == PDP_EUA_TYPE_v6) { + if (options.createif && (options.pdp_type == PDP_EUA_TYPE_v6 || + options.pdp_type == PDP_EUA_TYPE_v4v6)) { struct in6_addr *saddr6; struct msgb *msg; if (in46a_is_v6(&addr[0])) {