Charging option
diff --git a/sgsnemu/cmdline.c b/sgsnemu/cmdline.c
index be47cc1..fa7ad7f 100644
--- a/sgsnemu/cmdline.c
+++ b/sgsnemu/cmdline.c
@@ -1,7 +1,7 @@
 /*
   File autogenerated by gengetopt version 2.8
   generated with the following command:
-  gengetopt --conf-parser 
+  /mnt/hda5/bin/gengetopt --conf-parser 
 
   The developers of gengetopt consider the fixed text that goes in all
   gengetopt output files to be in the public domain:
@@ -56,9 +56,10 @@
   printf("              --gtpversion=INT   GTP version to use (default='1')\n");
   printf("   -aSTRING   --apn=STRING       Access point name (default='internet')\n");
   printf("   -iSTRING   --imsi=STRING      IMSI (default='240010123456789')\n");
-  printf("              --nsapi=INT        NSAPI (default='1')\n");
+  printf("              --nsapi=INT        NSAPI (default='0')\n");
   printf("   -mSTRING   --msisdn=STRING    Mobile Station ISDN number (default='46702123456')\n");
   printf("   -qINT      --qos=INT          Requested quality of service (default='0x0b921f')\n");
+  printf("              --charging=INT     Charging characteristics (default='0x0800')\n");
   printf("   -uSTRING   --uid=STRING       Login user ID (default='mig')\n");
   printf("   -pSTRING   --pwd=STRING       Login password (default='hemmelig')\n");
   printf("              --createif         Create local network interface (default=off)\n");
@@ -111,6 +112,7 @@
   args_info->nsapi_given = 0 ;
   args_info->msisdn_given = 0 ;
   args_info->qos_given = 0 ;
+  args_info->charging_given = 0 ;
   args_info->uid_given = 0 ;
   args_info->pwd_given = 0 ;
   args_info->createif_given = 0 ;
@@ -136,9 +138,10 @@
   args_info->gtpversion_arg = 1 ;\
   args_info->apn_arg = strdup("internet") ;\
   args_info->imsi_arg = strdup("240010123456789") ;\
-  args_info->nsapi_arg = 1 ;\
+  args_info->nsapi_arg = 0 ;\
   args_info->msisdn_arg = strdup("46702123456") ;\
   args_info->qos_arg = 0x0b921f ;\
+  args_info->charging_arg = 0x0800 ;\
   args_info->uid_arg = strdup("mig") ;\
   args_info->pwd_arg = strdup("hemmelig") ;\
   args_info->createif_flag = 0;\
@@ -182,6 +185,7 @@
         { "nsapi",	1, NULL, 0 },
         { "msisdn",	1, NULL, 'm' },
         { "qos",	1, NULL, 'q' },
+        { "charging",	1, NULL, 0 },
         { "uid",	1, NULL, 'u' },
         { "pwd",	1, NULL, 'p' },
         { "createif",	0, NULL, 0 },
@@ -427,6 +431,19 @@
             args_info->nsapi_arg = strtol (optarg,&stop_char,0);
             break;
           }
+          /* Charging characteristics.  */
+          else if (strcmp (long_options[option_index].name, "charging") == 0)
+          {
+            if (args_info->charging_given)
+              {
+                fprintf (stderr, "%s: `--charging' option given more than once\n", PACKAGE);
+                clear_args ();
+                exit (EXIT_FAILURE);
+              }
+            args_info->charging_given = 1;
+            args_info->charging_arg = strtol (optarg,&stop_char,0);
+            break;
+          }
           /* Create local network interface.  */
           else if (strcmp (long_options[option_index].name, "createif") == 0)
           {
@@ -850,6 +867,22 @@
                 }
               continue;
             }
