Newer
Older
for subsId, subInfo := range assocStaSubscriptionInfoMap {
if subInfo == nil {
break
}
sub := subInfo.Subscription
Simon Pastor
committed
if sub.ApId.Bssid == apMacId {
Simon Pastor
committed
if match {
if sub.NotificationEvent != nil {
match = false
switch sub.NotificationEvent.Trigger {
Simon Pastor
committed
if len(staMacIds) >= int(sub.NotificationEvent.Threshold) {
match = true
}
Simon Pastor
committed
if len(staMacIds) <= int(sub.NotificationEvent.Threshold) {
match = true
}
default:
}
//if the notification already triggered, do not send it again unless its a periodic event
if match {
if sub.NotificationPeriod == 0 {
if subInfo.Triggered {
sendingNotificationAllowed = false
}
}
} else {
// no match found for threshold, reste trigger
assocStaSubscriptionInfoMap[subsId].Triggered = false
}
Simon Pastor
committed
}
}
if match && sendingNotificationAllowed {
assocStaSubscriptionInfoMap[subsId].Triggered = true
subsIdStr := strconv.Itoa(subsId)
log.Info("Sending WAIS notification ", sub.CallbackReference)
Simon Pastor
committed
apId.Bssid = apMacId
notif.ApId = &apId
for _, staMacId := range staMacIds {
staId.MacId = staMacId
notif.StaId = append(notif.StaId, staId)
}
log.Info("Assoc Sta Notification" + "(" + subsIdStr + ")")
assocStaSubscriptionInfoMap[subsId].NextTts = subInfo.Subscription.NotificationPeriod
assocStaSubscriptionInfoMap[subsId].NotificationCheckReady = false
func checkStaDataRateNotificationRegisteredSubscriptions(staId *StaIdentity, dataRateDl int32, dataRateUl int32, needMutex bool) {
Simon Pastor
committed
if needMutex {
mutex.Lock()
defer mutex.Unlock()
}
Simon Pastor
committed
//check all that applies
for subsId, subInfo := range staDataRateSubscriptionInfoMap {
if subInfo == nil {
break
}
sub := subInfo.Subscription
Simon Pastor
committed
match := false
if sub != nil {
Simon Pastor
committed
notifToSend := false
var staDataRateList []StaDataRate
for _, subStaId := range sub.StaId {
//check to match every values and at least one when its an array
if staId.MacId != subStaId.MacId {
continue
}
if staId.Aid != subStaId.Aid {
continue
}
Simon Pastor
committed
match = true
Simon Pastor
committed
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
for _, ssid := range subStaId.Ssid {
match = false
//can only have one ssid at a time
if ssid == staId.Ssid[0] {
match = true
break
}
}
if match {
for _, ipAddress := range subStaId.IpAddress {
match = false
//can only have one ip address
if ipAddress == staId.IpAddress[0] {
match = true
break
}
}
}
if match {
if sub.NotificationEvent != nil {
match = false
switch sub.NotificationEvent.Trigger {
Simon Pastor
committed
if dataRateDl >= sub.NotificationEvent.DownlinkRateThreshold {
match = true
}
Simon Pastor
committed
if dataRateDl <= sub.NotificationEvent.DownlinkRateThreshold {
match = true
}
Simon Pastor
committed
if dataRateUl >= sub.NotificationEvent.UplinkRateThreshold {
match = true
}
if dataRateUl <= sub.NotificationEvent.UplinkRateThreshold {
Simon Pastor
committed
match = true
}
Simon Pastor
committed
if dataRateDl >= sub.NotificationEvent.DownlinkRateThreshold && dataRateUl >= sub.NotificationEvent.UplinkRateThreshold {
match = true
}
Simon Pastor
committed
if dataRateDl <= sub.NotificationEvent.DownlinkRateThreshold && dataRateUl <= sub.NotificationEvent.UplinkRateThreshold {
match = true
}
Simon Pastor
committed
if dataRateDl >= sub.NotificationEvent.DownlinkRateThreshold || dataRateUl >= sub.NotificationEvent.UplinkRateThreshold {
match = true
}
Simon Pastor
committed
if dataRateDl <= sub.NotificationEvent.DownlinkRateThreshold || dataRateUl <= sub.NotificationEvent.UplinkRateThreshold {
match = true
}
default:
}
//if the notification already triggered, do not send it again unless its a periodic event
if match {
if sub.NotificationPeriod == 0 {
if subInfo.Triggered {
sendingNotificationAllowed = false
}
}
} else {
// no match found for threshold, reste trigger
staDataRateSubscriptionInfoMap[subsId].Triggered = false
}
Simon Pastor
committed
}
}
Simon Pastor
committed
var staDataRate StaDataRate
staDataRate.StaId = staId
staDataRate.StaLastDataDownlinkRate = dataRateDl
staDataRate.StaLastDataUplinkRate = dataRateUl
staDataRateList = append(staDataRateList, staDataRate)
notifToSend = true
}
}
if notifToSend {
Simon Pastor
committed
subsIdStr := strconv.Itoa(subsId)
log.Info("Sending WAIS notification ", sub.CallbackReference)
var notif StaDataRateNotification
seconds := time.Now().Unix()
var timeStamp TimeStamp
timeStamp.Seconds = int32(seconds)
notif.TimeStamp = &timeStamp
notif.NotificationType = STA_DATA_RATE_NOTIFICATION
if len(staDataRateList) > 0 {
notif.StaDataRate = staDataRateList
}
Simon Pastor
committed
sendStaDataRateNotification(sub.CallbackReference, notif)
log.Info("Sta Data Rate Notification" + "(" + subsIdStr + ")")
staDataRateSubscriptionInfoMap[subsId].NextTts = subInfo.Subscription.NotificationPeriod
staDataRateSubscriptionInfoMap[subsId].NotificationCheckReady = false
Simon Pastor
committed
}
}
}
}
func sendTestNotification(notifyUrl string, linkType *LinkType) {
var notification TestNotification
notification.NotificationType = TEST_NOTIFICATION
link := new(TestNotificationLinks)
Simon Pastor
committed
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
link.Subscription = linkType
notification.Links = link
startTime := time.Now()
jsonNotif, err := json.Marshal(notification)
if err != nil {
log.Error(err.Error())
}
resp, err := http.Post(notifyUrl, "application/json", bytes.NewBuffer(jsonNotif))
duration := float64(time.Since(startTime).Microseconds()) / 1000.0
_ = httpLog.LogTx(notifyUrl, "POST", string(jsonNotif), resp, startTime)
if err != nil {
log.Error(err)
met.ObserveNotification(sandboxName, serviceName, notifTest, notifyUrl, nil, duration)
return
}
met.ObserveNotification(sandboxName, serviceName, notifTest, notifyUrl, resp, duration)
defer resp.Body.Close()
}
func sendAssocStaNotification(notifyUrl string, notification AssocStaNotification) {
jsonNotif, err := json.Marshal(notification)
if err != nil {
log.Error(err.Error())
}
resp, err := http.Post(notifyUrl, "application/json", bytes.NewBuffer(jsonNotif))
Kevin Di Lallo
committed
duration := float64(time.Since(startTime).Microseconds()) / 1000.0
_ = httpLog.LogTx(notifyUrl, "POST", string(jsonNotif), resp, startTime)
if err != nil {
log.Error(err)
Kevin Di Lallo
committed
met.ObserveNotification(sandboxName, serviceName, notifAssocSta, notifyUrl, nil, duration)
Kevin Di Lallo
committed
met.ObserveNotification(sandboxName, serviceName, notifAssocSta, notifyUrl, resp, duration)
Simon Pastor
committed
func sendStaDataRateNotification(notifyUrl string, notification StaDataRateNotification) {
startTime := time.Now()
jsonNotif, err := json.Marshal(notification)
if err != nil {
log.Error(err.Error())
}
resp, err := http.Post(notifyUrl, "application/json", bytes.NewBuffer(jsonNotif))
duration := float64(time.Since(startTime).Microseconds()) / 1000.0
_ = httpLog.LogTx(notifyUrl, "POST", string(jsonNotif), resp, startTime)
if err != nil {
log.Error(err)
met.ObserveNotification(sandboxName, serviceName, notifStaDataRate, notifyUrl, nil, duration)
return
}
met.ObserveNotification(sandboxName, serviceName, notifStaDataRate, notifyUrl, resp, duration)
defer resp.Body.Close()
}
func sendExpiryNotification(notifyUrl string, notification ExpiryNotification) {
startTime := time.Now()
jsonNotif, err := json.Marshal(notification)
if err != nil {
log.Error(err.Error())
}
resp, err := http.Post(notifyUrl, "application/json", bytes.NewBuffer(jsonNotif))
Kevin Di Lallo
committed
duration := float64(time.Since(startTime).Microseconds()) / 1000.0
_ = httpLog.LogTx(notifyUrl, "POST", string(jsonNotif), resp, startTime)
if err != nil {
log.Error(err)
Kevin Di Lallo
committed
met.ObserveNotification(sandboxName, serviceName, notifExpiry, notifyUrl, nil, duration)
Kevin Di Lallo
committed
met.ObserveNotification(sandboxName, serviceName, notifExpiry, notifyUrl, resp, duration)
}
func subscriptionsGET(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
vars := mux.Vars(r)
subIdParamStr := vars["subscriptionId"]
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
jsonRespDB, _ := rc.JSONGetEntry(baseKey+"subscriptions:"+subIdParamStr, ".")
if jsonRespDB == "" {
w.WriteHeader(http.StatusNotFound)
return
}
var subscriptionCommon SubscriptionCommon
err := json.Unmarshal([]byte(jsonRespDB), &subscriptionCommon)
if err != nil {
log.Error(err.Error())
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
var jsonResponse []byte
switch subscriptionCommon.SubscriptionType {
case ASSOC_STA_SUBSCRIPTION:
var subscription AssocStaSubscription
err = json.Unmarshal([]byte(jsonRespDB), &subscription)
if err != nil {
log.Error(err.Error())
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
Simon Pastor
committed
jsonResponse, err = json.Marshal(subscription)
case STA_DATA_RATE_SUBSCRIPTION:
var subscription StaDataRateSubscription
err = json.Unmarshal([]byte(jsonRespDB), &subscription)
if err != nil {
log.Error(err.Error())
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
case MEASUREMENT_REPORT_SUBSCRIPTION:
w.WriteHeader(http.StatusNotImplemented)
return
default:
log.Error("Unknown subscription type")
w.WriteHeader(http.StatusBadRequest)
return
}
if err != nil {
log.Error(err.Error())
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, string(jsonResponse))
}
func isSubscriptionIdRegisteredAssocSta(subsIdStr string) bool {
if assocStaSubscriptionInfoMap[subsId] != nil {
return true
} else {
return false
}
}
Simon Pastor
committed
func isSubscriptionIdRegisteredStaDataRate(subsIdStr string) bool {
subsId, _ := strconv.Atoi(subsIdStr)
mutex.Lock()
defer mutex.Unlock()
if staDataRateSubscriptionInfoMap[subsId] != nil {
Simon Pastor
committed
return true
} else {
return false
}
}
func registerAssocSta(subscription *AssocStaSubscription, subsIdStr string) {
mutex.Lock()
defer mutex.Unlock()
//immediate trigger of the subscription
assocStaSubscriptionInfo := AssocStaSubscriptionInfo{0 /*subscription.NotificationPeriod*/, false, subscription, false}
assocStaSubscriptionInfoMap[subsId] = &assocStaSubscriptionInfo
if subscription.ExpiryDeadline != nil {
//get current list of subscription meant to expire at this time
intList := subscriptionExpiryMap[int(subscription.ExpiryDeadline.Seconds)]
intList = append(intList, subsId)
subscriptionExpiryMap[int(subscription.ExpiryDeadline.Seconds)] = intList
}
log.Info("New registration: ", subsId, " type: ", subscription.SubscriptionType)
Simon Pastor
committed
if subscription.RequestTestNotification {
sendTestNotification(subscription.CallbackReference, subscription.Links.Self)
}
}
Simon Pastor
committed
func registerStaDataRate(subscription *StaDataRateSubscription, subsIdStr string) {
subsId, _ := strconv.Atoi(subsIdStr)
mutex.Lock()
defer mutex.Unlock()
staDataRateSubscriptionInfo := StaDataRateSubscriptionInfo{0, false, subscription, false}
staDataRateSubscriptionInfoMap[subsId] = &staDataRateSubscriptionInfo
Simon Pastor
committed
if subscription.ExpiryDeadline != nil {
//get current list of subscription meant to expire at this time
intList := subscriptionExpiryMap[int(subscription.ExpiryDeadline.Seconds)]
intList = append(intList, subsId)
subscriptionExpiryMap[int(subscription.ExpiryDeadline.Seconds)] = intList
}
log.Info("New registration: ", subsId, " type: ", subscription.SubscriptionType)
if subscription.RequestTestNotification {
sendTestNotification(subscription.CallbackReference, subscription.Links.Self)
}
func deregisterAssocSta(subsIdStr string, mutexTaken bool) {
if !mutexTaken {
mutex.Lock()
defer mutex.Unlock()
}
assocStaSubscriptionInfoMap[subsId] = nil
log.Info("Deregistration: ", subsId, " type: ", assocStaSubscriptionType)
}
Simon Pastor
committed
func deregisterStaDataRate(subsIdStr string, mutexTaken bool) {
subsId, _ := strconv.Atoi(subsIdStr)
if !mutexTaken {
mutex.Lock()
defer mutex.Unlock()
}
staDataRateSubscriptionInfoMap[subsId] = nil
Simon Pastor
committed
log.Info("Deregistration: ", subsId, " type: ", staDataRateSubscriptionType)
}
func subscriptionsPOST(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
var subscriptionCommon SubscriptionCommon
bodyBytes, _ := ioutil.ReadAll(r.Body)
err := json.Unmarshal(bodyBytes, &subscriptionCommon)
if err != nil {
log.Error(err.Error())
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
//extract common body part
subscriptionType := subscriptionCommon.SubscriptionType
//mandatory parameter
if subscriptionCommon.CallbackReference == "" {
log.Error("Mandatory CallbackReference parameter not present")
http.Error(w, "Mandatory CallbackReference parameter not present", http.StatusBadRequest)
return
}
newSubsId := nextSubscriptionIdAvailable
nextSubscriptionIdAvailable++
subsIdStr := strconv.Itoa(newSubsId)
link := new(AssocStaSubscriptionLinks)
self := new(LinkType)
self.Href = hostUrl.String() + basePath + "subscriptions/" + subsIdStr
link.Self = self
var jsonResponse []byte
switch subscriptionType {
case ASSOC_STA_SUBSCRIPTION:
var subscription AssocStaSubscription
err = json.Unmarshal(bodyBytes, &subscription)
if err != nil {
log.Error(err.Error())
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
subscription.Links = link
//make sure subscription is valid for mandatory parameters
if subscription.NotificationPeriod == 0 && subscription.NotificationEvent == nil {
log.Error("Either or Both NotificationPeriod or NotificationEvent shall be present")
http.Error(w, "Either or Both NotificationPeriod or NotificationEvent shall be present", http.StatusBadRequest)
return
}
if subscription.NotificationEvent != nil {
if subscription.NotificationEvent.Trigger <= 0 && subscription.NotificationEvent.Trigger > 2 {
log.Error("Mandatory Notification Event Trigger not valid")
http.Error(w, "Mandatory Notification Event Trigger not valid", http.StatusBadRequest)
return
}
}
if subscription.ApId == nil {
log.Error("Mandatory ApId missing")
http.Error(w, "Mandatory ApId missing", http.StatusBadRequest)
return
} else {
if subscription.ApId.Bssid == "" {
log.Error("Mandatory ApId Bssid missing")
http.Error(w, "Mandatory ApId Bssid missing", http.StatusBadRequest)
return
}
//registration
_ = rc.JSONSetEntry(baseKey+"subscriptions:"+subsIdStr, ".", convertAssocStaSubscriptionToJson(&subscription))
registerAssocSta(&subscription, subsIdStr)
Simon Pastor
committed
jsonResponse, err = json.Marshal(subscription)
case STA_DATA_RATE_SUBSCRIPTION:
nextSubscriptionIdAvailable--
w.WriteHeader(http.StatusNotImplemented)
return
/* TBD when traffic is available
Simon Pastor
committed
var subscription StaDataRateSubscription
err = json.Unmarshal(bodyBytes, &subscription)
if err != nil {
log.Error(err.Error())
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
subscription.Links = link
//make sure subscription is valid for mandatory parameters
if subscription.NotificationPeriod == 0 && subscription.NotificationEvent == nil {
log.Error("Either or Both NotificationPeriod or NotificationEvent shall be present")
http.Error(w, "Either or Both NotificationPeriod or NotificationEvent shall be present", http.StatusBadRequest)
return
}
if subscription.NotificationEvent != nil {
if subscription.NotificationEvent.Trigger <= 0 && subscription.NotificationEvent.Trigger > 8 {
log.Error("Mandatory Notification Event Trigger not valid")
http.Error(w, "Mandatory Notification Event Trigger not valid", http.StatusBadRequest)
return
}
}
if subscription.StaId == nil {
log.Error("Mandatory StaId missing")
http.Error(w, "Mandatory StaId missing", http.StatusBadRequest)
return
} else {
for _, staId := range subscription.StaId {
if staId.MacId == "" {
log.Error("Mandatory StaId MacId missing")
http.Error(w, "Mandatory StaId MacId missing", http.StatusBadRequest)
return
}
}
Simon Pastor
committed
//registration
_ = rc.JSONSetEntry(baseKey+"subscriptions:"+subsIdStr, ".", convertStaDataRateSubscriptionToJson(&subscription))
registerStaDataRate(&subscription, subsIdStr)
case MEASUREMENT_REPORT_SUBSCRIPTION:
nextSubscriptionIdAvailable--
w.WriteHeader(http.StatusNotImplemented)
return
default:
nextSubscriptionIdAvailable--
w.WriteHeader(http.StatusBadRequest)
return
}
if err != nil {
log.Error(err.Error())
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusCreated)
fmt.Fprintf(w, string(jsonResponse))
}
func subscriptionsPUT(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
vars := mux.Vars(r)
subIdParamStr := vars["subscriptionId"]
var subscriptionCommon SubscriptionCommon
bodyBytes, _ := ioutil.ReadAll(r.Body)
err := json.Unmarshal(bodyBytes, &subscriptionCommon)
if err != nil {
log.Error(err.Error())
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
//extract common body part
subscriptionType := subscriptionCommon.SubscriptionType
//mandatory parameter
if subscriptionCommon.CallbackReference == "" {
log.Error("Mandatory CallbackReference parameter not present")
http.Error(w, "Mandatory CallbackReference parameter not present", http.StatusBadRequest)
return
}
link := subscriptionCommon.Links
if link == nil || link.Self == nil {
log.Error("Mandatory Link parameter not present")
http.Error(w, "Mandatory Link parameter not present", http.StatusBadRequest)
return
}
selfUrl := strings.Split(link.Self.Href, "/")
subsIdStr := selfUrl[len(selfUrl)-1]
if subsIdStr != subIdParamStr {
log.Error("SubscriptionId in endpoint and in body not matching")
http.Error(w, "SubscriptionId in endpoint and in body not matching", http.StatusBadRequest)
return
}
alreadyRegistered := false
var jsonResponse []byte
switch subscriptionType {
case ASSOC_STA_SUBSCRIPTION:
var subscription AssocStaSubscription
err = json.Unmarshal(bodyBytes, &subscription)
if err != nil {
log.Error(err.Error())
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
//make sure subscription is valid for mandatory parameters
if subscription.NotificationPeriod == 0 && subscription.NotificationEvent == nil {
log.Error("Either or Both NotificationPeriod or NotificationEvent shall be present")
http.Error(w, "Either or Both NotificationPeriod or NotificationEvent shall be present", http.StatusBadRequest)
return
}
if subscription.NotificationEvent != nil {
if subscription.NotificationEvent.Trigger <= 0 && subscription.NotificationEvent.Trigger > 8 {
log.Error("Mandatory Notification Event Trigger not valid")
http.Error(w, "Mandatory Notification Event Trigger not valid", http.StatusBadRequest)
return
}
}
if subscription.ApId == nil {
log.Error("Mandatory ApId missing")
http.Error(w, "Mandatory ApId missing", http.StatusBadRequest)
return
} else {
if subscription.ApId.Bssid == "" {
log.Error("Mandatory ApId Bssid missing")
http.Error(w, "Mandatory ApId Bssid missing", http.StatusBadRequest)
return
}
}
if isSubscriptionIdRegisteredAssocSta(subsIdStr) {
registerAssocSta(&subscription, subsIdStr)
_ = rc.JSONSetEntry(baseKey+"subscriptions:"+subsIdStr, ".", convertAssocStaSubscriptionToJson(&subscription))
alreadyRegistered = true
jsonResponse, err = json.Marshal(subscription)
}
Simon Pastor
committed
case STA_DATA_RATE_SUBSCRIPTION:
w.WriteHeader(http.StatusNotImplemented)
return
/* TBD when traffic is available
Simon Pastor
committed
var subscription StaDataRateSubscription
err = json.Unmarshal(bodyBytes, &subscription)
if err != nil {
log.Error(err.Error())
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
//make sure subscription is valid for mandatory parameters
if subscription.NotificationPeriod == 0 && subscription.NotificationEvent == nil {
log.Error("Either or Both NotificationPeriod or NotificationEvent shall be present")
http.Error(w, "Either or Both NotificationPeriod or NotificationEvent shall be present", http.StatusBadRequest)
return
}
if subscription.NotificationEvent != nil {
if subscription.NotificationEvent.Trigger <= 0 && subscription.NotificationEvent.Trigger > 8 {
log.Error("Mandatory Notification Event Trigger not valid")
http.Error(w, "Mandatory Notification Event Trigger not valid", http.StatusBadRequest)
return
}
}
if subscription.StaId == nil {
log.Error("Mandatory StaId missing")
http.Error(w, "Mandatory StaId missing", http.StatusBadRequest)
return
} else {
for _, staId := range subscription.StaId {
if staId.MacId == "" {
log.Error("Mandatory StaId MacId missing")
http.Error(w, "Mandatory StaId MacId missing", http.StatusBadRequest)
return
}
}
}
Simon Pastor
committed
//only support one subscription
if isSubscriptionIdRegisteredStaDataRate(subsIdStr) {
registerStaDataRate(&subscription, subsIdStr)
_ = rc.JSONSetEntry(baseKey+"subscriptions:"+subsIdStr, ".", convertStaDataRateSubscriptionToJson(&subscription))
alreadyRegistered = true
jsonResponse, err = json.Marshal(subscription)
}
case MEASUREMENT_REPORT_SUBSCRIPTION:
w.WriteHeader(http.StatusNotImplemented)
return
default:
w.WriteHeader(http.StatusBadRequest)
return
}
if alreadyRegistered {
if err != nil {
log.Error(err.Error())
http.Error(w, err.Error(), http.StatusInternalServerError)
return
w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, string(jsonResponse))
} else {
w.WriteHeader(http.StatusNotFound)
}
func delSubscription(keyPrefix string, subsId string, mutexTaken bool) error {
err := rc.JSONDelEntry(keyPrefix+":"+subsId, ".")
Simon Pastor
committed
deregisterStaDataRate(subsId, mutexTaken)
return err
}
func subscriptionsDELETE(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
vars := mux.Vars(r)
subIdParamStr := vars["subscriptionId"]
jsonRespDB, _ := rc.JSONGetEntry(baseKey+"subscriptions:"+subIdParamStr, ".")
if jsonRespDB == "" {
w.WriteHeader(http.StatusNotFound)
return
}
err := delSubscription(baseKey+"subscriptions", subIdParamStr, false)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
}
func populateApInfo(key string, jsonInfo string, response interface{}) error {
if resp == nil {
return errors.New("Response not defined")
}
// Retrieve user info from DB
var apInfoComplete ApInfoComplete
err := json.Unmarshal([]byte(jsonInfo), &apInfoComplete)
if err != nil {
return err
}
//timeStamp is optional, commenting the code
//seconds := time.Now().Unix()
//var timeStamp TimeStamp
//timeStamp.Seconds = int32(seconds)
var bssLoad BssLoad
bssLoad.StaCount = int32(len(apInfoComplete.StaMacIds))
bssLoad.ChannelUtilization = 0
bssLoad.AvailAdmCap = 0
apInfo.BssLoad = &bssLoad
var apLocation ApLocation
var geoLocation GeoLocation
if apInfoComplete.ApLocation.Geolocation != nil {
geoLocation.Lat = apInfoComplete.ApLocation.Geolocation.Lat
geoLocation.Long = apInfoComplete.ApLocation.Geolocation.Long
func populateApInfoCompleteList(key string, jsonInfo string, response interface{}) error {
resp := response.(*ApInfoCompleteResp)
// Retrieve ap info from DB
var apInfoComplete ApInfoComplete
err := json.Unmarshal([]byte(jsonInfo), &apInfoComplete)
if err != nil {
return err
}
resp.ApInfoCompleteList = append(resp.ApInfoCompleteList, apInfoComplete)
return nil
}
func apInfoGET(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
//initialise array to make sure Marshal processes it properly if it is empty
response.ApInfoList = make([]ApInfo, 0)
//loop through each AP
keyName := baseKey + "AP:*"
err := rc.ForEachJSONEntry(keyName, populateApInfo, &response)
if err != nil {
log.Error(err.Error())
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
if err != nil {
log.Error(err.Error())
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, string(jsonResponse))
}
Simon Pastor
committed
func populateStaData(key string, jsonInfo string, response interface{}) error {
if resp == nil {
return errors.New("Response not defined")
}
// Add STA info to reponse (ignore if not associated to a wifi AP)
Simon Pastor
committed
staData := convertJsonToStaData(jsonInfo)
if staData.StaInfo.ApAssociated != nil {
//timeStamp is optional, commenting the code
//seconds := time.Now().Unix()
//var timeStamp TimeStamp
//timeStamp.Seconds = int32(seconds)
//staInfo.TimeStamp = &timeStamp
//do not show an empty object in the response since 0 do not show up in the json
if staData.StaInfo.StaDataRate != nil {
if staData.StaInfo.StaDataRate.StaId == nil && staData.StaInfo.StaDataRate.StaLastDataDownlinkRate == 0 && staData.StaInfo.StaDataRate.StaLastDataUplinkRate == 0 {
staData.StaInfo.StaDataRate = nil
}
}
Simon Pastor
committed
resp.StaInfoList = append(resp.StaInfoList, *staData.StaInfo)
/*
func populateStaDataList(key string, jsonInfo string, response interface{}) error {
resp := response.(*StaDataList)
var staData StaData
err := json.Unmarshal([]byte(jsonInfo), &staData)
if err != nil {
return err
}
resp.StaDataList = append(resp.StaDataList, staData)
return nil
}
*/
func staInfoGET(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
//initialise array to make sure Marshal processes it properly if it is empty
response.StaInfoList = make([]StaInfo, 0)
// Loop through each STA
Simon Pastor
committed
err := rc.ForEachJSONEntry(keyName, populateStaData, &response)
if err != nil {
log.Error(err.Error())
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
jsonResponse, err := json.Marshal(response.StaInfoList)
if err != nil {
log.Error(err.Error())
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, string(jsonResponse))
}
func createSubscriptionLinkList(subType string) *SubscriptionLinkList {
subscriptionLinkList := new(SubscriptionLinkList)
link := new(SubscriptionLinkListLinks)
self := new(LinkType)
self.Href = hostUrl.String() + basePath + "subscriptions"
subscriptionLinkList.Links = link
//loop through all different types of subscription
mutex.Lock()
defer mutex.Unlock()
if subType == "" || subType == assocStaSubscriptionType {
//loop through assocSta map
for _, assocStaSubscriptionInfo := range assocStaSubscriptionInfoMap {
if assocStaSubscriptionInfo != nil {
Simon Pastor
committed
var subscription SubscriptionLinkListSubscription
subscription.Href = assocStaSubscriptionInfo.Subscription.Links.Self.Href
Simon Pastor
committed
subscription.SubscriptionType = ASSOC_STA_SUBSCRIPTION
subscriptionLinkList.Subscription = append(subscriptionLinkList.Subscription, subscription)
}
}
}
if subType == "" || subType == staDataRateSubscriptionType {
//loop through assocSta map
for _, staDataRateSubscriptionInfo := range staDataRateSubscriptionInfoMap {
if staDataRateSubscriptionInfo != nil {
Simon Pastor
committed
var subscription SubscriptionLinkListSubscription
subscription.Href = staDataRateSubscriptionInfo.Subscription.Links.Self.Href
Simon Pastor
committed
subscription.SubscriptionType = STA_DATA_RATE_SUBSCRIPTION
subscriptionLinkList.Subscription = append(subscriptionLinkList.Subscription, subscription)
Simon Pastor
committed
//no other maps to go through
return subscriptionLinkList
}
func subscriptionLinkListSubscriptionsGET(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
u, _ := url.Parse(r.URL.String())
log.Info("url: ", u.RequestURI())
q := u.Query()
subType := q.Get("subscription_type")
validQueryParams := []string{"subscription_type"}
validQueryParamValues := []string{"assoc_sta", "sta_data_rate", "measure_report"}
//look for all query parameters to reject if any invalid ones
found := false
for queryParam, values := range q {
found = false
for _, validQueryParam := range validQueryParams {
if queryParam == validQueryParam {
found = true
break
}
}
if !found {
log.Error("Query param not valid: ", queryParam)
w.WriteHeader(http.StatusBadRequest)
return
}
for _, validQueryParamValue := range validQueryParamValues {