So, let me explain a little about how data charging works, and hopefully it will become clearer.
There are two elements involved in data charging: the GGSN (Gateway GPRS Support Node) and the IN (Intelligent Network). Unlike a voice call, where we use CAMEL, the GGSN-IN interaction (Gy in the 3GPP network - see here) uses the DIAMETER Credit Control Application. At 2degrees, we implement DCCA "Multi-Services Credit Control".
MSCC allows us to provide you with free access the self-care portal, for example, as well as the free content downloads from Toybox, and the WAP Portal.
At the device, you simply access data services. The GGSN classifies the traffic and encodes it as an MSCC Rating Group, which is passed to the IN for charging authorisation. Each instance of a new MSCC RG within a single DIAMETER session is passed up to the call control layer of the IN as a new call. Doing it this way allows us to rate each RG separately.
The GGSN requests chunks of allowed usage from the IN for each RG encountered. The IN may return allowed usage as volume (i.e. bytes), duration (i.e. seconds), not applicable (go for broke and don't bother me again) or reject the usage. For compatibility reasons we return volume usage even for free rating groups like self-care, so in practice we only use volume & rejection.
The IN typically attempts to grant usage in chunks of 1MB, which is a compromise between reserving big dollops of money for long periods when you're on but idle, and constant back-and-forth when you're using data quickly (downloading a big file over HSDPA).
At some point, you'll run out of data pack and/or credit. The GGSN will request more funds for some rating group (say, default) and the IN will say no.
As far as the IN is concerned, the call relating to the default rating group is now closed due to credit exhaustion. The GGSN, however, holds the PDP context and DIAMETER session open because you still may use other rating groups that have unused reservations remaining, or which are free (such as self-care, again).
If you topup at this point and attempt to use default again, the GGSN will ask for more default data in the existing DIAMETER session, but the IN has already closed the internal call down, and the attempt will be rejected (with a DIAMETER error, actually).
In order to start again, you need to end the PDP context and start a new one, which of course terminates the DIAMETER session and starts a new one.
There are two possible solutions to this issue:
1. Kill the whole PDP context when any RG is rejected. We can't do that, because that would defeat the purpose of free self-care portal.
2. Topup before you run out
If you topup or purchase a data pack before the final reservation is exhausted, then the next time the GGSN asks for a new reservation, there will be funds available, and you can carry on.
There are software updates to the IN coming shortly that will present you with warnings during the session (not after it's already over) to make it easier to topup before you're out of credit.