+          if (!strcmp(fopt, "charging"))
+            {
+              if (override || !args_info->charging_given)
+                {
+                  args_info->charging_given = 1;
+                  if (fnum == 2)
+                    args_info->charging_arg = strtol (farg,&stop_char,0);
+                  else
+                    {
+                      fprintf (stderr, "%s:%d: required <option_name> <option_val>\n",
+                               filename, line_num);
+                      exit (EXIT_FAILURE);
+                    }
+                }
+              continue;
+            }
           if (!strcmp(fopt, "uid"))
             {
               if (override || !args_info->uid_given)
diff --git a/sgsnemu/cmdline.ggo b/sgsnemu/cmdline.ggo
index 1d0ea75..203f60b 100644
--- a/sgsnemu/cmdline.ggo
+++ b/sgsnemu/cmdline.ggo
@@ -34,6 +34,7 @@
 option  "nsapi"        - "NSAPI"                          int default="0" no
 option  "msisdn"       m "Mobile Station ISDN number"     string default="46702123456" no
 option  "qos"          q "Requested quality of service"   int    default="0x0b921f" no
+option  "charging"     - "Charging characteristics"       int    default="0x0800" no
 option  "uid"          u "Login user ID"                  string default="mig" no
 option  "pwd"          p "Login password"                 string default="hemmelig" no
 
diff --git a/sgsnemu/cmdline.h b/sgsnemu/cmdline.h
index 2d9b7e5..7298f17 100644
--- a/sgsnemu/cmdline.h
+++ b/sgsnemu/cmdline.h
@@ -32,9 +32,10 @@
   int gtpversion_arg;	/* GTP version to use (default='1').  */
   char * apn_arg;	/* Access point name (default='internet').  */
   char * imsi_arg;	/* IMSI (default='240010123456789').  */
-  int nsapi_arg;	/* NSAPI (default='1').  */
+  int nsapi_arg;	/* NSAPI (default='0').  */
   char * msisdn_arg;	/* Mobile Station ISDN number (default='46702123456').  */
   int qos_arg;	/* Requested quality of service (default='0x0b921f').  */
+  int charging_arg;	/* Charging characteristics (default='0x0800').  */
   char * uid_arg;	/* Login user ID (default='mig').  */
   char * pwd_arg;	/* Login password (default='hemmelig').  */
   int createif_flag;	/* Create local network interface (default=off).  */
@@ -65,6 +66,7 @@
   int nsapi_given ;	/* Whether nsapi was given.  */
   int msisdn_given ;	/* Whether msisdn was given.  */
   int qos_given ;	/* Whether qos was given.  */
+  int charging_given ;	/* Whether charging was given.  */
   int uid_given ;	/* Whether uid was given.  */
   int pwd_given ;	/* Whether pwd was given.  */
   int createif_given ;	/* Whether createif was given.  */
diff --git a/sgsnemu/sgsnemu.c b/sgsnemu/sgsnemu.c
index 388f736..2d281fb 100644
--- a/sgsnemu/sgsnemu.c
+++ b/sgsnemu/sgsnemu.c
@@ -106,6 +106,7 @@
   int gtpversion;
   struct ul255_t pco;
   struct ul255_t qos;
+  uint16_t cch;
   struct ul255_t apn;
   struct ul16_t msisdn;
 } options;
@@ -224,6 +225,7 @@
     printf("debug: %d\n", args_info.debug_flag);
     if (args_info.imsi_arg) printf("imsi: %s\n", args_info.imsi_arg);
     printf("qos: %#08x\n", args_info.qos_arg);
+    printf("charging: %#04x\n", args_info.charging_arg);
     if (args_info.apn_arg) printf("apn: %s\n", args_info.apn_arg);
     if (args_info.msisdn_arg) printf("msisdn: %s\n", args_info.msisdn_arg);
     if (args_info.uid_arg) printf("uid: %s\n", args_info.uid_arg);
@@ -257,6 +259,7 @@
       printf("debug: %d\n", args_info.debug_flag);
       if (args_info.imsi_arg) printf("imsi: %s\n", args_info.imsi_arg);
       printf("qos: %#08x\n", args_info.qos_arg);
+      printf("charging: %#04x\n", args_info.charging_arg);
       if (args_info.apn_arg) printf("apn: %s\n", args_info.apn_arg);
       if (args_info.msisdn_arg) printf("msisdn: %s\n", args_info.msisdn_arg);
       if (args_info.uid_arg) printf("uid: %s\n", args_info.uid_arg);
@@ -411,6 +414,9 @@
   options.qos.v[2] = (args_info.qos_arg) & 0xff;
   options.qos.v[1] = ((args_info.qos_arg) >> 8) & 0xff;
   options.qos.v[0] = ((args_info.qos_arg) >> 16) & 0xff;
+
+  /* charging                                                        */
+  options.cch = args_info.charging_arg;
   
   /* contexts                                                        */
   if (args_info.contexts_arg > MAXCONTEXTS) {
@@ -1168,12 +1174,8 @@
     pdp->hisaddr0 = options.remote;
     pdp->hisaddr1 = options.remote;
 
-    /* TODO: This could be an option */
-    pdp->cch_pdp = 2048; /* Normal charging 3GPP 32.015 */
-                         /* 2048 = Normal
-			    1024 = Prepaid
-			    0512 = Flat rate
-			    0256 = Hot billing */
+    pdp->cch_pdp = options.cch; /* 2048 = Normal, 1024 = Prepaid, 
+				   512 = Flat rate, 256 = Hot billing */
 
     /* Create context */
     /* We send this of once. Retransmissions are handled by gtplib */