Use unique incrementing value for BTS LAC

Change-Id: I9f864bac05e39ec2fc305f774194799c3d8fe1b0
diff --git a/src/osmo_gsm_tester/bts_octphy.py b/src/osmo_gsm_tester/bts_octphy.py
index ae2e249..eb1092c 100644
--- a/src/osmo_gsm_tester/bts_octphy.py
+++ b/src/osmo_gsm_tester/bts_octphy.py
@@ -30,6 +30,7 @@
     env = None
     pcu_sk_tmp_dir = None
     values = None
+    lac = None
 
     BIN_BTS_OCTPHY = 'osmo-bts-octphy'
 
@@ -158,6 +159,8 @@
     def conf_for_bsc(self):
         values = config.get_defaults('bsc_bts')
         config.overlay(values, config.get_defaults('osmo_bts_octphy'))
+        if self.lac is not None:
+            config.overlay(values, { 'location_area_code': self.lac })
         config.overlay(values, self.conf)
         self.dbg(conf=values)
         return values
@@ -165,4 +168,7 @@
     def set_bsc(self, bsc):
         self.bsc = bsc
 
+    def set_lac(self, lac):
+        self.lac = lac
+
 # vim: expandtab tabstop=4 shiftwidth=4
diff --git a/src/osmo_gsm_tester/bts_osmotrx.py b/src/osmo_gsm_tester/bts_osmotrx.py
index f53b8a3..731daa5 100644
--- a/src/osmo_gsm_tester/bts_osmotrx.py
+++ b/src/osmo_gsm_tester/bts_osmotrx.py
@@ -30,6 +30,7 @@
     env = None
     trx = None
     pcu_sk_tmp_dir = None
+    lac = None
 
     BIN_BTS_TRX = 'osmo-bts-trx'
     BIN_PCU = 'osmo-pcu'
@@ -136,6 +137,8 @@
     def conf_for_bsc(self):
         values = config.get_defaults('bsc_bts')
         config.overlay(values, config.get_defaults('osmo_bts_trx'))
+        if self.lac is not None:
+            config.overlay(values, { 'location_area_code': self.lac })
         config.overlay(values, self.conf)
         self.dbg(conf=values)
         return values
@@ -143,6 +146,9 @@
     def set_bsc(self, bsc):
         self.bsc = bsc
 
+    def set_lac(self, lac):
+        self.lac = lac
+
 class OsmoTrx(log.Origin):
     suite_run = None
     run_dir = None
diff --git a/src/osmo_gsm_tester/bts_sysmo.py b/src/osmo_gsm_tester/bts_sysmo.py
index e8ac7c2..03dc97e 100644
--- a/src/osmo_gsm_tester/bts_sysmo.py
+++ b/src/osmo_gsm_tester/bts_sysmo.py
@@ -29,6 +29,7 @@
     remote_inst = None
     remote_env = None
     remote_dir = None
+    lac = None
 
     REMOTE_DIR = '/osmo-gsm-tester'
     BTS_SYSMO_BIN = 'osmo-bts-sysmo'
@@ -143,6 +144,8 @@
     def conf_for_bsc(self):
         values = config.get_defaults('bsc_bts')
         config.overlay(values, config.get_defaults('osmo_bts_sysmo'))
+        if self.lac is not None:
+            config.overlay(values, { 'location_area_code': self.lac })
         config.overlay(values, self.conf)
         self.dbg(conf=values)
         return values
@@ -150,4 +153,7 @@
     def set_bsc(self, bsc):
         self.bsc = bsc
 
+    def set_lac(self, lac):
+        self.lac = lac
+
 # vim: expandtab tabstop=4 shiftwidth=4
diff --git a/src/osmo_gsm_tester/resource.py b/src/osmo_gsm_tester/resource.py
index ecafa2f..9571131 100644
--- a/src/osmo_gsm_tester/resource.py
+++ b/src/osmo_gsm_tester/resource.py
@@ -210,6 +210,8 @@
     def next_msisdn(self, origin):
         return self.next_persistent_value('msisdn', '1000', schema.msisdn, util.msisdn_inc, origin)
 
+    def next_lac(self, origin):
+        return self.next_persistent_value('lac', '1', schema.uint16, lambda x: str((int(x)+1) % pow(2,16)), origin)
 
 class NoResourceExn(log.Error):
     pass
diff --git a/src/osmo_gsm_tester/schema.py b/src/osmo_gsm_tester/schema.py
index 9b142d3..a78bc63 100644
--- a/src/osmo_gsm_tester/schema.py
+++ b/src/osmo_gsm_tester/schema.py
@@ -71,6 +71,13 @@
     if n < 0:
         raise ValueError('Positive value expected instead of %d' % n)
 
+def uint16(val):
+    n = int(val)
+    if n < 0:
+        raise ValueError('Positive value expected instead of %d' % n)
+    if n > 65535: # 2^16 - 1
+        raise ValueError('Value %d too big, max value is 65535' % n)
+
 def times(val):
     n = int(val)
     if n < 1:
diff --git a/src/osmo_gsm_tester/suite.py b/src/osmo_gsm_tester/suite.py
index 28bdd69..9f9421e 100644
--- a/src/osmo_gsm_tester/suite.py
+++ b/src/osmo_gsm_tester/suite.py
@@ -344,6 +344,7 @@
 
     def bts(self, specifics=None):
         bts = bts_obj(self, self.reserved_resources.get(resource.R_BTS, specifics=specifics))
+        bts.set_lac(self.lac())
         self.register_for_cleanup(bts)
         return bts
 
@@ -370,6 +371,11 @@
         self.log('using MSISDN', msisdn)
         return msisdn
 
+    def lac(self):
+        lac = self.resources_pool.next_lac(self)
+        self.log('using LAC', lac)
+        return lac
+
     def poll(self):
         if self._processes:
             for process in self._processes: