int PeiStackFlow(pei *ppei, const pstack_f *stack) { if (ppei->stack != NULL) { ProtDelFrame(ppei->stack); } ppei->stack = ProtCopyFrame(stack, TRUE); return 0; }
int FlowDelete(int flow_id) { int ret; packet *pkt, *tmp; int i, cnt, base; int nxt_flw, grp_id; freel *ftmp; FlowTblLock(); /* check if flow is closed */ if (flow_tbl[flow_id].close == FALSE) { FlowTblUnlock(); LogPrintf(LV_ERROR, "It is tried to delete an open flow"); return -1; } /* close all flows son of this */ grp_id = flow_tbl[flow_id].grp_id; if (grp_id == -1) { if (flow_tbl[flow_id].son_num) { cnt = 0; base = flow_num; for (i=0; i<tbl_dim && cnt<base; i++) { if (flow_tbl[i].stack != NULL) { cnt++; if (flow_tbl[i].pfid == flow_id) { FlowClose(i); flow_tbl[i].pfid = -1; /* parent terminated */ } } } } } else if (GrpFlowNum(grp_id) == 1) { /* last flow of this group (the thread flow is terminated!) */ cnt = 0; base = flow_num; for (i=0; i<tbl_dim && cnt<base; i++) { if (flow_tbl[i].stack != NULL) { cnt++; if (flow_tbl[i].pgrp_id == grp_id) { FlowClose(i); flow_tbl[i].pfid = -1; /* parent terminated */ flow_tbl[i].pgrp_id = -1; /* parent terminated */ } } } } /* parent son counter */ if (flow_tbl[flow_id].pfid != -1) { flow_tbl[flow_tbl[flow_id].pfid].son_num--; } /* count the packet from protocol node to protocol dissector */ #ifdef XPL_PEDANTIC_STATISTICS if (flow_tbl[flow_id].proto_id != -1 && flow_tbl[flow_id].proto_id != flow_tbl[flow_id].pfid) { ProtPktFromNode(flow_tbl[flow_id].proto_id, flow_tbl[flow_id].pkt_tot); } #endif /* remove all (grp) rules created by this flow */ GrpRuleRmAll(flow_id); /* check if flow have packet in the queue */ pthread_mutex_lock(flow_tbl[flow_id].mux); if (flow_tbl[flow_id].pkt_num != 0) { if (flow_tbl[flow_id].elab == TRUE) { LogPrintf(LV_WARNING, "Deleted a flow with %d packet in queue", flow_tbl[flow_id].pkt_num); ProtStackFrmDisp(FlowStack(flow_id), TRUE); } pkt = flow_tbl[flow_id].fpkt; /* free all packet */ #ifndef XPL_CHECK_CODE PktFree(pkt); /* recursive */ pkt = NULL; #else while (pkt != NULL) { tmp = pkt; pkt = pkt->next; tmp->next = NULL; PktFree(tmp); flow_tbl[flow_id].pkt_num--; } if (flow_tbl[flow_id].pkt_num != 0) { LogPrintf(LV_OOPS, "bug in pkt flow counter"); } #endif } pthread_mutex_unlock(flow_tbl[flow_id].mux); /* thread */ if (flow_tbl[flow_id].elab == TRUE) { if (flow_tbl[flow_id].grp_id == -1) { ProtRunFlowDec(flow_tbl[flow_id].proto_id); FthreadChFlow(flow_tbl[flow_id].fthd_id, -1); } else { if (FthreadFlow(flow_tbl[flow_id].fthd_id) == flow_id) { GrpLock(flow_tbl[flow_id].grp_id); do { nxt_flw = GrpNext(flow_tbl[flow_id].grp_id); } while (nxt_flw != -1 && nxt_flw == flow_id); GrpUnlock(flow_tbl[flow_id].grp_id); #ifndef PROT_GRP_COUNT if (nxt_flw == -1) { ProtRunFlowDec(flow_tbl[flow_id].proto_id); } #else ProtRunFlowDec(flow_tbl[flow_id].proto_id); #endif FthreadChFlow(flow_tbl[flow_id].fthd_id, nxt_flw); } else { #ifdef PROT_GRP_COUNT ProtRunFlowDec(flow_tbl[flow_id].proto_id); #endif } } } /* remove from grp */ if (flow_tbl[flow_id].grp_id != -1) { ret = GrpRm(flow_tbl[flow_id].grp_id, flow_id); #ifdef XPL_CHECK_CODE if (ret == -1) { LogPrintf(LV_OOPS, "bug in Grp Add/Rm use"); } #endif } /* stack */ ProtDelFrame(flow_tbl[flow_id].stack); /* reset flow cel */ FlowElemInit(flow_tbl+flow_id, TRUE); ftmp = xmalloc(sizeof(freel)); ftmp->id = flow_id; ftmp->nxt = ffree; ffree = ftmp; ffree_num++; flow_num--; FlowTblUnlock(); return 0; }